Java StAX解析
什么是StAX?
StAX(Streaming API for XML)是Java平台中处理XML文档的一种API,它填补了DOM(Document Object Model)和SAX(Simple API for XML)之间的空白,提供了一种更加灵活高效的XML处理方式。
StAX是一种"拉式"解析API,这意味着客户端应用程序可以控制何时从解析器获取XML数据,而不是像SAX那样被动接收事件。这种控制方式使得StAX在很多场景下比SAX和DOM更加实用。
提示
StAX是JDK 6及以上版本的标准组件,你无需导入额外的依赖库即可使用它!
StAX API的优势
- 内存效率:与DOM相比,StAX不需要将整个文档加载到内存
- 控制权:与SAX不同,StAX允许开发者控制解析过程
- 双向性:不仅可以读取XML,还可以很方便地创建XML
- 简单易学:API设计直观,比SAX更容易掌握
StAX的两种API
StAX提供了两种级别的API:
- Cursor API:提供类似指针的方式遍历XML文档
- Event Iterator API:将XML文档看作一系列事件,可以迭代这些事件
本文将主要介绍更为常用的Cursor API。
使用StAX读取XML
准备工作
首先,让我们准备一个简单的XML文件进行解析。假设我们有以下books.xml
文件:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="1">
<title>Java编程思想</title>
<author>Bruce Eckel</author>
<year>2006</year>
<price>128.00</price>
</book>
<book id="2">
<title>Effective Java</title>
<author>Joshua Bloch</author>
<year>2018</year>
<price>79.00</price>
</book>
</books>
基本读取操作
以下是使用StAX Cursor API解析上述XML文件的基本代码:
import java.io.FileInputStream;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
public class StAXCursorExample {
public static void main(String[] args) {
try {
// 创建XMLInputFactory
XMLInputFactory factory = XMLInputFactory.newInstance();
// 创建XMLStreamReader
XMLStreamReader reader =
factory.createXMLStreamReader(new FileInputStream("books.xml"));
// 遍历XML文档
while(reader.hasNext()) {
int event = reader.next();
// 根据事件类型处理
switch(event) {
case XMLStreamConstants.START_ELEMENT:
System.out.println("开始元素: " + reader.getLocalName());
// 处理属性
if ("book".equals(reader.getLocalName())) {
for (int i = 0; i < reader.getAttributeCount(); i++) {
System.out.println("属性: " +
reader.getAttributeName(i) + "=" +
reader.getAttributeValue(i));
}
}
break;
case XMLStreamConstants.CHARACTERS:
String text = reader.getText().trim();
if (!text.isEmpty()) {
System.out.println("文本内容: " + text);
}
break;
case XMLStreamConstants.END_ELEMENT:
System.out.println("结束元素: " + reader.getLocalName());
break;
}
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果:
开始元素: books
开始元素: book
属性: id=1
开始元素: title
文本内容: Java编程思想
结束元素: title
开始元素: author
文本内容: Bruce Eckel
结束元素: author
开始元素: year
文本内容: 2006
结束元素: year
开始元素: price
文本内容: 128.00
结束元素: price
结束元素: book
开始元素: book
属性: id=2
开始元素: title
文本内容: Effective Java
结束元素: title
开始元素: author
文本内容: Joshua Bloch