在Java中解析XML字符串
在Java中解析XML字符串有几种常见方法,下面我将介绍三种主要方式:DOM、SAX和StAX。

使用DOM解析器
DOM解析器将整个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><person id=\"1\"><name>John</name><age>30</age></person></root>";
try {
// 创建DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析XML字符串
Document document = builder.parse(new ByteArrayInputStream(xmlString.getBytes()));
// 获取根元素
Element rootElement = document.getDocumentElement();
System.out.println("Root element: " + rootElement.getNodeName());
// 获取所有person元素
NodeList nodeList = rootElement.getElementsByTagName("person");
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("Person ID: " + element.getAttribute("id"));
// 获取子元素
NodeList childNodes = element.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
Node childNode = childNodes.item(j);
if (childNode.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(childNode.getNodeName() + ": " + childNode.getTextContent());
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用SAX解析器
SAX解析器是事件驱动的,逐行读取XML文档,适合处理大文件。
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
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><person id=\"1\"><name>John</name><age>30</age></person></root>";
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
boolean inName = false;
boolean inAge = false;
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("person")) {
System.out.println("Person ID: " + attributes.getValue("id"));
}
if (qName.equalsIgnoreCase("name")) {
inName = true;
}
if (qName.equalsIgnoreCase("age")) {
inAge = true;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (inName) {
System.out.println("Name: " + new String(ch, start, length));
inName = false;
}
if (inAge) {
System.out.println("Age: " + new String(ch, start, length));
inAge = false;
}
}
};
saxParser.parse(new ByteArrayInputStream(xmlString.getBytes()), handler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用StAX解析器
StAX (Streaming API for XML) 提供了基于游标的读写API,结合了DOM的易用性和SAX的性能。
import javax.xml.stream.*;
import java.io.ByteArrayInputStream;
public class StaxXmlParser {
public static void main(String[] args) {
String xmlString = "<root><person id=\"1\"><name>John</name><age>30</age></person></root>";
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader eventReader = factory.createXMLEventReader(
new ByteArrayInputStream(xmlString.getBytes()));
while (eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
if (event.isStartElement()) {
String elementName = event.asStartElement().getName().getLocalPart();
if (elementName.equals("person")) {
System.out.println("Person ID: " +
event.asStartElement().getAttributeByName(null, "id").getValue());
}
if (elementName.equals("name") || elementName.equals("age")) {
event = eventReader.nextEvent();
System.out.println(elementName + ": " + event.asCharacters().getData());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用第三方库(如JDOM或DOM4J)
这些库提供了更简洁的API:

JDOM示例
import org.jdom2.*;
import org.jdom2.input.SAXBuilder;
import java.io.ByteArrayInputStream;
import java.io.IOException;
public class JdomXmlParser {
public static void main(String[] args) {
String xmlString = "<root><person id=\"1\"><name>John</name><age>30</age></person></root>";
try {
SAXBuilder builder = new SAXBuilder();
Document document = builder.build(new ByteArrayInputStream(xmlString.getBytes()));
Element rootElement = document.getRootElement();
System.out.println("Root element: " + rootElement.getName());
for (Element person : rootElement.getChildren("person")) {
System.out.println("Person ID: " + person.getAttributeValue("id"));
System.out.println("Name: " + person.getChildText("name"));
System.out.println("Age: " + person.getChildText("age"));
}
} catch (JDOMException | IOException e) {
e.printStackTrace();
}
}
}
DOM4J示例
import org.dom4j.*;
import org.dom4j.io.SAXReader;
import java.io.ByteArrayInputStream;
public class Dom4jXmlParser {
public static void main(String[] args) {
String xmlString = "<root><person id=\"1\"><name>John</name><age>30</age></person></root>";
try {
SAXReader reader = new SAXReader();
Document document = reader.read(new ByteArrayInputStream(xmlString.getBytes()));
Element rootElement = document.getRootElement();
System.out.println("Root element: " + rootElement.getName());
for (Element person : rootElement.elements("person")) {
System.out.println("Person ID: " + person.attributeValue("id"));
System.out.println("Name: " + person.elementText("name"));
System.out.println("Age: " + person.elementText("age"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
选择建议
- DOM:适合小型XML文档,需要频繁访问或修改文档结构
- SAX:适合大型XML文档,内存占用少,但只能顺序读取
- StAX:介于DOM和SAX之间,适合需要平衡性能和易用性的场景
- JDOM/DOM4J:提供了更简洁的API,适合快速开发
根据你的具体需求选择最适合的解析方法。

