SAX解析XML的工作原理??? 很急。。。 我想了解的是关于SAX是怎么解析XML文件的,在网上查了好多资料,就是说SAX是事件驱动的,只要访问了对应的元素就会调用相应的startElement等方法, 而且我也写了几个prototype,也得可以解析。 但是我想知道的是SAX解析XML最本质的原理,就是它是怎么访问XML文件的,是怎么样找到相应的节点元素的,为什么一访问节点元素就会调相应的方法?? 我也看了JAVA源码,但是看的不是很懂,希望哪位能告诉我下,谢谢!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 为什么一访问节点元素就会调相应的方法??因为这就是SAX的原理。其实不是一访问节点元素就会调用相应的方法,SAX遍历XML文档,对碰到的每一个元素,尝试调用一套对应的方法(如果有指定的话)。是我们通过编写处理特定事件的方法来在这个框架下处理XML中的数据。 谢谢,其实我想知道的是SAX怎么遍历XML文档的,它怎么会认识XML里面的元素,它遍历XML,是逐行读?还是每个字符读?还是其他的读法?我是想弄清解析XML最本质的原理,假如SAX没有用那个框架的话,它应该是怎么解析XML的呢??今天我公司leader让我搞清这个问题,我找了一天,找了一些东西,但leader都说不是他要的最本质的东西,唉。。 1.SAX (Simple API for XML):一行一行的读,触发事件。(这个XML文档没有加载到内存中)2.DOM (Document Object Model):将XML文档全部读到内存中,形成一个DOM树, 如果我要去获得该XML文档的某个属性数据的话,直接找到节点,从而获得值。 请问SAX是怎么实现一行一行读的呢??? 我只知道它是一行一行读的,但是不知道是怎么实现的??JDK源码看没太懂,谢谢 SAX解析XML的过程:---------------------------一行一行的读,触发事件。(这个XML文档没有加载到内存中)第一步:当遇到元素的开始标记的时候执行startElement方法第二步:接着执行characters方法第三步:当遇到元素的结束标记的时候执行endElement方法(在这要特别注意......因为下面方法又会把value设为空)第四步:接着执行characters方法第五步:......循环......直接扫描到文件结束import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class SAXCounterHandler extends DefaultHandler { private int elements; public SAXCounterHandler() { super(); } // handle a start-of-document event解析XML文档开始 public void startDocument() throws SAXException { System.out.println("Starting to parse..."); } // handle an end-of-document event解析XML文档结束 public void endDocument() throws SAXException { System.out.println("All done!"); System.out.println("There were " + elements + "elements"); } // handle a start-of-element event遇到开始标记执行 public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { System.out.println("starting element (" + name + ")"); if ("".equals(uri)) { } else { System.out.println("名称空间namespace:" + uri); } System.out.println("number of attribates:" + attributes.getLength()); } // handle an end-of-element event遇到结束标记执行 public void endElement(String uri, String localName, String name) throws SAXException { elements++; System.out.println("ending elment (" + name + ")"); } // handle a characters event文本信息? public void characters(char[] ch, int start, int length) throws SAXException { System.out.println("CDATA:" + length + "characters"); // 取内容的意思......好好体会!!!!!!相当重要!!!!!! System.err.println(new String(ch).toString().substring(start, start + length).trim()); }}这些代码只供参考... 你好,这些代码我都看过了, 上面的代码就是说明了 SAX遇到相应的节点元素就会触发相应的方法,但是并没有体现是一行一行读的啊? 我想知道SAX是具体怎么实现一行一行读的?为什么遇到相应的节点元素就会触发相应的事件?SAX是怎么认识XML中这些节点元素的,例如<element></element>,是通过"<",">"来识别的么?? 期待你的答案,谢谢!!! 因为SAX解析是基于事件回调机制因为我也没看过SAX解析的源程序,就我个人的观点,我觉得这个应该是正则表达式的作用简单的说就是当SAX读取一个字符串,然后一个字符一个字符的解析,如果是读进来的字符是"<"那它就会继续读下去,然后一直读到">"结束,然后再通知SAX解析器做相应的处理 sax只是一种判断字节符,只认字节与属性 感觉sax解析xml很好!但是还是不太会用!学习! 应该是用正则匹配到< 和> 但是在SAX的源代码里看不到怎么解析的,应该在哪里可以看到呢? 1号店网站系统是什么? 难道写JAVA+SQL SERVER存储过程时不能用一个变量吗, java swing的问题 有关applet背景的问题,后面添加的button及JLabel都被盖住了。要怎样做? 学java,要学什么,我来告诉你 菜鸟请大家来帮忙做个面试题! 求一个 匹配 (任意符号+任意数字+任意字母)1个或者多个的正则表达式 大家好!!高分请教各位,Applet的CGI通信能否打开新网页 监听不起作用,神马情况? bit-wise reverse 奇怪的println 如何在xp sp3 dos命令在输入中文
SAX遍历XML文档,对碰到的每一个元素,尝试调用一套对应的方法(如果有指定的话)。是我们通过编写处理特定事件的方法来在这个框架下处理XML中的数据。
我是想弄清解析XML最本质的原理,假如SAX没有用那个框架的话,它应该是怎么解析XML的呢??
今天我公司leader让我搞清这个问题,我找了一天,找了一些东西,但leader都说不是他要的最本质的东西,唉。。
2.DOM (Document Object Model):将XML文档全部读到内存中,形成一个DOM树,
如果我要去获得该XML文档的某个属性数据的话,直接找到节点,从而获得值。
第一步:当遇到元素的开始标记的时候执行startElement方法
第二步:接着执行characters方法
第三步:当遇到元素的结束标记的时候执行endElement方法(在这要特别注意......因为下面方法又会把value设为空)
第四步:接着执行characters方法
第五步:......循环......直接扫描到文件结束import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;public class SAXCounterHandler extends DefaultHandler {
private int elements; public SAXCounterHandler() {
super();
} // handle a start-of-document event解析XML文档开始
public void startDocument() throws SAXException {
System.out.println("Starting to parse...");
} // handle an end-of-document event解析XML文档结束
public void endDocument() throws SAXException {
System.out.println("All done!");
System.out.println("There were " + elements + "elements");
} // handle a start-of-element event遇到开始标记执行
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
System.out.println("starting element (" + name + ")");
if ("".equals(uri)) { } else {
System.out.println("名称空间namespace:" + uri);
}
System.out.println("number of attribates:" + attributes.getLength());
} // handle an end-of-element event遇到结束标记执行
public void endElement(String uri, String localName, String name)
throws SAXException {
elements++;
System.out.println("ending elment (" + name + ")");
} // handle a characters event文本信息?
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println("CDATA:" + length + "characters"); // 取内容的意思......好好体会!!!!!!相当重要!!!!!!
System.err.println(new String(ch).toString().substring(start,
start + length).trim());
}
}这些代码只供参考...
因为我也没看过SAX解析的源程序,就我个人的观点,我觉得这个应该是正则表达式的作用
简单的说就是当SAX读取一个字符串,然后一个字符一个字符的解析,如果是读进来的字符是"<"那它就会继续读下去,然后一直读到">"结束,然后再通知SAX解析器做相应的处理