DOM:
解析时,先将节点全部装载到内存里,解析成一棵树,再进行添加节点、删除节点、取出节点内容等操作;
优点:这样操作起来比较方便;
缺点:解析的XML文档比较大时,比较费时;
SAX:
扫描一行,解析一行;
优点:解析文档的任意时刻停止解析;
缺点:操作起来复杂、添加或删除内容比较困难;
1、什么是SAX
SAX,全称Simple API for XML, 既是指一种接口,也是指一个软件包。
作为接口,SAX是事件驱动型XML解析的一个标准接口。
2、SAX基本原理
SAX的工作原理简单的说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档结束等地方时,
通知事件处理函数,由事件处理函数做相应动作,然后继续同样地扫描,直至文档结束。
大多数SAX实现都会产生以下类型的事件:
1、在文档的开始和结束时触发文档处理事件;
2、在文档内每一XML元素接受解析的前后触发元素事件;
3、任何元数据通常都由单独的事件交付;
4、在处理文档的DTD或Schema时产生DTD或Schema事件;
5、产生错误事件时来通知主机应用程序解析错误;
3、SAX常用接口
ContentHandler接口
ContentHandler是Java类包中一个特殊的SAX接口,位于org.xml.sax包中。
该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,
比如文档的开头和结束、元素开头和结束、以及元素中的字符数据等事件。
当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。
ContentHandler接口的方法有以下几种:
void startDocument()
void endDocument()
void startElement(String uri, String localName, String qName, Attributes atts)
void endElement(String uri, String localName, String qName)
void characters(char[] ch, int start, int length)
4、SAX解析
解析文档的过程:
例子:
<doc>
<para>Hello,world!</para>
</doc>
例子的解析过程(每次产生一个事件都会触发相应的函数):
start document
start element:doc
start element:para
characters:Hello,world!
end element:para
end element:doc
end document
在解析文档的过程中会产生如下一系列事件:
1、创建事件处理程序;
2、创建SAX解析器;
3、将事件处理程序分配给解析器;
4、对文档进行解析,将每个事件发送给处理程序;
实例:xml
mypack.utils.FileUtils.java
mypack.utils.HttpDownloader.java
mypack.xml.MyContentHandler.java
mypack.xml.XMLActivity.java
XMLActivity.java
String resultStr = httpDownloader.download("...");
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader reader = factory.newSAXParser().getXMLReader();
reader.setContentHandler(new MyContentHandler());
reader.parse(new InputSource(new StringReader(resultStr))); // StringReader : 以流的方式处理字符串
解析时,先将节点全部装载到内存里,解析成一棵树,再进行添加节点、删除节点、取出节点内容等操作;
优点:这样操作起来比较方便;
缺点:解析的XML文档比较大时,比较费时;
SAX:
扫描一行,解析一行;
优点:解析文档的任意时刻停止解析;
缺点:操作起来复杂、添加或删除内容比较困难;
1、什么是SAX
SAX,全称Simple API for XML, 既是指一种接口,也是指一个软件包。
作为接口,SAX是事件驱动型XML解析的一个标准接口。
2、SAX基本原理
SAX的工作原理简单的说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档结束等地方时,
通知事件处理函数,由事件处理函数做相应动作,然后继续同样地扫描,直至文档结束。
大多数SAX实现都会产生以下类型的事件:
1、在文档的开始和结束时触发文档处理事件;
2、在文档内每一XML元素接受解析的前后触发元素事件;
3、任何元数据通常都由单独的事件交付;
4、在处理文档的DTD或Schema时产生DTD或Schema事件;
5、产生错误事件时来通知主机应用程序解析错误;
3、SAX常用接口
ContentHandler接口
ContentHandler是Java类包中一个特殊的SAX接口,位于org.xml.sax包中。
该接口封装了一些对事件处理的方法,当XML解析器开始解析XML输入文档时,它会遇到某些特殊的事件,
比如文档的开头和结束、元素开头和结束、以及元素中的字符数据等事件。
当遇到这些事件时,XML解析器会调用ContentHandler接口中相应的方法来响应该事件。
ContentHandler接口的方法有以下几种:
void startDocument()
void endDocument()
void startElement(String uri, String localName, String qName, Attributes atts)
void endElement(String uri, String localName, String qName)
void characters(char[] ch, int start, int length)
4、SAX解析
解析文档的过程:
例子:
<doc>
<para>Hello,world!</para>
</doc>
例子的解析过程(每次产生一个事件都会触发相应的函数):
start document
start element:doc
start element:para
characters:Hello,world!
end element:para
end element:doc
end document
在解析文档的过程中会产生如下一系列事件:
1、创建事件处理程序;
2、创建SAX解析器;
3、将事件处理程序分配给解析器;
4、对文档进行解析,将每个事件发送给处理程序;
实例:xml
mypack.utils.FileUtils.java
mypack.utils.HttpDownloader.java
mypack.xml.MyContentHandler.java
mypack.xml.XMLActivity.java
XMLActivity.java
String resultStr = httpDownloader.download("...");
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader reader = factory.newSAXParser().getXMLReader();
reader.setContentHandler(new MyContentHandler());
reader.parse(new InputSource(new StringReader(resultStr))); // StringReader : 以流的方式处理字符串