摘要:而正好相反,采用一種拉的方式,由應用程序主動從解析器中獲取當前事件然后更具需求處理保存或者忽略。通過將解析器事件變成一級對象,從而讓應用程序可以采用面向對象的方式處理它們。
簡介
StAX,全稱Streaming API for XML,一種全新的,基于流的JAVA XML解析標準類庫。其最終版本于 2004 年 3 月發布,并成為了 JAXP 1.4(將包含在即將發布的 Java 6 中)的一部分。在某種程度上來說,StAX與SAX一樣是基于XML事件的解析方式,它們都不會一次性加載整個XML文件。但是它們之間也有很大的不同。
與SAX相比雖然StAX與SAX一樣基于XML事件解析,相比于DOM將整個XML加載進內存來說效率高。不同的是,StAX在在處理XML事件的方式上使得應用程序更接近底層,所以在效率上比SAX更優秀。
使用SAX時,我們知道XML事件是由解析器調用開發人員編寫的回調方法來處理的,也就是說應用程序是被動于解析器的。應用程序只能被動的等待解析器將XML事件推送給自己處理,對于每一種事件都需要在解析開始之前就做好準備。這種方式被稱為‘推(push)‘。
而StAX正好相反,StAX采用一種‘拉(pull)‘的方式,由應用程序主動從解析器中獲取當前XML事件然后更具需求處理(保存或者忽略)。StAX使得應用程序掌握了主動權,可以簡化調用代碼來準確地處理它預期的內容,或者發生意外時停止解析。此外,由于該方法不基于處理程序回調,應用程序不需要像使用 SAX 那樣模擬解析器的狀態。
獲取解析器工廠
與其他解析技術一樣,在使用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 實際上包括兩套處理 XML 的 API,分別提供了不同程度的抽象。基于指針(Cursor)的 API 允許應用程序把 XML 作為一個標記(或事件)流來處理。在這里,解析器就像一跟指針一樣在文件流上前進,應用程序可以跟隨解析器從文件的開頭一直處理到結尾。這是一種低層 API,盡管效率高,但是沒有提供底層 XML 結構的抽象。Cursor API 由兩個主要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();說明文件未到結尾。 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(); } }
另外一種是較為高級的基于迭代器(Iterator)的 API ,它允許應用程序把 XML 作為一系列事件對象來處理,每個對象和應用程序交換 XML 結構的一部分。應用程序只需要確定解析事件的類型,將其轉換成對應的具體類型,然后利用其方法獲得屬于該事件的信息。基于事件迭代器的方法具有一個基于指針的方法不具備的重要優點。通過將解析器事件變成一級對象,從而讓應用程序可以采用面向對象的方式處理它們。這樣做有助于模塊化和不同應用程序組件之間的代碼重用。Iterator API 由兩個主要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(); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66050.html
摘要:而正好相反,采用一種拉的方式,由應用程序主動從解析器中獲取當前事件然后更具需求處理保存或者忽略。通過將解析器事件變成一級對象,從而讓應用程序可以采用面向對象的方式處理它們。 簡介 StAX,全稱Streaming API for XML,一種全新的,基于流的JAVA XML解析標準類庫。其最終版本于 2004 年 3 月發布,并成為了 JAXP 1.4(將包含在即將發布的 Java 6...
摘要:作為日常開發中一種常用的傳輸格式。對應的,定義了三種標準類型的輸入接口和輸出接口,。實體類如果請求的傳輸數據量很大,并且無需和外系統對接的場景,建議使用屬性來組織,這樣可以極大的減小格式的數據包的規模。如有版權侵犯,請聯系郵箱。 XML作為日常開發中一種常用的傳輸格式。jersey 也做了很優秀的支持。 我學習 《Java RESTful Web Service 實戰》 一書。書中有...
摘要:作為日常開發中一種常用的傳輸格式。對應的,定義了三種標準類型的輸入接口和輸出接口,。實體類如果請求的傳輸數據量很大,并且無需和外系統對接的場景,建議使用屬性來組織,這樣可以極大的減小格式的數據包的規模。如有版權侵犯,請聯系郵箱。 XML作為日常開發中一種常用的傳輸格式。jersey 也做了很優秀的支持。 我學習 《Java RESTful Web Service 實戰》 一書。書中有...
摘要:最近連都在準備發布的路上了,大家都整明白了嗎也許現在大部分人還在用,的新特性都沒用熟,剛出不久,就不用說了。 最近連 JDK11都在準備發布的路上了,大家都整明白了嗎?也許現在大部分人還在用6-8,8的新特性都沒用熟,9剛出不久,10-11就不用說了。 為了大家對JDK有一個全面的了解,下面我為大家整理了JDK5~10的所有關鍵新特性! JDK5新特性 自動裝箱與拆箱 枚舉 靜態導...
摘要:而且,用友云配置中心以服務的方式提供統一的管理界面,結合用友云的認證中心可以提供可靠的安全保障。 微服務架構是這幾年IT領域的一個高頻詞匯,越來越多的項目和應用正在以微服務的思想進行重構。相比于單體應用和SOA架構,微服務優勢也逐漸凸顯,被廣大架構師和技術人員引入和推崇。當然,單體應用、SOA、微服務等各有優勢和不足。單體架構在早期的企業內部信息化或者搭建中小型項目時很常見,簡單說就是...
閱讀 1653·2021-11-23 09:51
閱讀 2677·2021-11-22 09:34
閱讀 1316·2021-10-14 09:43
閱讀 3661·2021-09-08 09:36
閱讀 3206·2019-08-30 12:57
閱讀 2025·2019-08-30 12:44
閱讀 2516·2019-08-29 17:15
閱讀 3014·2019-08-29 16:08