Java SAX 解析器 - 概述



Java SAX (Simple API for XML) 是一种基于事件的解析器,用于解析 XML 文档。与 DOM 解析器不同,SAX 解析器不会创建解析树。它不会将整个文档加载到内存中,而是读取 XML 文档,并在遇到元素、属性、文本内容和其他数据项时以事件的形式通知客户端程序。这些事件由事件处理程序中实现的方法处理。

SAX 解析器做什么?

SAX 解析器对客户端程序执行以下操作:

  • 从上到下读取 XML 文档并识别标记。

  • 按标记出现的顺序处理标记。

  • 向解析器报告标记的性质。

  • 根据识别的标记调用事件处理程序中的回调方法。

何时使用 Java SAX 解析器?

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

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

  • 文档嵌套不深。

  • 您的 XML 文档非常大。

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

  • 您拥有流数据(数据在解析器看到后即可使用)。

优点

以下是 Java SAX 解析器的一些优点:

  • 占用内存更少
  • 它比 DOM 解析器更快。因为我们不需要等待整个文档加载到内存中。
  • 您仍然可以处理大于系统内存的 XML 文档。

缺点

以下是 Java SAX 解析器的一些缺点:

  • 无法随机访问 XML 文档。

  • 无法创建 XML 文档。
  • 如果要跟踪解析器已看到的的数据或更改项目的顺序,则必须编写代码并自行存储数据。

ContentHandler 接口

ContentHandler 接口是 org.xml.sax 包中的主要接口。大多数应用程序程序实现此接口以执行基本的解析事件。这些事件包括文档的开始和结束、元素的开始和结束以及字符数据。我们必须实现并注册一个处理程序才能在 XML 文档中执行任何任务。

有一些内置类,即 DefaultHandler、DefaultHandler2、ValidatorHandler,它们实现了 ContentHandler 接口。我们可以使用这些类来实现我们用户自定义的处理程序。

此接口指定 SAX 解析器用来通知应用程序程序它已看到的 XML 文档组件的回调方法。以下是 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) 遇到字符数据时调用。
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 接口

Attributes 接口位于 org.xml.sax 包中。此接口用于元素中指定的 XML 属性列表。以下是 Attributes 接口最常用的方法:

方法 描述
int getLength() 返回属性数量。
int getIndex(String qName) 返回属性在列表中的索引,如果不存在则返回 -1。
String getQName(int index) 按索引返回属性名称,如果索引超出范围则返回 null。
String getType(int index) 按索引返回属性的类型(“CDATA”、“ID”、“IDREF”等)。
String getValue(int index) 按索引返回属性的值,如果索引超出范围则返回 null。
String getValue(String qName) 按名称返回属性的值,如果名称不存在则返回 null。
广告