SAX 解析器 - 概述



SAX(XML 的简单 API)是一种基于事件的 XML 文档解析器。与 DOM 解析器不同,SAX 解析器不创建解析树。SAX 是 XML 的流式接口,这意味着使用 SAX 的应用程序会收到有关正在处理的 XML 文档的事件通知 - 每次一个元素和属性,按顺序从文档顶部开始,以 ROOT 元素的关闭结束。

  • 从上到下读取 XML 文档,识别构成格式良好的 XML 文档的标记。

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

  • 向应用程序报告解析器遇到的标记的性质,并在其发生时报告。

  • 应用程序提供一个“事件”处理程序,该处理程序必须向解析器注册。

  • 当识别出标记时,处理程序中的回调方法将使用相关信息被调用。

何时使用?

您应该在以下情况下使用 SAX 解析器:

  • 您可以从上到下以线性方式处理 XML 文档。

  • 文档嵌套不深。

  • 您正在处理一个非常大的 XML 文档,其 DOM 树将消耗大量内存。典型的 DOM 实现使用十个字节的内存来表示一个字节的 XML。

  • 要解决的问题只涉及 XML 文档的一部分。

  • 数据在解析器看到后立即可用,因此 SAX 非常适合通过流到达的 XML 文档。

SAX 的缺点

  • 由于 XML 文档以仅向前的方式处理,因此我们无法随机访问它。

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

ContentHandler 接口

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

  • 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) - 遇到字符数据时调用。

  • void ignorableWhitespace( char[] ch, int start, int length) - 当存在 DTD 且遇到可忽略的空白时调用。

  • void processingInstruction(String target, String data) - 识别处理指令时调用。

  • void setDocumentLocator(Locator locator)) - 提供一个 Locator,可用于识别文档中的位置。

  • void skippedEntity(String name) - 遇到未解析的实体时调用。

  • void startPrefixMapping(String prefix, String uri) - 定义新的命名空间映射时调用。

  • void endPrefixMapping(String prefix) - 命名空间定义结束其作用域时调用。

Attributes 接口

此接口指定用于处理与元素关联的属性的方法。

  • int getLength() - 返回属性的数量。

  • String getQName(int index)

  • String getValue(int index)

  • String getValue(String qname)

广告

© . All rights reserved.