您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“JDK6.0中StAX是什么”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“JDK6.0中StAX是什么”這篇文章吧。
StAX(JSR 173)是JDK6.0中除了DOM和SAX之外的又一種處理XML文檔的API
StAX的來(lái)歷
在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)都會(huì)用到StAX所以Sun決定把StAX加入到JAXP家族當(dāng)中來(lái),并將JAXP的版本升級(jí)到1.4(JAXP1.4是JAXP1.3的維護(hù)版本). JDK6里面JAXP的版本就是1.4.
StAX簡(jiǎn)介
StAX是The Streaming API for XML的縮寫(xiě),一種利用拉模式解析(pull-parsing)XML文檔的API.StAX通過(guò)提供一種基于事件迭代器(Iterator)的API讓程序員去控制xml文檔解析過(guò)程,程序遍歷這個(gè)事件迭代器去處理每一個(gè)解析事件,解析事件可以看做是程序拉出來(lái)的,也就是程序促使解析器產(chǎn)生一個(gè)解析事件然后處理該事件,之后又促使解析器產(chǎn)生下一個(gè)解析事件,如此循環(huán)直到碰到文檔結(jié)束符;SAX也是基于事件處理xml文檔,但卻是用推模式解析,解析器解析完整個(gè)xml文檔后,才產(chǎn)生解析事件,然后推給程序去處理這些事件;DOM采用的方式是將整個(gè)xml文檔映射到一顆內(nèi)存樹(shù),這樣就可以很容易地得到父節(jié)點(diǎn)和子結(jié)點(diǎn)以及兄弟節(jié)點(diǎn)的數(shù)據(jù),但如果文檔很大,將會(huì)嚴(yán)重影響性能。下面是這幾種API的比較(轉(zhuǎn)載自http://www.blogjava.net/hsith/archive/2006/06/29/55817.html)
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代碼演示
下面代碼演示了如何通過(guò)StAX讀取xml文檔和生成xml文檔
public class StaxTester {
public static void main(String[] args) throws XMLStreamException, FileNotFoundException {
readXMLByStAX();//用XMLEventReader解析xml文檔
writeXMLByStAX();//用XMLStreamWriter寫(xiě)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()) { //如果解析的是起始標(biāo)記 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()) { //如果解析的是文本內(nèi)容
parsingResult.append(event.asCharacters().getData());
} else if(event.isEndElement()){ //如果解析的是結(jié)束標(biāo)記
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"));
// 寫(xiě)入默認(rèn)的 XML 聲明到xml文檔
xmlw.writeStartDocument();
xmlw.writeCharacters("n");
// 寫(xiě)入注釋到xml文檔
xmlw.writeComment("testing comment");
xmlw.writeCharacters("n");
// 寫(xiě)入一個(gè)catalogs根元素 xmlw.writeStartElement("catalogs");
xmlw.writeNamespace("myNS", "");
xmlw.writeAttribute("owner","Chinajash");
xmlw.writeCharacters("n");
// 寫(xiě)入子元素catalog
xmlw.writeStartElement("", "catalog");
xmlw.writeAttribute("id","007");
xmlw.writeCharacters("Apparel");
// 寫(xiě)入catalog元素的結(jié)束標(biāo)簽
xmlw.writeEndElement();
// 寫(xiě)入catalogs元素的結(jié)束標(biāo)簽
xmlw.writeEndElement();
// 結(jié)束 XML 文檔 xmlw.writeEndDocument();
xmlw.close();
}
}http://blog.csdn.net/Chinajashhttp://blog.csdn.net/Chinajash
test.xml文件內(nèi)容如下:
運(yùn)行上面程序后,控制臺(tái)輸出如下:
運(yùn)行上面程序后,產(chǎn)生的output.xml文件如下:
<!-- testing comment-->
以上是“JDK6.0中StAX是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。