Java 解析 XML 字符串
在 Java 中解析 XML 字符串有多种方法,以下是几种常见的实现方式:

使用 DOM 解析器
DOM(Document Object Model)将整个 XML 文档加载到内存中,形成树形结构。
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.ByteArrayInputStream;
public class DomXmlParser {
public static void main(String[] args) {
String xmlString = "<root><name>John</name><age>30</age></root>";
try {
// 创建 DocumentBuilder
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析 XML 字符串
Document document = builder.parse(new ByteArrayInputStream(xmlString.getBytes()));
// 获取根元素
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.getNodeName() + ": " + element.getTextContent());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用 SAX 解析器
SAX(Simple API for XML)是事件驱动的解析器,适合处理大型 XML 文件。
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.ByteArrayInputStream;
public class SaxXmlParser {
public static void main(String[] args) {
String xmlString = "<root><name>John</name><age>30</age></root>";
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
XMLReader reader = saxParser.getXMLReader();
reader.setContentHandler(new CustomHandler());
reader.parse(new InputSource(new ByteArrayInputStream(xmlString.getBytes())));
} catch (Exception e) {
e.printStackTrace();
}
}
}
class CustomHandler extends DefaultHandler {
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) {
System.out.println("Start element: " + qName);
}
@Override
public void endElement(String uri, String localName, String qName) {
System.out.println("End element: " + qName);
}
@Override
public void characters(char[] ch, int start, int length) {
String content = new String(ch, start, length).trim();
if (!content.isEmpty()) {
System.out.println("Content: " + content);
}
}
}
使用 JAXB (Java Architecture for XML Binding)
JAXB 可以将 XML 与 Java 对象进行绑定。
首先需要添加 JAXB 依赖(Java 9+ 需要单独添加):
<!-- Maven 依赖 -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
</dependency>
然后使用 JAXB 解析:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
// 定义对应的 Java 类
class Person {
private String name;
private int age;
// getters and setters
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
public class JaxbXmlParser {
public static void main(String[] args) {
String xmlString = "<person><name>John</name><age>30</age></person>";
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Person person = (Person) unmarshaller.unmarshal(new StringReader(xmlString));
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用第三方库(如 Jackson 或 Gson)
使用 Jackson
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.io.StringReader;
public class JacksonXmlParser {
public static void main(String[] args) {
String xmlString = "<person><name>John</name><age>30</age></person>";
try {
XmlMapper xmlMapper = new XmlMapper();
Person person = xmlMapper.readValue(xmlString, Person.class);
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
} catch (Exception e) {
e.printStackTrace();
}
// 需要添加 Jackson XML 模块依赖
}
}
使用 Gson
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import java.io.StringReader;
public class GsonXmlParser {
public static void main(String[] args) {
String xmlString = "<person><name>John</name><age>30</age></person>";
try {
JsonReader reader = new JsonReader(new StringReader(xmlString));
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("name")) {
System.out.println("Name: " + reader.nextString());
} else if (name.equals("age")) {
System.out.println("Age: " + reader.nextInt());
} else {
reader.skipValue();
}
}
reader.endObject();
} catch (Exception e) {
e.printStackTrace();
}
// 需要添加 Gson 依赖
}
}
- DOM:适合小型 XML 文档,内存占用大但操作灵活
- SAX:适合大型 XML 文档,内存占用小但只能顺序读取
- JAXB:适合将 XML 与 Java 对象映射,代码简洁
- 第三方库:如 Jackson、Gson 等,提供了更灵活的解析方式
选择哪种方法取决于你的具体需求,如 XML 文件大小、性能要求和代码简洁性等。
