Sax解析xml_动力节点Java学院整理

  

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 接口:接收文档逻辑内容的通知的处理器接口。
  

        进口org.xml.sax.Attributes;   进口org.xml.sax.ContentHandler;   进口org.xml.sax.Locator;   进口org.xml.sax.SAXException;      类MyContentHandler实现ContentHandler {   StringBuffer jsonStringBuffer;   int frontBlankCount=0;   公共MyContentHandler () {   jsonStringBuffer=new StringBuffer ();   }/*   *接收字符数据的通知。   *在DOM中ch(开始:结束)相当于文本节点的节点值(nodeValue)   */@Override   公共空白字符(char [] ch, int, int长度)抛出SAXException {   StringBuffer缓冲=new StringBuffer ();   for (int i=开始;我& lt;开始+长度;我+ +){   开关(ch[我]){   例“\ \”:buffer.append(“\ \ \ \”);断裂;   案例“\ r”: buffer.append (“\ \ r”);断裂;   案例“\ n”: buffer.append (“\ \ n”);断裂;   案例“\ t”: buffer.append (“\ \ t”);断裂;   例“\”:buffer.append(" \ \ \ ");断裂;   默认值:buffer.append (ch[我]);   }   }   System.out.println (this.toBlankString (this.frontBlankCount) +   “在祝辞比;长度字符(“+ +”):“+ buffertoString ());   }/*   *接收文档的结尾的通知。   */@Override   公共空间endDocument()抛出SAXException {   System.out.println (this.toBlankString (——this.frontBlankCount) +   “在祝辞比;文档”);   }/*   *接收文档的结尾的通知。   *参数意义如下:   * uri:元素的命名空间   * localName:元素的本地名称(不带前缀)   * qName:元素的限定名(带前缀)   *   */@Override   公共空间endElement (String localName uri字符串,字符串qName)   抛出SAXException {   System.out.println (this.toBlankString (——this.frontBlankCount) +   “在祝辞比;结束元素:“+ qName +”(uri " + + ") ");   }/*   *结束前缀URI范围的映射。   */@Override   公共空间endPrefixMapping(字符串前缀)抛出SAXException {   System.out.println (this.toBlankString (——this.frontBlankCount) +   “在祝辞比;prefix_map结束:“+前缀);   }/*   *接收元素内容中可忽略的空白的通知。   *参数意义如下:   * ch:来自XML文档的字符   *开始:数组中的开始位置   *长度:从数组中读取的字符的个数   */@Override   公共空间ignorableWhitespace (char [] ch, int, int长度)   抛出SAXException {   StringBuffer缓冲=new StringBuffer ();   for (int i=开始;我& lt;开始+长度;我+ +){   开关(ch[我]){   例“\ \”:bufferappend(“\ \ \ \”);断裂;   案例“\ r”: bufferappend (“\ \ r”);断裂;   案例“\ n”: bufferappend (“\ \ n”);断裂;   案例“\ t”: bufferappend (“\ \ t”);断裂;   例“\”:bufferappend(" \ \ \ ");断裂;   默认值:bufferappend (ch[我]);   }   }   System.out.println (this.toBlankString (this.frontBlankCount) +”,在祝辞的在可忽略的空格(“+ +”长度):”+ buffer.toString ());   }/*   *接收处理指令的通知。   *参数意义如下:   *目标:处理指令目标   *数据:处理指令数据,如果未提供,则为null。   */@Override   公共空间processingInstruction(目标字符串,字符串数据)   抛出SAXException {   System.out.println (this.toBlankString (this.frontBlankCount) +”,在祝辞的在过程指令:(目标=\”“   +目标+“\”,https://www.yisu.com/data=" +数据+“\”)”);   }/*   *接收用来查找SAX文档事件起源的对象。   *参数意义如下:   *定位器:可以返回任何SAX文档事件位置的对象   */@Override   公共空间setDocumentLocator(定位器定位器){   System.out.println (this.toBlankString (this.frontBlankCount) +   “在祝辞比;设置document_locator: (lineNumber=" + locatorgetLineNumber ()   +”,columnNumber=" + locatorgetColumnNumber ()   +“systemId=" + locatorgetSystemId ()   +”,publicId=" + locatorgetPublicId () + ") ");      }/*   *接收跳过的实体的通知。   *参数意义如下:   *名称:所跳过的实体的名称。如果它是参数实体,则名称将以“%”开的头,   *如果它是外部DTD子集,则将是字符串“(DTD)”   */@Override   公共空间skippedEntity(字符串名称)抛出SAXException {   System.out.println (this.toBlankString (this.frontBlankCount) +   “在祝辞比;skipped_entity:“+名字);   }/*   *接收文档的开始的通知。   */@Override   公共空间startDocument()抛出SAXException {   System.out.println (this.toBlankString this.frontBlankCount + + +   “在祝辞比;开始文档”);   }/*   *接收元素开始的通知。   *参数意义如下:   * uri:元素的命名空间   * localName:元素的本地名称(不带前缀)   * qName:元素的限定名(带前缀)   * att:元素的属性集合   */@Override   公共空间startElement (String localName uri字符串,字符串qName,   属性att)抛出SAXException {   System.out.println (this.toBlankString this.frontBlankCount + + +   “在祝辞比;开始元素:“+ qName +”(uri " + + ") ");   }/*   *开始前缀URI名称空间范围映射。   *此事件的信息对于常规的命名空间处理并非必需:   *当http://xmlorg/sax/features/namespaces功能为true(默认)时,   * SAX XML读取器将自动替换元素和属性名称的前缀。   *参数意义如下:   *前缀:前缀   * uri:命名空间   */@Override   公共空间startPrefixMapping (uri字符串前缀,字符串)   抛出SAXException {   System.out.println (this.toBlankString this.frontBlankCount + + +   “在祝辞比;开始prefix_map: xmlns:前缀" + + "="   ”+”、“+ +”uri \ ");      }      私人字符串toBlankString (int数){   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Sax解析xml_动力节点Java学院整理