Java 解析 String XML 的几种方法
在 Java 中解析存储在 String 中的 XML 数据,有几种常用的方法,以下是几种主要的技术方案:

使用 DOM 解析器
DOM 解析器将整个 XML 文档加载到内存中,形成树形结构。
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public class DomParser {
public static void parseXmlString(String xmlString) {
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("book");
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
String title = element.getElementsByTagName("title").item(0).getTextContent();
String author = element.getElementsByTagName("author").item(0).getTextContent();
System.out.println("Book Title: " + title);
System.out.println("Book Author: " + author);
}
}
} 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 SaxParser {
public static void parseXmlString(String xmlString) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
boolean inTitle = false;
boolean inAuthor = false;
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) {
if (qName.equalsIgnoreCase("title")) {
inTitle = true;
}
if (qName.equalsIgnoreCase("author")) {
inAuthor = true;
}
}
@Override
public void characters(char[] ch, int start, int length) {
if (inTitle) {
System.out.println("Book Title: " + new String(ch, start, length));
inTitle = false;
}
if (inAuthor) {
System.out.println("Book Author: " + new String(ch, start, length));
inAuthor = false;
}
}
};
saxParser.parse(new InputSource(new StringReader(xmlString)), handler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用 JAXB (Java Architecture for XML Binding)
JAXB 提供了将 XML 绑定到 Java 对象的功能。
首先定义与 XML 对应的 Java 类:

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlRootElement
public class Library {
private List<Book> books;
@XmlElement(name = "book")
public List<Book> getBooks() {
return books;
}
public void setBooks(List<Book> books) {
this.books = books;
}
}
public class Book {
private String title;
private String author;
@XmlElement
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@XmlElement
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
然后使用 JAXB 解析:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
public class JaxbParser {
public static void parseXmlString(String xmlString) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Library.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Library library = (Library) unmarshaller.unmarshal(new StringReader(xmlString));
for (Book book : library.getBooks()) {
System.out.println("Book Title: " + book.getTitle());
System.out.println("Book Author: " + book.getAuthor());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用 StAX (Streaming API for XML)
StAX 提供了类似 SAX 的流式处理,但更易于使用。
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.io.StringReader;
public class StaxParser {
public static void parseXmlString(String xmlString) {
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory.createXMLStreamReader(new StringReader(xmlString));
String title = null;
String author = null;
while (reader.hasNext()) {
int event = reader.next();
switch (event) {
case XMLStreamConstants.START_ELEMENT:
if ("title".equals(reader.getLocalName())) {
title = reader.getElementText();
} else if ("author".equals(reader.getLocalName())) {
author = reader.getElementText();
}
break;
case XMLStreamConstants.END_ELEMENT:
if ("book".equals(reader.getLocalName())) {
System.out.println("Book Title: " + title);
System.out.println("Book Author: " + author);
title = null;
author = null;
}
break;
}
}
} catch (XMLStreamException e) {
e.printStackTrace();
}
}
}
示例 XML
解析器可以处理如下格式的 XML:
<library>
<book>
<title>Java Programming</title>
<author>John Doe</author>
</book>
<book>
<title>XML Processing</title>
<author>Jane Smith</author>
</book>
</library>
选择建议
- DOM: 适合小型 XML 文档,需要随机访问节点
- SAX: 适合大型 XML 文档,内存占用小
- JAXB: 适合需要将 XML 直接映射到 Java 对象的场景
- StAX: 介于 SAX 和 DOM 之间,提供更好的控制且内存效率高
根据你的具体需求选择最适合的解析方法。

