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解析进行封装