摘要:而正好相反,采用一種拉的方式,由應(yīng)用程序主動(dòng)從解析器中獲取當(dāng)前事件然后更具需求處理保存或者忽略。通過將解析器事件變成一級(jí)對(duì)象,從而讓應(yīng)用程序可以采用面向?qū)ο蟮姆绞教幚硭鼈儭?/p>
簡(jiǎn)介
StAX,全稱Streaming API for XML,一種全新的,基于流的JAVA XML解析標(biāo)準(zhǔn)類庫(kù)。其最終版本于 2004 年 3 月發(fā)布,并成為了 JAXP 1.4(將包含在即將發(fā)布的 Java 6 中)的一部分。在某種程度上來說,StAX與SAX一樣是基于XML事件的解析方式,它們都不會(huì)一次性加載整個(gè)XML文件。但是它們之間也有很大的不同。
與SAX相比雖然StAX與SAX一樣基于XML事件解析,相比于DOM將整個(gè)XML加載進(jìn)內(nèi)存來說效率高。不同的是,StAX在在處理XML事件的方式上使得應(yīng)用程序更接近底層,所以在效率上比SAX更優(yōu)秀。
使用SAX時(shí),我們知道XML事件是由解析器調(diào)用開發(fā)人員編寫的回調(diào)方法來處理的,也就是說應(yīng)用程序是被動(dòng)于解析器的。應(yīng)用程序只能被動(dòng)的等待解析器將XML事件推送給自己處理,對(duì)于每一種事件都需要在解析開始之前就做好準(zhǔn)備。這種方式被稱為‘推(push)‘。
而StAX正好相反,StAX采用一種‘拉(pull)‘的方式,由應(yīng)用程序主動(dòng)從解析器中獲取當(dāng)前XML事件然后更具需求處理(保存或者忽略)。StAX使得應(yīng)用程序掌握了主動(dòng)權(quán),可以簡(jiǎn)化調(diào)用代碼來準(zhǔn)確地處理它預(yù)期的內(nèi)容,或者發(fā)生意外時(shí)停止解析。此外,由于該方法不基于處理程序回調(diào),應(yīng)用程序不需要像使用 SAX 那樣模擬解析器的狀態(tài)。
獲取解析器工廠
與其他解析技術(shù)一樣,在使用StAX解析器之前也需要獲取其工廠類。
import java.io.InputStream; import java.io.OutputStream; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; public class StAX_Frist { public void writeXMlByStream(OutputStream out){ XMLOutputFactory outFactor=XMLOutputFactory.newInstance();//寫解析器工廠 ....... } public void readXmlByStream(InputStream in){ XMLInputFactory inFactory=XMLInputFactory.newInstance();//讀解析器工廠 ....... }主要API
StAX 實(shí)際上包括兩套處理 XML 的 API,分別提供了不同程度的抽象。基于指針(Cursor)的 API 允許應(yīng)用程序把 XML 作為一個(gè)標(biāo)記(或事件)流來處理。在這里,解析器就像一跟指針一樣在文件流上前進(jìn),應(yīng)用程序可以跟隨解析器從文件的開頭一直處理到結(jié)尾。這是一種低層 API,盡管效率高,但是沒有提供底層 XML 結(jié)構(gòu)的抽象。Cursor API 由兩個(gè)主要API組成,XMLStreamReader和XMLStreamWriter,分別由XMLInputStreamFactory和XMLOutputStreamFactory獲取。
使用Cursor API 讀XML文件:
import java.io.InputStream; import javax.xml.stream.XMLInputFactory;; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader; public class StAX_Frist { public void readXmlByStream(InputStream in){ XMLInputFactory inFactory=XMLInputFactory.newInstance();//讀解析器工廠 try { XMLStreamReader reader=inFactory.createXMLStreamReader(in);//獲取讀解析器 while(reader.hasNext()){//reader.hasNext();說明文件未到結(jié)尾。 int eventId=reader.next(); switch (eventId) { case XMLStreamConstants.START_DOCUMENT: System.out.println("start docmuent"); break; case XMLStreamConstants.START_ELEMENT: System.out.println("<"+reader.getLocalName()+">"); for(int i=0;i"); break; case XMLStreamConstants.END_DOCUMENT: System.out.println("end docmuent"); break; default: break; } } } catch (Exception e) { e.printStackTrace(); } }
另外一種是較為高級(jí)的基于迭代器(Iterator)的 API ,它允許應(yīng)用程序把 XML 作為一系列事件對(duì)象來處理,每個(gè)對(duì)象和應(yīng)用程序交換 XML 結(jié)構(gòu)的一部分。應(yīng)用程序只需要確定解析事件的類型,將其轉(zhuǎn)換成對(duì)應(yīng)的具體類型,然后利用其方法獲得屬于該事件的信息?;谑录鞯姆椒ň哂幸粋€(gè)基于指針的方法不具備的重要優(yōu)點(diǎn)。通過將解析器事件變成一級(jí)對(duì)象,從而讓應(yīng)用程序可以采用面向?qū)ο蟮姆绞教幚硭鼈?。這樣做有助于模塊化和不同應(yīng)用程序組件之間的代碼重用。Iterator API 由兩個(gè)主要API組成,XMLEventReader和XMLEventWriter,分別由XMLInputStreamFactory和XMLOutputStreamFactory獲取。
使用Iterator API 讀XML文件:
import java.io.InputStream; import java.util.Iterator; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.events.Attribute; import javax.xml.stream.events.Characters; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; public class StAX_Frist { public void readXmlByEvent(InputStream in){ XMLInputFactory factory=XMLInputFactory.newInstance();//獲取解析器工廠 try { XMLEventReader reader=factory.createXMLEventReader(in);//獲取解析器 while(reader.hasNext()){ XMLEvent event=reader.nextEvent(); switch (event.getEventType()) { case XMLStreamConstants.START_DOCUMENT: System.out.println("start docmuent"); break; case XMLStreamConstants.START_ELEMENT: StartElement element=(StartElement)event; System.out.println("<"+element.getName().getLocalPart()+">"); for(Iterator it=element.getAttributes();it.hasNext();){ Attribute attr=(Attribute) it.next(); System.out.println(attr.getName().getLocalPart()+"="+attr.getValue()); } break; case XMLStreamConstants.CHARACTERS: Characters charData=(Characters)event; if(charData.isIgnorableWhiteSpace()&&charData.isWhiteSpace()){ break; } System.out.println(charData.getData()); break; case XMLStreamConstants.END_ELEMENT: element=(StartElement)event; System.out.println(""+element.getName().getLocalPart()+">"); break; case XMLStreamConstants.END_DOCUMENT: System.out.println("end docmuent"); break; default: break; } } } catch (Exception e) { e.printStackTrace(); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/110364.html
摘要:而正好相反,采用一種拉的方式,由應(yīng)用程序主動(dòng)從解析器中獲取當(dāng)前事件然后更具需求處理保存或者忽略。通過將解析器事件變成一級(jí)對(duì)象,從而讓應(yīng)用程序可以采用面向?qū)ο蟮姆绞教幚硭鼈儭? 簡(jiǎn)介 StAX,全稱Streaming API for XML,一種全新的,基于流的JAVA XML解析標(biāo)準(zhǔn)類庫(kù)。其最終版本于 2004 年 3 月發(fā)布,并成為了 JAXP 1.4(將包含在即將發(fā)布的 Java 6...
摘要:作為日常開發(fā)中一種常用的傳輸格式。對(duì)應(yīng)的,定義了三種標(biāo)準(zhǔn)類型的輸入接口和輸出接口,。實(shí)體類如果請(qǐng)求的傳輸數(shù)據(jù)量很大,并且無需和外系統(tǒng)對(duì)接的場(chǎng)景,建議使用屬性來組織,這樣可以極大的減小格式的數(shù)據(jù)包的規(guī)模。如有版權(quán)侵犯,請(qǐng)聯(lián)系郵箱。 XML作為日常開發(fā)中一種常用的傳輸格式。jersey 也做了很優(yōu)秀的支持。 我學(xué)習(xí) 《Java RESTful Web Service 實(shí)戰(zhàn)》 一書。書中有...
摘要:作為日常開發(fā)中一種常用的傳輸格式。對(duì)應(yīng)的,定義了三種標(biāo)準(zhǔn)類型的輸入接口和輸出接口,。實(shí)體類如果請(qǐng)求的傳輸數(shù)據(jù)量很大,并且無需和外系統(tǒng)對(duì)接的場(chǎng)景,建議使用屬性來組織,這樣可以極大的減小格式的數(shù)據(jù)包的規(guī)模。如有版權(quán)侵犯,請(qǐng)聯(lián)系郵箱。 XML作為日常開發(fā)中一種常用的傳輸格式。jersey 也做了很優(yōu)秀的支持。 我學(xué)習(xí) 《Java RESTful Web Service 實(shí)戰(zhàn)》 一書。書中有...
摘要:最近連都在準(zhǔn)備發(fā)布的路上了,大家都整明白了嗎也許現(xiàn)在大部分人還在用,的新特性都沒用熟,剛出不久,就不用說了。 最近連 JDK11都在準(zhǔn)備發(fā)布的路上了,大家都整明白了嗎?也許現(xiàn)在大部分人還在用6-8,8的新特性都沒用熟,9剛出不久,10-11就不用說了。 為了大家對(duì)JDK有一個(gè)全面的了解,下面我為大家整理了JDK5~10的所有關(guān)鍵新特性! JDK5新特性 自動(dòng)裝箱與拆箱 枚舉 靜態(tài)導(dǎo)...
摘要:而且,用友云配置中心以服務(wù)的方式提供統(tǒng)一的管理界面,結(jié)合用友云的認(rèn)證中心可以提供可靠的安全保障。 微服務(wù)架構(gòu)是這幾年IT領(lǐng)域的一個(gè)高頻詞匯,越來越多的項(xiàng)目和應(yīng)用正在以微服務(wù)的思想進(jìn)行重構(gòu)。相比于單體應(yīng)用和SOA架構(gòu),微服務(wù)優(yōu)勢(shì)也逐漸凸顯,被廣大架構(gòu)師和技術(shù)人員引入和推崇。當(dāng)然,單體應(yīng)用、SOA、微服務(wù)等各有優(yōu)勢(shì)和不足。單體架構(gòu)在早期的企業(yè)內(nèi)部信息化或者搭建中小型項(xiàng)目時(shí)很常見,簡(jiǎn)單說就是...
閱讀 3274·2023-04-25 18:03
閱讀 1143·2021-11-15 11:38
閱讀 5522·2021-10-25 09:45
閱讀 840·2021-09-24 09:48
閱讀 2272·2021-09-22 15:34
閱讀 1734·2019-08-30 15:44
閱讀 2675·2019-08-30 13:12
閱讀 604·2019-08-29 16:05