Java 读取XML文件内容的方法
在Java中,有几种常见的方法可以读取XML文件内容,以下是几种主流的实现方式:

使用DOM解析器
DOM解析器将整个XML文档加载到内存中,形成树形结构,适合小型XML文件。
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.File;
public class DomParserExample {
public static void main(String[] args) {
try {
// 创建DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析XML文件
Document document = builder.parse(new File("example.xml"));
// 获取根元素
Element root = document.getDocumentElement();
System.out.println("Root element: " + root.getNodeName());
// 获取所有子节点
NodeList nodeList = root.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
System.out.println("Element: " + element.getNodeName());
System.out.println("Value: " + element.getTextContent());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用SAX解析器
SAX解析器是事件驱动的,适合处理大型XML文件,因为它不会将整个文档加载到内存中。
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
public class SaxParserExample {
public static void main(String[] args) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
boolean inElement = false;
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) {
System.out.println("Start element: " + qName);
inElement = true;
}
@Override
public void endElement(String uri, String localName, String qName) {
System.out.println("End element: " + qName);
inElement = false;
}
@Override
public void characters(char[] ch, int start, int length) {
if (inElement) {
System.out.println("Value: " + new String(ch, start, length));
}
}
};
saxParser.parse(new File("example.xml"), handler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用JAXB (Java Architecture for XML Binding)
JAXB可以将XML数据直接映射到Java对象。
首先定义与XML对应的Java类:

import javax.xml.bind.annotation.*;
import java.util.List;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Book {
private String title;
private String author;
private double price;
// getters and setters
}
然后使用JAXB解析:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.File;
public class JaxbExample {
public static void main(String[] args) {
try {
JAXBContext context = JAXBContext.newInstance(Book.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Book book = (Book) unmarshaller.unmarshal(new File("book.xml"));
System.out.println("Title: " + book.getTitle());
System.out.println("Author: " + book.getAuthor());
System.out.println("Price: " + book.getPrice());
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用StAX (Streaming API for XML)
StAX是一种流式XML解析API,介于DOM和SAX之间。
import javax.xml.stream.*;
import java.io.FileReader;
public class StaxExample {
public static void main(String[] args) {
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader eventReader = factory.createXMLEventReader(new FileReader("example.xml"));
while (eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
if (event.isStartElement()) {
String elementName = event.asStartElement().getName().getLocalPart();
System.out.println("Start element: " + elementName);
} else if (event.isEndElement()) {
String elementName = event.asEndElement().getName().getLocalPart();
System.out.println("End element: " + elementName);
} else if (event.isCharacters()) {
String text = event.asCharacters().getData().trim();
if (!text.isEmpty()) {
System.out.println("Value: " + text);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用第三方库(如DOM4J)
DOM4J是一个功能强大的第三方XML处理库:
import org.dom4j.*;
import org.dom4j.io.SAXReader;
import java.io.File;
public class Dom4jExample {
public static void main(String[] args) {
try {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("example.xml"));
Element root = document.getRootElement();
System.out.println("Root element: " + root.getName());
for (Iterator<Element> it = root.elementIterator(); it.hasNext(); ) {
Element element = it.next();
System.out.println("Element: " + element.getName());
System.out.println("Value: " + element.getText());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
| 解析方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| DOM | 简单易用,可随机访问 | 内存占用大 | 小型XML文件 |
| SAX | 内存占用小,速度快 | 只能顺序访问,编程复杂 | 大型XML文件 |
| JAXB | 自动映射到Java对象 | 需要定义Java类 | 需要将XML转换为Java对象 |
| StAX | 内存效率高,可读写 | 比SAX复杂 | 需要流式处理XML |
| DOM4J | 功能强大,易用 | 需要额外依赖 | 复杂XML处理 |
选择哪种方法取决于你的具体需求,如XML文件大小、性能要求以及是否需要将XML映射到Java对象等。
