JAVA 解析 XML 通常有两种方式,DOM 和 SAX。DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一个驻留内存的树结构(节
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 接口 :接收文档逻辑内容的通知 的处理器接口。
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(); } @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]); } } System.out.println(this.toBlankString(this.frontBlankCount)+ ">>> characters("+length+"): "+buffertoString()); } @Override public void endDocument() throws SAXException { System.out.println(this.toBlankString(--this.frontBlankCount)+ ">>> end document"); } @Override public void endElement(String uri,String localName,String qName) throws SAXException { System.out.println(this.toBlankString(--this.frontBlankCount)+ ">>> end element : "+qName+"("+uri+")"); } @Override public void endPrefixMapping(String prefix) throws SAXException { System.out.println(this.toBlankString(--this.frontBlankCount)+ ">>> end prefix_mapping : "+prefix); } @Override public void ignorableWhitespace(char[] ch, int begin, int length) throws SAXException { StringBuffer buffer = new StringBuffer(); for(int i = begin ; i < begin+length ; i++){ switch(ch[i]){ case '\\':bufferappend("\\\\");break; case '\r':bufferappend("\\r");break; case '\n':bufferappend("\\n");break; case '\t':bufferappend("\\t");break; case '\"':bufferappend("\\\"");break; default : bufferappend(ch[i]); } } System.out.println(this.toBlankString(this.frontBlankCount)+">>> ignorable whitespace("+length+"): "+buffer.toString()); } @Override public void processingInstruction(String target,String data) throws SAXException { System.out.println(this.toBlankString(this.frontBlankCount)+">>> process instruction : (target = \"" +target+"\",data = \""+data+"\")"); } @Override public void setDocumentLocator(Locator locator) { System.out.println(this.toBlankString(this.frontBlankCount)+ ">>> set document_locator : (lineNumber = "+locatorgetLineNumber() +",columnNumber = "+locatorgetColumnNumber() +",systemId = "+locatorgetSystemId() +",publicId = "+locatorgetPublicId()+")"); } @Override public void skippedEntity(String name) throws SAXException { System.out.println(this.toBlankString(this.frontBlankCount)+ ">>> skipped_entity : "+name); } @Override public void startDocument() throws SAXException { System.out.println(this.toBlankString(this.frontBlankCount++)+ ">>> start document "); } @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { System.out.println(this.toBlankString(this.frontBlankCount++)+ ">>> start element : "+qName+"("+uri+")"); } @Override public void startPrefixMapping(String prefix,String uri) throws SAXException { System.out.println(this.toBlankString(this.frontBlankCount++)+ ">>> start prefix_mapping : xmlns:"+prefix+" = " +"\""+uri+"\""); } private String toBlankString(int count){ StringBuffer buffer = new StringBuffer(); for(int i = 0;i<count;i++) buffer.append(" "); return buffer.toString(); } }
--结束END--
本文标题: Sax解析xml_动力节点Java学院整理
本文链接: https://www.lsjlt.com/news/224503.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-13
2024-05-13
2024-05-13
2024-05-13
2024-05-13
2024-05-13
2024-05-13
2024-05-13
2024-05-13
2024-05-13
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0