JDK6.0的新特性之三:理解StAX
StAX()是JDK6.0中除了DOM和SAX之外的又一種處理XML文件的API
StAX的來歷
在JAXP1.3()有兩種處理XML文件的方法:DOM(Document Object Model)和SAX(Simple API for XML).由於JDK6.0中的JAXB2()和JAX-WS 2.0()都會用到StAX所以Sun決定把StAX加入到JAXP家族當中來,並將JAXP的版本升級到1.4(JAXP1.4是JAXP1.3的維護版本). JDK6裡面JAXP的版本就是1.4.
StAX簡介
StAX是The Streaming API for XML的縮寫,一種利用拉模式解析(pull-parsing)XML文件的API.StAX透過提供一種基於事件迭代器(Iterator)的API讓程式設計師去控制xml文件解析過程,程式遍歷這個事件迭代器去處理每一個解析事件,解析事件可以看做是程式拉出來的,也就是程式促使解析器產生一個解析事件然後處理該事件,之後又促使解析器產生下一個解析事件,如此迴圈直到碰到文件結束符;SAX也是基於事件處理xml文件,但卻是用推模式解析,解析器解析完整個xml文件後,才產生解析事件,然後推給程式去處理這些事件;DOM採用的方式是將整個xml文件對映到一顆記憶體樹,這樣就可以很容易地得到父節點和子結點以及兄弟節點的資料,但如果文件很大,將會嚴重影響效能。下面是這幾種API的比較(轉載自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程式碼演示
下面程式碼演示瞭如何透過StAX讀取xml文件和生成xml文件
public class StaxTester {
public static void main(String[] args) throws XMLStreamException, FileNotFoundException {
readXMLByStAX();//用XMLEventReader解析xml文件
writeXMLByStAX();//用XMLStreamWriter寫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()) { //如果解析的是起始標記 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()) { //如果解析的是文字內容
parsingResult.append(event.asCharacters().getData());
} else if(event.isEndElement()){ //如果解析的是結束標記
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"));
// 寫入預設的 XML 宣告到xml文件
xmlw.writeStartDocument();
xmlw.writeCharacters("n");
// 寫入註釋到xml文件
xmlw.writeComment("testing comment");
xmlw.writeCharacters("n");
// 寫入一個catalogs根元素 xmlw.writeStartElement("catalogs");
xmlw.writeNamespace("myNS", "");
xmlw.writeAttribute("owner","Chinajash");
xmlw.writeCharacters("n");
// 寫入子元素catalog
xmlw.writeStartElement("", "catalog");
xmlw.writeAttribute("id","007");
xmlw.writeCharacters("Apparel");
// 寫入catalog元素的結束標籤
xmlw.writeEndElement();
// 寫入catalogs元素的結束標籤
xmlw.writeEndElement();
// 結束 XML 文件 xmlw.writeEndDocument();
xmlw.close();
}
}http://blog.csdn.net/Chinajashhttp://blog.csdn.net/Chinajash
test.xml檔案內容如下:
執行上面程式後,控制檯輸出如下:
執行上面程式後,產生的output.xml檔案如下:
<!-- testing comment-->
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/750220/viewspace-889295/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深入理解 Redis 新特性:StreamRedis
- 深入理解ES8的新特性SharedArrayBuffer
- C# 9.0新特性詳解系列之三:模組初始化器C#
- 深入理解 Java17 新特性:Sealed ClassesJava
- 再來理解一下殺手級新特性:gtid
- 《JavaScript物件導向精要》之三:理解物件JavaScript物件
- 直播與點播之三_測試、理解
- 如何理解CSS中的BFC特性CSS
- 新特性
- Swift 4.1 的新特性Swift
- ES的那些新特性
- 玩轉iOS開發:iOS 11 新特性《Layout的新特性》iOS
- 資料庫設計之三正規化的的理解資料庫
- Java12的新特性Java
- 〔譯〕TypeScript 2.0 的新特性TypeScript
- Go 1.12 版本的新特性Go
- mysql5.1的新特性MySql
- Java 11 的新特性(下)Java
- Java21的新特性Java
- PHP7.0 的新特性PHP
- php7的新特性PHP
- Java8的新特性Java
- JDK8的新特性JDK
- Java10的新特性Java
- C# 10的新特性C#
- Spring Boot 2.6的新特性Spring Boot
- Java20的新特性Java
- Java18的新特性Java
- JDK16的新特性JDK
- React 新特性React
- 新特性介面
- Hadoop新特性Hadoop
- 透徹理解C++11新特性:右值引用、std::move、std::forwardC++Forward
- 理解Mysql索引原理及特性MySql索引
- Java三大特性再理解Java
- .NET 9 的幾個新特性,新穎嗎?
- 新特性:postgresql的vacuum漫談SQL
- 前瞻 PHP8.4 的新特性PHP
- Angular 8的新特性介紹Angular