在 Java 中,解析 XML 文件有多种方式可供选择。以下是几种常见的 XML 文件解析方式,以及每种方式的步骤流程和示例代码。
假设我们有以下的 XML 文件(名为 "data.xml")作为示例:
<root>
<person id="1">
<name>John</name>
<age>30</age>
</person>
<person id="2">
<name>Jane</name>
<age>25</age>
</person>
</root>
DOM 解析方式将整个 XML 文档加载到内存中,以树状结构表示。它允许你在内存中直接访问 XML 的节点,并且支持增删改操作。
步骤流程:
DocumentBuilderFactory
对象。DocumentBuilderFactory
创建一个 DocumentBuilder
对象。DocumentBuilder
解析 XML 文件,生成一个 Document
对象。Document
对象开始遍历 XML 树,通过节点间的关系获取需要的信息。示例代码:
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class DOMParserExample {
public static void main(String[] args) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("data.xml");
NodeList personList = document.getElementsByTagName("person");
for (int i = 0; i < personList.getLength(); i++) {
Element person = (Element) personList.item(i);
String id = person.getAttribute("id");
String name = person.getElementsByTagName("name").item(0).getTextContent();
String age = person.getElementsByTagName("age").item(0).getTextContent();
System.out.println("Person ID: " + id);
System.out.println("Name: " + name);
System.out.println("Age: " + age);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
SAX 解析方式是基于事件驱动的解析方式,它逐行扫描 XML 文档并触发相应的事件处理器。
步骤流程:
DefaultHandler
的事件处理器类,重写需要的事件处理方法。SAXParserFactory
对象。SAXParserFactory
创建一个 SAXParser
对象。SAXParser
中。SAXParser
解析 XML 文件,触发事件处理器的相应方法。示例代码:
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
public class SAXParserExample {
public static void main(String[] args) {
try {
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
xmlReader.setContentHandler(new MyHandler());
xmlReader.parse(new InputSource("data.xml"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
class MyHandler extends DefaultHandler {
private boolean inPerson = false;
private String id, name, age;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equals("person")) {
inPerson = true;
id = attributes.getValue("id");
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (inPerson) {
String data = new String(ch, start, length);
if ("name".equals(currentElement)) {
name = data;
} else if ("age".equals(currentElement)) {
age = data;
}
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equals("person")) {
inPerson = false;
System.out.println("Person ID: " + id);
System.out.println("Name: " + name);
System.out.println("Age: " + age);
}
}
}
JAXB 是 Java 中的一个标准 API,用于将 XML 数据绑定到 Java 对象上,实现 XML 和 Java 对象之间的映射。
步骤流程:
JAXBContext
对象,指定要绑定的 Java 类。JAXBContext
创建一个 Unmarshaller
对象。Unmarshaller
的 unmarshal
方法将 XML 文件解组成 Java 对象。示例代码:
import javax.xml.bind.*;
import java.io.*;
@XmlRootElement
class Person {
@XmlAttribute
String id;
String name;
String age;
}
public class JAXBParserExample {
public static void main(String[] args) {
try {
JAXBContext context = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Person person1 = (Person) unmarshaller.unmarshal(new File("data.xml"));
System.out.println("Person ID: " + person1.id);
System.out.println("Name: " + person1.name);
System.out.println("Age: " + person1.age);
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上是三种常见的 XML 文件解析方式。每种方式都有其优缺点,根据你的需求选择最合适的方式。