SAX与DOM的比较
每一个进行XML开发的编程人员都知道DOM,那为什么在有了DOM这个功能强大的文档对象模型之后,我们还需要SAX?这就要从它们根本不同的实现方法上来分析。DOM解析器是通过将XML文档解析成树状模型并将其放入内存来完成解析工作的,而后对文档的操作都是在这个树状模型上完成的。这个在内存中的文档树将是文档实际大小的几倍。这样做的好处是结构清除、操作方便,而带来的麻烦就是极其耗费系统资源。而SAX正好克服了DOM的缺点。SAX解析器的处理过程是通读整个文档,根据文档内容产生事件,而把对这些事件的处理交由事件处理器处理。SAX不需要在内存中保存整个文档,它对系统资源的节省是显而易见的。这样在一些需要处理大型XML文档和性能要求比较高的场合就要用SAX了。
下面的表格列出了SAX和DOM在一些方面的对照:
SAX | DOM |
顺序读入文档并产生相应事件,可以处理任何大小的XML文档 | 在内存中创建文档树,不适于处理大型XML文档。 |
只能对文档按顺序解析一遍,不支持对文档的随意访问。 | 可以随意访问文档树的任何部分,没有次数限制。 |
只能读取XML文档内容,而不能修改 | 可以随意修改文档树,从而修改XML文档。 |
开发上比较复杂,需要自己来实现事件处理器。 | 易于理解,易于开发。 |
对开发人员而言更灵活,可以用SAX创建自己的XML对象模型。 | 已经在DOM基础之上创建好了文档树。 |
通过对SAX和DOM的分析,它们各有自己的不同应用领域:
SAX适于处理下面的问题:
对大型文档进行处理。
只需要文档的部分内容,或者只需要从文档中得到特定信息。
想创建自己的对象模型的时候。
DOM适于处理下面的问题:
需要对文档进行修改
需要随机对文档进行访问,例如XSLT解析器。
一些值得注意的问题
首先是有关元素内容的问题,在SAX API定义中元素内容可以在一次事件(由characters()方法处理)中返回,也可以在多次事件中返回,这样我们就应该考虑不能一次得到所有内容数据的情况。一般的解决办法是定义一个StringBuffer由它来保存内容数据,在元素结束或者新元素开始的时候清空这个StringBuffer从而可以保存新的内容数据。请参考上面的相应的源代码。
还有在SAX API中特意提到从 characters(char[] ch,int start,int length)方法中提取数据时一定不要从返回的字符数组范围之外读取,这一点我们也要切记。
另一个值得注意的问题是,在 startElement()方法中返回的Attributes属性列表中的属性顺序并没有被特意规定,在不同的SAX实现中也各不相同。所以我们在编写程序时不要把属性顺序想成一定的。
使用过滤器
在SAX API中还提供了一个过滤器接口org.xml.sax.XMLFilter,以及对它的缺省实现org.xml.sax.helper.XMLFilterImpl。使用它们可以很容易的开发出复杂的SAX应用。这里要先介绍一下过滤器设计模式。这个设计模式很好理解,就像一个净化水的过程。自然界中的水流过一个个的过滤器得到最后的饮用水。这些过滤器,有的是清除水中的泥沙,有的是杀灭水中的细菌,总之不同的过滤器完成不同的任务。在应用开发中,我们让被改造的对象(这里是事件流)通过这些过滤器对象从而得到改造后符合要求的对象。这样,在过滤器的帮助之下,我们可以非常方便的在每个过滤器中实现一个特定功能,从而创建结构复杂的应用程序。在应用程序中你可以构造任意多个过滤器,将它们串接起来完成任务。
在SAX API中org.xml.sax.XMLFilter接口继承了org.xml.sax.XMLReader接口。它与XMLReader不同的是它不像XMLReader那样通过解析文档来获取事件,而是从其他XMLReader中获取事件,当然这也包括从其他的XMLFilter中获取事件。
XmlFilter是一个非常好用的方法,以后在工作中尽量使用。下面是我实现的例子:
package test.corejava.xml;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLFilter;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
public class MySAXApp {
public static void main(String[] args) throws ParserConfigurationException {
try {
// 初始化reader
XMLReader reader = XMLReaderFactory
.createXMLReader("org.apache.xerces.parsers.SAXParser");
// 初始化过滤器
XMLFilter myFilter = new MyFilter(reader);
// 创建DefaultHandler的实例
// DefaultHandler defaultHandler = new MyDefaultHandler();
XMLFilter myFilter2 = new MyFilter2(myFilter);
// 为过滤后的事件流设置ContentHandler
myFilter2.setContentHandler(new DefaultHandler());
// 为过滤后的事件流设置ErrorHandler
myFilter2.setErrorHandler(new DefaultHandler());
// 开始解析文档
myFilter2.parse(new InputSource(MySAXApp.class
.getResourceAsStream("book.xml")));
} catch (IOException e) {
System.out.println("读入文档时错: " + e.getMessage());
} catch (SAXException e) {
System.out.println("解析文档时错: " + e.getMessage());
}
}
}
可以利用Filter去取自己想要的元素!
原文出处:
http://www.ibm.com/developerworks/cn/xml/x-saxhandle/
另外几个不错的Jaxp的基础知识介绍:
http://www.ibm.com/developerworks/cn/xml/x-jaxp/
http://www.ibm.com/developerworks/cn/xml/x-jaxp2/
http://www.w3school.com.cn/xpath/xpath_syntax.asp
http://hi.baidu.com/peiwenlin/blog/item/ac6baa509adaa16e8535241c.html
http://www.xml.com/pub/a/2005/07/06/jaxp.html
分享到:
相关推荐
### SAX与DOM之间的区别 #### 一、概述 在处理XML文档时,开发人员面临着一个基本的选择:使用DOM(文档对象模型)还是SAX(简单的API for XML)。这两种方法各有优势,选择哪一种取决于具体的应用场景和技术需求...
DOM(Document Object Model)解析和SAX(Simple API for XML)解析是两种常见的XML文档解析方式,它们在处理XML数据时有不同的策略和优缺点。 DOM解析是一种基于树型结构的XML解析方法。当一个XML文档被DOM解析器...
【dom4j基础入门文档(SAX,DOM,XPATH)】 dom4j是一个流行的Java库,专门用于处理XML文档。相较于W3C DOM API,dom4j的优势在于它内置了本地XPath支持,使得XML文档的查询和操作更为简便。本文将深入介绍dom4j的...
DOM(Document Object Model)和SAX(Simple API for XML)是两种主要的XML解析方法。在Java编程中,dom4j库提供了对这两种解析方式的支持。 **DOM解析**: DOM解析器将整个XML文档加载到内存中,创建一个树形结构...
XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,广泛应用于Web应用程序、数据交换和配置文件...对于开发者来说,理解和掌握SAX与DOM的差异和应用场景,能更有效地处理XML文档,提升开发效率。
### SAX与DOM解析技术对比及应用场景 #### 一、引言 在XML开发过程中,DOM (Document Object Model) 和 SAX (Simple API for XML) 是两种常见的解析方式。这两种方法各有优势,适用于不同的场景。本文旨在深入探讨...
为了处理XML文档,有三种主要的解析方式:DOM、SAX和DOM4J。每种方法都有其特点和适用场景,下面将详细介绍这三种解析方式。 1. DOM(Document Object Model) DOM解析器将整个XML文档加载到内存中,构建一个树形...
本文将深入探讨DOM、SAX、JDom和dom4j四种流行的Java XML解析器,以及它们在处理XML文档时的特点和用法。 1. DOM(Document Object Model) DOM是W3C推荐的一种解析XML的标准方法。它将XML文档表示为一个树形结构,...
本篇文章将探讨四种处理XML的Java库:DOM、JDOM、SAX和DOM4J,分析它们的原理、性能特点以及适用场景。 首先,我们来了解DOM(Document Object Model)。DOM是W3C组织定义的一种API,它将XML文档解析为一个树形结构...
对于xml&dom&sax&dom4j 文件解析的代码总结
与DOM不同,SAX是一种事件驱动的解析器,它逐行读取XML文件,当遇到元素、属性等时触发相应的事件回调。SAX解析器不会将整个XML文档加载到内存,而是按需处理,节省了内存,适合处理大型或流式XML数据。然而,由于其...
在Java中,解析XML有多种方法,主要包括DOM、SAX和DOM4J。下面将详细介绍这三种解析方式及其对应的jar包。 1. DOM (Document Object Model) DOM是一种基于树形结构的XML解析方法,它将整个XML文档加载到内存中,...
在处理XML文件时,SAX(Simple API for XML)和DOM(Document Object Model)是两种主要的解析方法,它们各自有其特点和适用场景。 **SAX解析**: SAX是一种基于事件驱动的解析方式。当XML文件被解析时,解析器会...
Java提供了多种解析XML的API,包括SAX(Simple API for XML)、DOM(Document Object Model)以及DOM4J。下面我们将详细探讨这些解析方式及其在实际开发中的应用。 1. SAX解析器: SAX是一种基于事件驱动的解析器,...
与DOM类似,JDOM也创建一个文档对象模型,但它的设计更简洁,易于使用。相比DOM,JDOM的性能稍好,因为它减少了对象创建和内存使用,但对大型XML文件依然存在内存压力。 4. DOM4J DOM4J是一个灵活的Java XML API,...
常见的 XML 解析器有 DOM、SAX、JDOM 和 DOM4J 等。每种解析器都有其特点和优缺,选择合适的解析器对应用程序的性能和开发效率有很大影响。 1. DOM 解析器 DOM(Document Object Model)是 W3C 官方标准,用于表示...
4. `jaxen-1.1.1.jar`:Jaxen是一个独立于任何特定XML解析器的XPath实现,它可以与DOM、DOM4J、JDOM等多种XML处理库配合使用,提供XPath查询功能。 使用这些库,开发者可以在Java应用中方便地处理XML文档。例如,...
Pull解析器是Android平台常用的XML解析方式,其原理与SAX类似,但API更简洁。在Java 1.6及以上版本中,提供了`XMLPullParser`类。使用Pull解析器,你需要通过`XMLPullParserFactory`创建一个`XMLPullParser`对象,...
与标准DOM相比,JDOM的性能通常更好,且更容易使用。然而,JDOM同样需要占用大量内存,不适合处理大规模的XML数据。 4. DOM4J(增强的DOM和SAX解析器) DOM4J结合了DOM和SAX的优点,既可以使用DOM接口操作XML,又...