Java中的XML处理:DOM、SAX、StAX和JAXB
XML(可扩展标记语言)仍然是存储和传输结构化数据的关键格式之一。在Java中,有几种内置且流行的库用于处理XML。在本文中,我们将介绍所有主要方法:从经典的DOM和SAX到现代的JAXB。
1. DOM(文档对象模型)— 对文档的完全访问
DOM解析器将整个XML文档以树状结构加载到内存中。这提供了对文档的完全控制:可以读取、修改、删除和添加节点。
DOM的优点:
- 对文档中任何元素的随机访问
- 能够修改XML结构
- 直观的对象模型
缺点:
- 高内存消耗(整个文档在RAM中)
- 处理大文件时速度慢
DOM使用示例:
import javax.xml.parsers.*;import org.w3c.dom.*;import java.io.*;
public class DomExample { public static void main(String[] args) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new File("books.xml"));
NodeList bookList = document.getElementsByTagName("book"); for (int i = 0; i < bookList.getLength(); i++) { Element book = (Element) bookList.item(i); String title = book.getElementsByTagName("title").item(0).getTextContent(); String author = book.getElementsByTagName("author").item(0).getTextContent(); System.out.println(title + " — " + author); } }}2. SAX(XML简单API)— 流式解析
SAX是一种事件驱动的解析器。它顺序读取XML,并在遇到开始/结束标签、文本或属性时调用回调方法。内存消耗最小。
何时使用SAX:
- 巨大的XML文件(数百兆字节)
- 仅读取,不修改
- 设备资源有限
SAX解析器示例:
import org.xml.sax.*;import org.xml.sax.helpers.*;import javax.xml.parsers.*;
public class SaxExample { public static void main(String[] args) throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() { boolean isTitle = false;
public void startElement(String uri, String localName, String qName, Attributes attributes) { if (qName.equalsIgnoreCase("title")) isTitle = true; }
public void characters(char ch[], int start, int length) { if (isTitle) { System.out.println("Title: " + new String(ch, start, length)); isTitle = false; } } };
saxParser.parse("books.xml", handler); }}3. StAX(XML流式API)— 便捷的流式解析
StAX是DOM和SAX之间的折衷方案。它同样以流模式工作,但提供了更便捷的拉取接口(您自己请求下一个元素)。
使用StAX的两种方式:
- XMLStreamReader — 用于读取
- XMLStreamWriter — 用于写入
import javax.xml.stream.*;import java.io.*;
public class StaxExample { public static void main(String[] args) throws Exception { XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader reader = factory.createXMLStreamReade