JDK6的新特性之三:理解StAX StAX(JSR 173)是JDK6.0中除了DOM和SAX之外的又一種處理XML文檔的API
StAX的來歷
在JAXP1.3(JSR 206)有兩種處理XML文檔的方法:DOM(Document Object Model)和SAX(Simple API for XML).由于JDK6.0中的JAXB2(JSR 222)和JAX-WS 2.0(JSR 224)都會用到StAX所以Sun決定把StAX加入到JAXP家族當中來,并將JAXP的版本升級到1.4(JAXP1.4是JAXP1.3的維護版本). JDK6里面JAXP的版本就是1.4.
StAX簡介
StAX是The Streaming API for XML的縮寫,一種利用拉模式解析(pull-parsing)XML文檔的API.StAX通過提供一種基于事件迭代器(Iterator)的API讓程序員去控制xml文檔解析過程,程序遍歷這個事件迭代器去處理每一個解析事件,解析事件可以看做是程序拉出來的,也就是程序促使解析器產(chǎn)生一個解析事件然后處理該事件,之后又促使解析器產(chǎn)生下一個解析事件,如此循環(huán)直到碰到文檔結(jié)束符;SAX也是基于事件處理xml文檔,但卻是用推模式解析,解析器解析完整個xml文檔后,才產(chǎn)生解析事件,然后推給程序去處理這些事件;DOM采用的方式是將整個xml文檔映射到一顆內(nèi)存樹,這樣就可以很容易地得到父節(jié)點和子結(jié)點以及兄弟節(jié)點的數(shù)據(jù),但如果文檔很大,將會嚴重影響性能。下面是這幾種API的比較(轉(zhuǎn)載自http://www./hsith/archive/2006/06/29/55817.html)
XML Parser API Feature Summary Feature StAX SAX DOM TrAX API Type Pull, streaming Push, streaming In memory tree XSLT Rule Ease of Use High Medium High Medium XPath Capability No No Yes Yes CPU and Memory Efficiency Good Good Varies Varies Forward Only Yes Yes No No Read XML Yes Yes Yes Yes Write XML Yes No Yes Yes Create, Read, Update, Delete No No Yes No
StAX代碼演示
下面代碼演示了如何通過StAX讀取xml文檔和生成xml文檔
public class StaxTester { public static void main(String[] args) throws XMLStreamException, FileNotFoundException { readXMLByStAX();//用XMLEventReader解析xml文檔 writeXMLByStAX();//用XMLStreamWriter寫xml文檔 }
private static void readXMLByStAX() throws XMLStreamException, FileNotFoundException { XMLInputFactory xmlif = XMLInputFactory.newInstance(); XMLEventReader xmler = xmlif.createXMLEventReader(StaxTester.class.getResourceAsStream("test.xml")); XMLEvent event; StringBuffer parsingResult = new StringBuffer(); while (xmler.hasNext()) { event = xmler.nextEvent(); |