JAVA 解析 XML 通常有两种方式,DOM 和 SAX。DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一个驻留内存的树结构(节点树),然后您的代码才可以使用 DOM 的标准接口来操作这个树结构。但大部分情况下我们只对文档的部分内容感兴趣,根本就不用先解析整个文档,并且从节点树的根节点来索引一些我们需要的数据也是非常耗时的。
SAX是一种XML解析的替代方法。相比于文档对象模型DOM,SAX 是读取和操作 XML 数据的更快速、更轻量的方
法。SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。它不涉及 DOM 所必需的开销和概念跳跃。 SAX API是一个基于事件的API ,适用于处理数据流,即随着数据的流动而依次处理数据。SAX API
在其解析您的文档时发生一定事件的时候会通知您。在您对其响应时,您不作保存的数据将会 被抛弃。
下面是一个SAX解析XML的示例(有点长,因为详细注解了SAX事件处理的所有方法),SAX API中主要有四种处理事件的接口,它们分别是ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler 。下面的例子可能有点冗长,实际上只要继承DefaultHandler 类 ,再覆盖一部分 处理事件的方法 同样可以达到这个示例的效果,但为了纵观全局,还是看看SAX API里面所有主要的事件解析方法吧。( 实际上DefaultHandler就是实现了上面的四个事件处理器接口,然后提供了每个抽象方法的默认实现。)
1,ContentHandler 接口 :接收文档逻辑内容的通知 的处理器接口。
Java代码 import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; class MyContentHandler implements ContentHandler{ StringBuffer jsonStringBuffer ; int frontBlankCount = 0; public MyContentHandler(){ jsonStringBuffer = new StringBuffer(); } /* * 接收字符数据的通知。 * 在DOM中 ch[begin:end] 相当于Text节点的节点值(nodeValue) */ @Override public void characters(char[] ch, int begin, int length) throws SAXException { StringBuffer buffer = new StringBuffer(); for(int i = begin ; i < begin+length ; i++){ switch(ch[i]){ case '\\':buffer.append("\\\\");break; case '\r':buffer.append("\\r");break; case '\n':buffer.append("\\n");break; case '\t':buffer.append("\\t");break; case '\"':buffer.append("\\\"");break; default : buffer.append(ch[i]); } }