JDK6.0的新特性之三:理解StAX

okone96發表於2007-01-10

StAX()是JDK6.0中除了DOM和SAX之外的又一種處理XML文件的API

StAX的來歷

在JAXP1.3()有兩種處理XML文件的方法:DOM(Document Object Model)和SAX(Simple API for XML).由於JDK6.0中的JAXB2()和JAX-WS 2.0()都會用到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文件解析過程,程式遍歷這個事件迭代器去處理每一個解析事件,解析事件可以看做是程式拉出來的,也就是程式促使解析器產生一個解析事件然後處理該事件,之後又促使解析器產生下一個解析事件,如此迴圈直到碰到文件結束符;SAX也是基於事件處理xml文件,但卻是用推模式解析,解析器解析完整個xml文件後,才產生解析事件,然後推給程式去處理這些事件;DOM採用的方式是將整個xml文件對映到一顆記憶體樹,這樣就可以很容易地得到父節點和子結點以及兄弟節點的資料,但如果文件很大,將會嚴重影響效能。下面是這幾種API的比較(轉載自http://www.blogjava.net/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();
if (event.isStartElement()) { //如果解析的是起始標記 StartElement se = event.asStartElement();
parsingResult.append(" parsingResult.append(se.getName());
if(se.getName().getLocalPart().equals("catalog")) {
parsingResult.append(" id="");
parsingResult.append(se.getAttributeByName(new QName("id")).getValue());
parsingResult.append(""");
}
parsingResult.append(">");
} else if (event.isCharacters()) { //如果解析的是文字內容
parsingResult.append(event.asCharacters().getData());
} else if(event.isEndElement()){ //如果解析的是結束標記
parsingResult.append("");
parsingResult.append(event.asEndElement().getName());
parsingResult.append(">");
}
}
System.out.println(parsingResult);
}

private static void writeXMLByStAX() throws XMLStreamException, FileNotFoundException {
XMLOutputFactory xmlof = XMLOutputFactory.newInstance();
XMLStreamWriter xmlw = xmlof.createXMLStreamWriter(new FileOutputStream("output.xml"));

// 寫入預設的 XML 宣告到xml文件
xmlw.writeStartDocument();
xmlw.writeCharacters("n");
// 寫入註釋到xml文件
xmlw.writeComment("testing comment");
xmlw.writeCharacters("n");
// 寫入一個catalogs根元素 xmlw.writeStartElement("catalogs");
xmlw.writeNamespace("myNS", "
");
xmlw.writeAttribute("owner","Chinajash");
xmlw.writeCharacters("n");
// 寫入子元素catalog
xmlw.writeStartElement("
", "catalog");
xmlw.writeAttribute("id","007");
xmlw.writeCharacters("Apparel");
// 寫入catalog元素的結束標籤
xmlw.writeEndElement();
// 寫入catalogs元素的結束標籤
xmlw.writeEndElement();
// 結束 XML 文件 xmlw.writeEndDocument();
xmlw.close();
}
}
http://blog.csdn.net/Chinajashhttp://blog.csdn.net/Chinajash

test.xml檔案內容如下:



Book
Video

執行上面程式後,控制檯輸出如下:


Book
Video

執行上面程式後,產生的output.xml檔案如下:


<!-- testing comment--&gt
" owner="Chinajash">
Apparel
http://blog.csdn.net/Chinajash

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/750220/viewspace-889295/,如需轉載,請註明出處,否則將追究法律責任。

相關文章