Java XML解析
解析 XML 文件是一项常见的任务,通常用于处理配置文件、数据交换等场景。以下是几种常用的 XML 解析方法及其特点:
1. DOM 解析
DOM(Document Object Model)将整个 XML 文档加载到内存中,形成树状结构,便于随机访问和修改。适合处理小型 XML 文件。
- 优点:操作简单,支持随机访问。
- 缺点:占用内存较大,不适合处理大型文件。
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.File;
public class DOMExample {
public static void main(String[] args) {
try {
File xmlFile = new File("person.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(xmlFile);
doc.getDocumentElement().normalize();
System.out.println("Root element: " + doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("name");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println("Name: " + eElement.getTextContent());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. SAX 解析
SAX(Simple API for XML)是一种基于事件的解析器,逐行读取 XML 文件,适合处理大型文件。
- 优点:内存占用小,解析速度快。
- 缺点:只能顺序访问,不支持随机访问。
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.*;
public class SAXExample {
public static void main(String[] args) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("Start Element: " + qName);
}
};
saxParser.parse(new File("person.xml"), handler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. JAXB 解析
JAXB(Java Architecture for XML Binding)用于将 XML 数据绑定到 Java 对象,适合处理结构化数据。
- 优点:自动映射,简化代码。
- 缺点:需要提前定义 Java 类。
import javax.xml.bind.*;
import java.io.StringReader;
public class JAXBExample {
public static void main(String[] args) {
String xmlData = "<?xml version='1.0' encoding='UTF-8'?><person><name>John Doe</name><age>30</age></person>";
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Person person = (Person) jaxbUnmarshaller.unmarshal(new StringReader(xmlData));
System.out.println(person.getName());
System.out.println(person.getAge());
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
4. StAX 解析
StAX(Streaming API for XML)结合了 DOM 和 SAX 的优点,支持流式读取和写入。
- 优点:内存效率高,灵活性好。
- 缺点:代码复杂度较高。
import javax.xml.stream.*;
import java.io.FileInputStream;
public class StAXExample {
public static void main(String[] args) {
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream("person.xml"));
while (reader.hasNext()) {
int event = reader.next();
if (event == XMLStreamConstants.START_ELEMENT) {
System.out.println("Start Element: " + reader.getLocalName());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
5. 第三方库(如 DOM4J、XStream)
- DOM4J:提供了更简洁的 API,适合复杂的 XML 操作。
- XStream:支持将 Java 对象与 XML 互相转换,适合序列化和反序列化。
总结
- 对于小型 XML 文件,推荐使用 DOM 或 JAXB。
- 对于大型 XML 文件,推荐使用 SAX 或 StAX。
- 如果需要灵活的对象映射,可以使用 XStream 或 DOM4J。