`

XML认证教程,第 8 部分: SAX Parser [转]

阅读更多

 

http://www.ibm.com/developerworks/cn/xml/x-cert/part8/index.html

 

简介: 读取和操纵 XML 文件的标准方法是 DOM(“文档对象模型”)。遗憾的是,这种方法需要读取整个文件并将它存储到树结构中,因而效率不高、缓慢,并且会过度使用资源。

 

什么是 SAX

读取和操纵 XML 文件的标准方法是 DOM(“文档对象模型”)。遗憾的是,这种方法需要读取整个文件并将它存储到树结构中,因而效率不高、缓慢,并且会过度使用资源。

一种替代方法是使用 Simple API for XML 或 SAX。SAX 允许正在读取文档时处理该文档,这避免了在采取操作之前需要等待存储文档的所有内容。

SAX 是由 XML-DEV 邮件列表的成员开发的,Java 版本由 David Megginson 维护。他们的目的是提供一种更自然的方法来使用 XML,这种方法不会涉及到使用 DOM 的那种开销。

结果是基于事件的 API。解析器将事件(譬如,元素的开始或结束)发送给处理信息的事件处理程序。然后,应用程序自己可以处理数据。虽然原始文档保持不变,但 SAX 提供了操纵数据的方法,然后会将该方法导向另一个过程或文档。

对于 SAX,没有官方的标准;万维网(W3C)或其它官方组织不维护 SAX,但在 XML 社区中,它是一个事实上的标准。


SAX 处理是如何工作的

SAX 分析经过其的 XML 流,这非常象老式的自动收报机纸条。考虑以下 XML 代码片断:

<?xml version="1.0"?>
<samples>
<server>UNIX</server>
<monitor>color</monitor>
</samples>

一般情况下,SAX 处理器分析这段代码将生成以下事件:

Start document
Start element (samples)
Characters (white space)
Start element (server)
Characters (UNIX)
End element (server)
Characters (white space)
Start element (monitor)
Characters (color)
End element (monitor)
Characters (white space)
End element (samples)

SAX API 允许开发者捕获这些事件,并对它们进行操作。

SAX 处理涉及以下几步:

  1. 创建事件处理程序。
  2. 创建 SAX 解析器。
  3. 将事件处理程序分配给解析器。
  4. 对文档进行解析,将每个事件发送给处理程序。

在SAX与DOM之间,如何选择

选择 DOM 还是 SAX,这取决于几个因素:

  1. 应用程序的目的:如果必须对数据进行更改,并且作为 XML 将它输出,则在大多数情况下,使用 DOM。与使用 XSL 转换来完成的简单结构更改不一样,如果是对数据本身进行更改,则尤其应该使用 DOM。
  2. 数据的数量:对于大文件,SAX 是更好的选择。
  3. 将如何使用数据:如果实际上只使用一小部分数据,则使用 SAX 将数据抽取到应用程序中,这种方法更好些。另一方面,如果知道将需要向后引用已经处理过的信息,则 SAX 可能不是正确的选择。
  4. 需要速度:通常,SAX 实现比 DOM 实现快。

记住 SAX 和 DOM 不是互斥的,这一点很重要。可以使用 DOM 来创建事件的 SAX 流,可以使用 SAX 来创建 DOM 树。事实上,大多数解析器实际常常使用 SAX 来创建 DOM 树!


使用 JAXP 来创建解析器

接下来我们来看一下JAXP的SAX Parser是怎么样工作的。

首先声明 XMLReader xmlReader。然后使用 SAXParserFactory 来创建 SAXParser。正是 SAXParser 给您了 XMLReader。

import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.XMLReader;
public class SurveyReader extends DefaultHandler
{
public SurveyReader() {
}
public static void main (String args[]) {
XMLReader xmlReader = null;
try {
SAXParserFactory spfactory =
SAXParserFactory.newInstance();
spfactory.setValidating(false);	//设置验证选项,
如果您的XML文件是有效文档的话,
就不用验证.这将提高处理速度
SAXParser saxParser = spfactory.newSAXParser();
xmlReader = saxParser.getXMLReader();
} catch (Exception e) {
System.err.println(e);
System.exit(1);
}
}
}

设置内容处理程序

一旦创建了解析器,则需要将 SurveyReader 设置为内容处理程序,以便于其接收事件。

xmlReader 的 setContentHandler() 方法完成这项工作。

...
xmlReader = saxParser.getXMLReader();
xmlReader.setContentHandler(new SurveyReader());
} catch (Exception e) {
...

当然,对于内容处理程序,这不是唯一的选项。


解析 InputSource

为了对文件进行实际地解析,需要 InputSource。这个 SAX 类封装了所有将要处理的数据,所以不必担心它来自哪里。

现在,准备对文件进行实际解析。应用程序将封装在 InputSource 中的文件传递给 parse(),然后应用程序会继续运行。

...
import org.xml.sax.InputSource;
...
xmlReader = saxParser.getXMLReader();
xmlReader.setContentHandler(new SurveyReader());
InputSource source = new InputSource("surveys.xml");
xmlReader.parse(source);
} catch (Exception e) {
...

可以编译和运行该程序,但这时应该什么也没有发生,因为应用程序还没有定义任何事件。


创建 ErrorHandler

当然总会有可能在试图进行解析时,数据有问题。在这样的情况下,有一个处理程序来处理错误和内容将是有帮助的。

就如同创建内容处理程序一样,可以创建出错处理程序。通常,将作为 ErrorHandler 的单独实例来创建它,但为了简化该示例,出错处理正是包含在 SurveyResults 中。由于该类继承了 DefaultHandler 且没有扩展 ContentHandler,所以这种双重用法是可能的。

需要关注的事件有三个:警告、错误和致命错误。

...
import org.xml.sax.SAXParseException;
public class SurveyReader extends DefaultHandler
{
public SurveyReader() {
}
public void error (SAXParseException e) {
System.out.println("Error parsing the file: "+e.getMessage());
}
public void warning (SAXParseException e) {
System.out.println("Problem parsing the file: "+e.getMessage());
}
public void fatalError (SAXParseException e) {
System.out.println("Error parsing the file: "+e.getMessage());
System.out.println("Cannot continue.");
System.exit(1);
}
}
....
xmlReader.setContentHandler(new SurveyReader());
xmlReader.setErrorHandler(new SurveyReader());
//设置 ErrorHandler
InputSource source = new InputSource("surveys.xml");
....
public static void main (String args[]) {
...

SAX 事件

以下事件是常用的;它们都在 org.xml.sax 包的 HandlerBase 类中定义。

  1. startDocument 表示文档开始。
  2. endDocument 表示文档结束。
  3. startElement 表示元素开始。当一对标记中的起始标记中的所有内容被处理后,解析器 激发此事件。包括了标记名和其属性。
  4. endElement 表示元素结束。
  5. characters 包含字符数据,类似于 DOM 的一个 Text 节点。

还有更多的 SAX 事件:

  1. ignorableWhitespace 此事件类似于我们前面所讨论的无用 DOM 节点。它与 character 事件的区别,好处是:如果您不需要空格符,您可以通过忽略这个事件来忽略所有的空格符。
  2. warning、error 和 fatalError 这三个事件表示了解析错误。您可根据需要来响应它们。
  3. setDocumentLocator 这个事件允许您存储一个 SAX 的 Locator 对象。Locator 对象可以用来找出在文档中确切发生事件的地方。

<!-- CMA ID: 162355 --><!-- Site ID: 10 --><!-- XSLT stylesheet used to transform this file: dw-article-6.0-beta.xsl -->

分享到:
评论

相关推荐

    XML认证教程,第 9 部分:DOM Parser.rar-综合文档

    在本教程中,我们将深入探讨XML认证的一个关键部分——DOM(Document Object Model)解析器。 DOM解析器是处理XML文档的一种方法,它将XML文件加载到内存中并构建一个树形结构,称为DOM树。这个树形结构允许程序...

    XML_DOM_SAX.rar_ XML_DOM_SAX_c# sax_dom解析xml_xml parser csharp_x

    DOM解析器的优点是操作灵活,可以随时访问任何部分的文档,但缺点是占用内存大,对于大型XML文件,可能会导致性能问题。在C#中,`System.Xml`命名空间提供了对DOM的支持,如`XmlDocument`类用于加载和操作XML文档。 ...

    DOMParser解析xml

    对于这种情况,可以考虑使用SAX(Simple API for XML)或StAX(Streaming API for XML)等基于事件的解析器,它们不需要一次性加载整个文档到内存。 6. **应用场景**: - 数据交换:XML常用于跨平台、跨语言的数据...

    XMLParser iphone

    XMLParser遵循SAX(Simple API for XML)模型,即事件驱动的解析方式。在解析过程中,XMLParser会逐行读取XML文档,每当遇到一个开始标签、结束标签、文本节点等元素时,就会触发相应的代理方法,开发者需要在这些...

    XML-java.rar_XML SAX_sax_sax xml_sax 解析 xml_xml using dom

    Java作为一种强大的编程语言,提供了多种解析XML文档的方法,其中包括DOM(Document Object Model)和SAX(Simple API for XML)。本压缩包文件“XML-java.rar”包含了关于使用Java解析XML的实例,特别强调了SAX解析...

    XMLparser.rar

    2. SAX解析器:SAX是一种事件驱动的解析器,它逐行读取XML文档,遇到每个元素、属性或其他结构时触发相应的事件。这种方式节省了内存,但需要编写更多的代码来处理这些事件。 在VC++中,实现XML解析有多种库可以...

    XML认证资料 5

    8. **SAX (Simple API for XML)**:SAX是一种事件驱动的XML解析器,适用于处理大型XML文档。与DOM不同,SAX不将整个文档加载到内存中,而是逐个处理元素,节省内存资源。 9. **XML与Web服务**:XML是构建Web服务的...

    android-xml文件解析教程

    总结,XML文件解析是Android开发中不可或缺的一部分,了解并熟练掌握DOM、SAX和PullParser等解析方式,能够帮助开发者更高效地处理XML数据,优化应用性能。同时,熟悉Android框架对资源文件的解析机制,能更好地利用...

    SAX2方法读取XML文件

    SAX2是SAX的第二版本,它在SAX的基础上进行了一些改进和扩展。 在C++中,Xerces-C++库是实现SAX解析器的一个强大工具。Xerces-C++是Apache软件基金会开发的一个开源项目,提供了XML标准的全面实现,包括DOM...

    XML文件c语言 dom和sax模式解析

    在C语言环境中,处理XML文件时,通常有两种主要的解析模式:DOM(Document Object Model)和SAX(Simple API for XML)。 **DOM解析模式**: DOM解析器将整个XML文档加载到内存中,创建一个树形结构,即文档对象...

    sax解析xml实例

    在Java中,我们通常使用`org.xml.sax.Parser`或`javax.xml.parsers.SAXParser`接口,通过`SAXParserFactory`工厂类来创建解析器实例。 2. **事件驱动模型**:SAX解析基于事件驱动,当解析器读取XML文档时,会触发一...

    java_xml.rar_java xml_sax_xml_xml ja_操作 xml

    Java XML处理是Java开发中的重要组成部分,特别是在处理大型或结构复杂的XML文档时,SAX(Simple API for XML)和DOM(Document Object Model)是两种常用的技术。本篇将深入探讨这两种解析器的工作原理以及如何在...

    ParserXml(绝对可以用)

    在解析XML文档时,ParserXml的SAX解析器会触发一系列事件,如开始元素、结束元素、字符数据等,应用程序可以通过注册事件处理器来响应这些事件。这种方式不将整个文档加载到内存,而是按需读取,适合处理大型XML文件...

    xml parser

    对于从本地解析XML,开发者通常会使用编程语言提供的XML解析库,如Java的JAXB或DOM4J,Python的ElementTree,或者JavaScript的DOMParser。这些库提供了方便的API来读取、遍历和修改XML文档。 当涉及到从服务器端...

    Unity3D中Mono.Xml和XmlParser的使用

    本教程将深入探讨如何在Unity3D中利用 Mono.Xml 和 XmlParser 类库来解析和操作XML文件。 Mono.Xml 是Mono框架的一部分,它提供了对XML文档的一系列处理工具,包括解析、创建和操作XML节点。这个库包含了...

    使用SAX解析xml文件

    SAX(Simple API for XML)是XML解析的一种方式,它采用事件驱动模型,以流式处理XML文档,适合处理大体积的XML文件。 在Java中,SAX解析XML文件的主要优点包括: 1. **内存效率**:SAX不将整个XML文档加载到内存中...

    Servlet利用SAX解析XML文档

    SAX解析器不创建整个XML文档树,而是当遇到XML文档的各个部分(如元素、属性、文本等)时,触发相应的事件回调函数。开发者通过实现SAX解析器的ContentHandler接口,定义这些回调函数来处理这些事件。 以下是使用...

    sax解析xml

    SAX(Simple API for XML)是XML解析的一种方法,它采用事件驱动的方式处理XML文档,对内存占用较少,适合处理大型XML文件。 在Java中,SAX解析器遵循XML规范,当解析XML文档时,会触发一系列的事件,如开始文档、...

    xml sax解析

    SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式处理XML文档,相较于DOM(Document Object Model)解析器,SAX解析更加轻量级和高效。 SAX解析的核心思想是读取XML文档时,每当遇到一个元素、...

Global site tag (gtag.js) - Google Analytics