Java中的XML处理:DOM、SAX、StAX和JAXB
XML(可扩展标记语言)仍然是存储和传输结构化数据的关键格式之一。在Java中,有几种处理XML的方式,每种方式适用于不同的任务:从读取小型配置文件到处理GB级文件。在本文中,我们将介绍四种主要方法:DOM、SAX、StAX和JAXB。
1. DOM(文档对象模型)—— 完全加载到内存
DOM解析器将整个XML文档加载到内存中,创建树状结构。这便于导航和修改,但对于大文件效率不高。
使用DOM读取XML的示例:
import javax.xml.parsers.*;import org.w3c.dom.*;
public class DomExample { public static void main(String[] args) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("books.xml");
NodeList bookList = doc.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); } }}- 优点:方便访问任何节点,支持XPath,可以修改文档。
- 缺点:占用大量内存,处理大文件时速度慢。
- 适用场景:配置文件、小型文档(几MB以内)。
2. SAX(XML简单API)—— 事件驱动的流式解析器
SAX顺序读取XML并生成事件(元素开始、文本、元素结束)。您只处理需要的事件——这允许处理任意大小的文件。
使用SAX处理XML的示例:
import org.xml.sax.*;import org.xml.sax.helpers.*;import javax.xml.parsers.*;
public class SaxExample extends DefaultHandler { private boolean inTitle = false;
public void startElement(String uri, String localName, String qName, Attributes attrs) { if (qName.equals("title")) inTitle = true; }
public void characters(char[] ch, int start, int length) { if (inTitle) System.out.println("书名: " + new String(ch, start, length)); }
public void endElement(String uri, String localName, String qName) { if (qName.equals("title")) inTitle = false; }
public static void main(String[] args) throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); parser.parse("books.xml", new SaxExample()); }}- 优点:内存占用极小,速度快。
- 缺点:无法返回前一个元素,难以修改文档。
- 适用场景:大型XML文件(日志、数据库转储、报告)。
3. StAX(XML流式API)—— 游标控制的流式解析器
StAX是SAX的更现代替代方案。您自己控制读取,通过移动游标在XML流中前进。有两种模式:Cursor API(事件迭代器)和Event API(事件处理)。
使用Cursor API(XMLStreamReader)的示例:
import javax.xml.stream.*;
public class StaxExample { public static void main(String[] args) throws Exceptio