溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JDK6.0中StAX是什么

發(fā)布時(shí)間:2021-12-03 09:37:28 來(lái)源:億速云 閱讀:166 作者:小新 欄目:編程語(yǔ)言

這篇文章主要為大家展示了“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)

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代碼演示

下面代碼演示了如何通過(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)容如下:



   Book
   Video

運(yùn)行上面程序后,控制臺(tái)輸出如下:


   Book
   Video

運(yùn)行上面程序后,產(chǎn)生的output.xml文件如下:


<!-- testing comment--&gt

   Apparel

以上是“JDK6.0中StAX是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI