📜  Java SAX解析器-概述

📅  最后修改于: 2020-11-14 10:25:20             🧑  作者: Mango


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) -在元素末尾调用。

  • 无效字符(char [] ch,int开头,int长度) -遇到字符数据时调用。

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

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

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

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

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

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

属性界面

该接口指定用于处理连接到元素的属性的方法。

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

  • 字符串getQName(int index)

  • 字符串getValue(int索引)

  • 字符串getValue(字符串qname)