Xerces 简明教程

SAX Parser - Overview

SAX(XML 简单 API)是基于事件的 XML 文档解析器。与 DOM 解析器不同,SAX 解析器不创建解析树。SAX 是一个 XML 流传输接口,这意味着使用 SAX 的应用程序会针对正在处理的 XML 文档接收事件通知,包括元素、属性以及从文档顶部开始、以 ROOT 元素的结束为结尾的顺序排列的时间。

  1. 从上到下读取 XML 文档,识别构成良好形成的 XML 文档的标记。

  2. 标记按其出现在文档中的顺序进行处理。

  3. 向应用程序报告解析器在遇到解析标记时发现的标记的类型。

  4. 应用程序提供了一个“事件”处理程序,该处理程序必须在解析器中注册。

  5. 随着标记被识别,带有相关信息的回调方法将被调用。

When to use?

以下情况应使用 SAX 解析器 -

  1. 你可以从上到下线性处理 XML 文档。

  2. 文档没有深度嵌套。

  3. 您正在处理一个非常大的 XML 文档,它对应的 DOM 树会占用大量的内存。典型的 DOM 实现使用 10 个字节的内存表示一个字节的 XML。

  4. 需要解决的问题仅涉及 XML 文档的一部分。

  5. 数据一旦被解析器看到就可用,因此 SAX 非常适用于通过流到达的 XML 文档。

Disadvantages of SAX

  1. 我们无法随机访问 XML 文档,因为它是按前向方式处理的。

  2. 如果你需要跟踪解析器看过的数据或更改项目顺序,则必须自己编写代码并存储数据。

ContentHandler Interface

此接口指定 SAX 解析器用于通知应用程序程序其看到的 XML 文档组件的回调方法。

  1. void startDocument() − 在文档开头调用。

  2. void endDocument() − 在文档开头调用。

  3. void startElement(String uri, String localName, String qName, Attributes atts) − 在元素开头调用。

  4. void endElement(String uri, String localName,String qName) − 在元素结尾调用。

  5. void characters(char[] ch, int start, int length) − 在遇到字符数据时调用。

  6. void ignorableWhitespace( char[] ch, int start, int length) − 在存在 DTD 且遇到可忽略空白时调用。

  7. void processingInstruction(String target, String data) − 在识别出处理指令时调用。

  8. void setDocumentLocator(Locator locator)) − 提供一个用于标识文档中位置的定位器。

  9. void skippedEntity(String name) − 在遇到未解析的实体时调用。

  10. void startPrefixMapping(String prefix, String uri) − 在定义新的命名空间映射时调用。

  11. void endPrefixMapping(String prefix) − 在命名空间定义结束其作用域时调用。

Attributes Interface

此接口为处理连接到元素的属性指定方法。

  1. int getLength() − 返回属性的数量。

  2. String getQName(int index)

  3. String getValue(int index)

  4. String getValue(String qname)