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

使用DOM解析器
DOM(Document Object Model)将整个XML文档加载到内存中,形成一个树形结构,便于随机访问。
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
public class DomParserExample {
public static void main(String[] args) {
String xmlString = "<root><person><name>John</name><age>30</age></person></root>";
try {
// 创建DocumentBuilder
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// 将字符串转换为输入流
InputStream inputStream = new ByteArrayInputStream(xmlString.getBytes());
// 解析XML
Document document = builder.parse(inputStream);
// 获取根元素
Element root = document.getDocumentElement();
System.out.println("Root element: " + root.getNodeName());
// 获取person元素
NodeList personList = root.getElementsByTagName("person");
Node personNode = personList.item(0);
if (personNode.getNodeType() == Node.ELEMENT_NODE) {
Element personElement = (Element) personNode;
// 获取name元素
NodeList nameList = personElement.getElementsByTagName("name");
Element nameElement = (Element) nameList.item(0);
String name = nameElement.getTextContent();
// 获取age元素
NodeList ageList = personElement.getElementsByTagName("age");
Element ageElement = (Element) ageList.item(0);
String age = ageElement.getTextContent();
System.out.println("Name: " + name);
System.out.println("Age: " + age);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用SAX解析器
SAX(Simple API for XML)是事件驱动的解析器,它逐行读取XML文档,触发相应的事件。
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
import java.io.*;
public class SaxParserExample {
public static void main(String[] args) {
String xmlString = "<root><person><name>John</name><age>30</age></person></root>";
try {
// 创建SAX解析器
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
// 创建自定义的Handler
DefaultHandler handler = new DefaultHandler() {
boolean inName = false;
boolean inAge = false;
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) {
if (qName.equalsIgnoreCase("name")) {
inName = true;
}
if (qName.equalsIgnoreCase("age")) {
inAge = true;
}
}
@Override
public void characters(char[] ch, int start, int length) {
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;
}
}
};
// 解析XML
InputStream inputStream = new ByteArrayInputStream(xmlString.getBytes());
saxParser.parse(inputStream, handler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用StAX解析器
StAX(Streaming API for XML)是Java 6引入的API,提供了类似SAX的流式处理,但允许应用程序控制解析过程。
import javax.xml.stream.*;
import java.io.*;
public class StaxParserExample {
public static void main(String[] args) {
String xmlString = "<root><person><name>John</name><age>30</age></person></root>";
try {
// 创建XMLInputFactory
XMLInputFactory factory = XMLInputFactory.newInstance();
// 创建XMLEventReader
InputStream inputStream = new ByteArrayInputStream(xmlString.getBytes());
XMLEventReader eventReader = factory.createXMLEventReader(inputStream);
String name = null;
String age = null;
// 遍历事件
while (eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
if (event.isStartElement()) {
String elementName = event.asStartElement().getName().getLocalPart();
if (elementName.equals("name")) {
name = eventReader.nextEvent().asCharacters().getData();
} else if (elementName.equals("age")) {
age = eventReader.nextEvent().asCharacters().getData();
}
}
}
System.out.println("Name: " + name);
System.out.println("Age: " + age);
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用第三方库(如JDOM或DOM4J)
除了Java内置的XML解析器,还可以使用第三方库如JDOM或DOM4J,它们提供了更简洁的API。

使用JDOM示例
import org.jdom2.*;
import org.jdom2.input.*;
import java.io.*;
public class JdomParserExample {
public static void main(String[] args) {
String xmlString = "<root><person><name>John</name><age>30</age></person></root>";
try {
// 创建SAXBuilder
SAXBuilder builder = new SAXBuilder();
// 从字符串构建Document
Document document = builder.build(new StringReader(xmlString));
// 获取根元素
Element root = document.getRootElement();
// 获取person元素
Element person = root.getChild("person");
// 获取name和age
String name = person.getChildText("name");
String age = person.getChildText("age");
System.out.println("Name: " + name);
System.out.println("Age: " + age);
} catch (Exception e) {
e.printStackTrace();
}
}
}
选择哪种方法?
- DOM:适合小型XML文档,需要随机访问或多次处理数据
- SAX:适合大型XML文档,内存占用小,但只能顺序处理
- StAX:介于DOM和SAX之间,提供了更好的控制
- JDOM/DOM4J:提供了更简洁的API,开发效率更高
根据你的具体需求选择合适的解析方法。
