XML解析–Stax
- Streaming API for XML
– 流模型中的拉模型 (Pull)
– 在遍歷文檔時,會把感興趣的部分從讀取器中拉出,不需要引發事件,允許我們選擇性地處理節點。這大大提高了靈活性,以及整體效率。
– 兩套處理API
- 基於指針的API,XMLStreamReader
- 基於迭代器的API,XMLEventReader
XML解析–Stax實例
books.xml
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<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">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
<book category="JS">
<title lang="en">java script從入門到放棄</title>
<author>torey</author>
<year>2018</year>
<price>39.95</price>
</book>
</bookstore>
package com.torey.javaAdvanced.mooc4.stax;
import javax.xml.stream.*;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Iterator;
/**
* @ClassName:StaxReader
* @Description:189
* @author: Torey
*/
public class StaxReader {
public static void main(String[] args) throws XMLStreamException {
System.out.println("基於指針");
readByStream();
System.out.println("基於迭代器");
readByEvent();
}
//流模式-基於指針API
public static void readByStream() throws XMLStreamException {
String xmlFile="books.xml";
XMLInputFactory factory = XMLInputFactory.newFactory();
XMLStreamReader streamReader=null;
try {
streamReader = factory.createXMLStreamReader(new FileReader(xmlFile));
} catch (XMLStreamException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//基於指針遍歷
while (streamReader.hasNext()) {
int event = streamReader.next();
//如果是元素的開始
if (event==XMLStreamConstants.START_ELEMENT) {
//列出所有書籍名稱
if ("title".equalsIgnoreCase(streamReader.getLocalName())) {
System.out.println("title:" + streamReader.getElementText());
}
}
}
streamReader.close();
}
//基於迭代器的API
public static void readByEvent(){
String xmlFile="books.xml";
XMLInputFactory factory = XMLInputFactory.newInstance();
boolean titleFlag=false;
try {
//創建基於迭代器的事件讀取器對象
XMLEventReader eventReader = factory.createXMLEventReader(new FileReader(xmlFile));
//遍歷Event迭代器
while (eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
//如果事件對象是元素的開始
if (event.isStartElement()) {
//轉換成開始元素事件對象
StartElement start = event.asStartElement();
// 打印元素標籤的本地名稱
String name = start.getName().getLocalPart();
if (name.equals("title")) {
titleFlag=true;
System.out.println("title:");
}
//取得所有屬性
Iterator attrs = start.getAttributes();
while (attrs.hasNext()) {
Attribute attr= (Attribute)attrs.next();
}
}
//如果是正文
if (event.isCharacters()) {
String s = event.asCharacters().getData();
if (s!=null&&s.trim().length()>0&&titleFlag) {
System.out.println(s.trim());
}
}
//如果事件對象是元素的結束
if (event.isEndElement()) {
EndElement end = event.asEndElement();
String name = end.getName().getLocalPart();
if (name.equals("title")) {
titleFlag=false;
}
}
}
eventReader.close();
}catch (Exception ex){
}
}
}
其他的第三方庫
- DOM/SAX/Stax是JDK自帶的解析功能
- 第三方庫
– JDOM:www.jdom.org
– DOM4J: dom4j.github.io - 第三方庫一般都包含DOM,SAX等多個方式解析,是對Java解析進行封裝