XML - StAX示例
一、簡介
StAX 即 Streaming API for XML ,是一種針對XML的流式拉分析API,採用拉(Pull)的方式來處理事件, 允許應用程式從事件流中拉出事件,而不是提供從解析器中接收事件的回撥程式程式。
StAX 包括兩套處理 XML 的 API,分別提供了不同程度的抽象:
一種是基於指標的 API, 提供應用程式把 XML 作為一個標記(或事件)流來處理,應用程式可以檢查解析器的狀態,獲得解析的上一個標記的資訊,然後再處理下一個標記,依次類推;
另一種是較為高階的基於迭代器的 API, 提供應用程式把 XML 作為一系列事件物件來處理,每個物件和應用程式交換 XML 結構的一部分,應用程式直接處理這些代表了XML結構一部分的事件物件。
二、基於指標
1、獲取XMLStreamReader例項
1、獲取XMLEventReader例項
StAX 即 Streaming API for XML ,是一種針對XML的流式拉分析API,採用拉(Pull)的方式來處理事件, 允許應用程式從事件流中拉出事件,而不是提供從解析器中接收事件的回撥程式程式。
StAX 包括兩套處理 XML 的 API,分別提供了不同程度的抽象:
一種是基於指標的 API, 提供應用程式把 XML 作為一個標記(或事件)流來處理,應用程式可以檢查解析器的狀態,獲得解析的上一個標記的資訊,然後再處理下一個標記,依次類推;
另一種是較為高階的基於迭代器的 API, 提供應用程式把 XML 作為一系列事件物件來處理,每個物件和應用程式交換 XML 結構的一部分,應用程式直接處理這些代表了XML結構一部分的事件物件。
二、基於指標
1、獲取XMLStreamReader例項
XMLInputFactory factory = XMLInputFactory.newInstance();
InputStream is = this.getClass().getResourceAsStream("/com/xilen/stax/books.xml");
XMLStreamReader reader = factory.createXMLStreamReader(is);
2、讀取節點資訊 // 迴圈判斷是否還有下文
while (reader.hasNext()) {
// 判斷節點型別(開始節點、結束或文字)
int type = reader.next();
if(type == XMLStreamConstants.START_ELEMENT){
System.out.println(reader.getName());
}else if(type == XMLStreamConstants.CHARACTERS){
System.out.println(reader.getText().trim());
}else if(type == XMLStreamConstants.END_ELEMENT){
System.out.println(reader.getName());
}
}
3、讀取節點屬性 while (reader.hasNext()) {
int type = reader.next();
if(type == XMLStreamConstants.START_ELEMENT){
String name = reader.getName().toString();
if(name.equals("book")){
System.out.println("Attribute: "reader.getAttributeName(0) + "-->" + reader.getAttributeValue(0));
}
}
}
4、基於XMLStreamWriter寫文件 XMLStreamWriter xsw = XMLOutputFactory.newInstance().createXMLStreamWriter(System.out);
xsw.writeStartDocument("utf-8","1.1");
xsw.writeEndDocument();
xsw.writeStartElement("tns","Book","http://11");
xsw.writeAttribute("id", "b1");
xsw.writeStartElement("name");
xsw.writeCharacters("JavaEE");
xsw.writeEndElement();
xsw.writeEndElement();
xsw.flush();
xsw.close();
三、基於迭代1、獲取XMLEventReader例項
XMLInputFactory factory = XMLInputFactory.newInstance();
InputStream is = this.getClass().getResourceAsStream("/com/xilen/stax/books.xml");
XMLEventReader reader = factory.createXMLEventReader(is);
2、獲取節點資訊 // 迴圈判斷是否有下一個
while (reader.hasNext()) {
// 獲取下一個Event
XMLEvent event = reader.nextEvent();
//通過XMLEvent來判斷節點型別
if(event.isStartElement()){
//轉換節點
String name = event.asStartElement().getName().toString();
if(name.equals("title")){
// 通過reader來獲取節點的文字
System.out.print("BookName: " + reader.getElementText() );
}
}
}
3、新增過濾器獲取節點資訊 XMLInputFactory factory = XMLInputFactory.newInstance();
InputStream is = this.getClass().getResourceAsStream("/com/xilen/stax/books.xml");
XMLEventReader reader = factory.createFilteredReader(factory.createXMLEventReader(is),
// 新增過濾器
new EventFilter() {
@Override
public boolean accept(XMLEvent event) {
// 只獲取開始節點和文字節點
if(event.isStartElement() || event.isCharacters()){
return true;
}else{
return false;
}
}
}
);
while (reader.hasNext()) {
XMLEvent event = reader.nextEvent();
//通過XMLEvent來判斷節點型別
if(event.isStartElement()){
//轉換節點
String name = event.asStartElement().getName().toString();
if(name.equals("title")){
//通過reader來獲取節點的文字
System.out.print(reader.getElementText() + ": ");
}
}
}
四、附錄
<?xml version="1.0" encoding="utf-8"?>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
相關文章
- Stax處理XML(一)——基於游標的查詢XML
- XML - JAXB示例XML
- 批量拆分XML文件示例KGXML
- XML - Schema之基礎示例XML
- 單一XML文件拆分示例SHXML
- 使用Digester解析XML文件示例 (轉)XML
- JDK6.0的新特性之三:理解StAXJDK
- XML Schema 複雜元素型別詳解:定義及示例解析XML型別
- 最全MyBatis中XML對映檔案(Mapper)標籤分析及示例MyBatisXMLAPP
- 越來越強大的SAFS/STAF/STAX自動化測試框架框架
- XMLXML
- Python解析xml[xml.dom]PythonXML
- XML進階:Level 1 – XML簡介XML
- XML資料島(XML Data Island) (轉)XML
- XML入門指南(4)XML元素(轉)XML
- 示例
- Xml解析XML
- XML操作XML
- 操作XMLXML
- xml 操作XML
- [CareerCup] 17.10 Encode XML 編碼XMLXML
- 讀取xml檔案 解析雙層xmlXML
- XML入門指南(18)XML行為(轉)XML
- XML入門指南(15)XML編碼(轉)XML
- XML入門指南(6)XML確認(轉)XML
- XML入門指南(3)XML語法(轉)XML
- XML入門指南(1)XML簡介(轉)XML
- XML 程式設計思想:XML語義(轉)XML程式設計
- XML 程式設計思想:XML和語義:XML 會兌現其承諾嗎?(轉)XML程式設計
- PHP xml 轉陣列 陣列轉 xml 操作PHPXML陣列
- Java - XML字元支援報錯An invalid XML characterJavaXML字元
- Python操作xml檔案(xml.etree.ElementTree)PythonXML
- 用c#生成xml字串及解析xml字串C#XML字串
- XML入門指南(17)XML HTTP 請求(轉)XMLHTTP
- XML入門指南(7)XML瀏覽器(轉)XML瀏覽器
- XML 程式設計思想:XML和語義(轉)XML程式設計
- XML 程式設計思想: 研讀XML Hacks(轉)XML程式設計
- XML 程式設計思想: XML 語義錨(轉)XML程式設計