Java 解析 String XML 的方法
在 Java 中解析存储在 String 中的 XML 数据,有多种方法可以实现,以下是几种常用的方法:

使用 DOM 解析器
DOM 解析器将整个 XML 文档加载到内存中,形成树形结构。
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public class DomParserExample {
public static void main(String[] args) {
String xmlString = "<root><person><name>John</name><age>30</age></person></root>";
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(xmlString)));
document.getDocumentElement().normalize();
NodeList nodeList = document.getElementsByTagName("person");
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
String name = element.getElementsByTagName("name").item(0).getTextContent();
String age = element.getElementsByTagName("age").item(0).getTextContent();
System.out.println("Name: " + name);
System.out.println("Age: " + age);
}
} 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.StringReader;
public class SaxParserExample {
public static void main(String[] args) {
String xmlString = "<root><person><name>John</name><age>30</age></person></root>";
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
boolean name = false;
boolean age = false;
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("name")) {
name = true;
}
if (qName.equalsIgnoreCase("age")) {
age = true;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (name) {
System.out.println("Name: " + new String(ch, start, length));
name = false;
}
if (age) {
System.out.println("Age: " + new String(ch, start, length));
age = false;
}
}
};
saxParser.parse(new InputSource(new StringReader(xmlString)), handler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用 JAXB (Java Architecture for XML Binding)
JAXB 可以将 XML 直接映射到 Java 对象。
首先定义 Java 类:

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Person {
private String name;
private int age;
@XmlElement
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
然后解析 XML:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
public class JaxbParserExample {
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();
}
}
}
使用 StAX (Streaming API for XML)
StAX 提供了基于游标的 API,介于 DOM 和 SAX 之间。
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.events.XMLEvent;
import java.io.StringReader;
public class StaxParserExample {
public static void main(String[] args) {
String xmlString = "<root><person><name>John</name><age>30</age></person></root>";
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader eventReader = factory.createXMLEventReader(new StringReader(xmlString));
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();
}
}
}
选择哪种方法?
- DOM: 适合小型 XML 文档,需要频繁访问和修改数据
- SAX: 适合大型 XML 文档,内存占用小,但只能顺序读取
- JAXB: 适合需要将 XML 直接映射到 Java 对象的场景
- StAX: 介于 DOM 和 SAX 之间,提供了更好的控制且内存效率较高
根据你的具体需求选择合适的解析方法。

