Java SAX 解析器 - 概述
SAX(XML 的简单 API)是一种基于事件的 XML 文档解析器。 与 DOM 解析器不同,SAX 解析器不创建解析树。 SAX 是 XML 的流式接口,这意味着使用 SAX 的应用程序接收有关正在处理的 XML 文档的事件通知,一个元素和属性,一次按顺序从文档顶部开始,到结束 根元素。
从上到下读取 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)) − 提供可用于识别文档中位置的定位器。
void skippedEntity(String name) − 当遇到未解析的实体时调用。
void startPrefixMapping(String prefix, String uri) − 在定义新的命名空间映射时调用。
void endPrefixMapping(String prefix) − 当命名空间定义结束其范围时调用。
属性接口
此接口指定处理连接到元素的属性的方法。
int getLength() − 返回属性的数量。
String getQName(int index)
String getValue(int index)
String getValue(String qname)