使用DOM解析XML字符串的Java实现
DOM(Document Object Model)是一种将XML文档加载到内存中并解析为树形结构的方法,下面我将介绍如何使用Java的DOM API来解析XML字符串。

基本步骤
- 创建DocumentBuilderFactory
- 创建DocumentBuilder
- 解析XML字符串
- 遍历DOM树
- 处理数据
完整代码示例
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.ByteArrayInputStream;
public class DomXmlParser {
public static void main(String[] args) {
// 示例XML字符串
String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<bookstore>"
+ " <book category=\"children\">"
+ " <title lang=\"en\">Harry Potter</title>"
+ " <author>J.K. Rowling</author>"
+ " <year>2005</year>"
+ " <price>29.99</price>"
+ " </book>"
+ " <book category=\"web\">"
+ " <title lang=\"en\">Learning XML</title>"
+ " <author>Erik T. Ray</author>"
+ " <year>2003</year>"
+ " <price>39.95</price>"
+ " </book>"
+ "</bookstore>";
try {
// 1. 创建DocumentBuilderFactory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2. 创建DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
// 3. 解析XML字符串
Document document = builder.parse(new ByteArrayInputStream(xmlString.getBytes()));
// 4. 遍历DOM树
NodeList bookList = document.getElementsByTagName("book");
for (int i = 0; i < bookList.getLength(); i++) {
Node bookNode = bookList.item(i);
if (bookNode.getNodeType() == Node.ELEMENT_NODE) {
Element bookElement = (Element) bookNode;
// 获取category属性
String category = bookElement.getAttribute("category");
System.out.println("Book category: " + category);
// 获取子元素
NodeList childNodes = bookElement.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
Node childNode = childNodes.item(j);
if (childNode.getNodeType() == Node.ELEMENT_NODE) {
Element childElement = (Element) childNode;
System.out.println(" " + childElement.getTagName() + ": " +
childElement.getTextContent());
}
}
System.out.println("----------------------");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
代码说明
-
创建DocumentBuilderFactory:这是创建DOM解析器的工厂类。
-
创建DocumentBuilder:实际执行解析工作的类。
-
解析XML字符串:
- 将XML字符串转换为
ByteArrayInputStream - 使用
parse()方法解析输入流
- 将XML字符串转换为
-
遍历DOM树:
getElementsByTagName()获取指定标签名的节点列表- 检查节点类型(
ELEMENT_NODE) - 获取元素属性(
getAttribute()) - 获取子节点文本内容(
getTextContent())
高级用法
获取特定元素
// 获取第一个book元素
Element firstBook = (Element) document.getElementsByTagName("book").item(0);
元素
Element titleElement = (Element) firstBook.getElementsByTagName("title").item(0);
String title = titleElement.getTextContent();
处理命名空间
// 启用命名空间支持
factory.setNamespaceAware(true);
// 使用命名空间查找元素
NodeList nodes = document.getElementsByTagNameNS("http://example.com/books", "title");
创建新元素并添加到文档
// 创建新元素
Element newBook = document.createElement("book");
newBook.setAttribute("category", "fiction");
// 创建子元素
Element newTitle = document.createElement("title");setTextContent("New Book Title");
// 添加子元素
newBook.appendChild(newTitle);
// 添加到文档
document.getDocumentElement().appendChild(newBook);
注意事项
- DOM解析会将整个XML文档加载到内存中,对于大文件可能消耗较多内存
- 对于大型XML文件,考虑使用SAX或StAX解析器
- 确保正确处理异常情况
- 注意XML编码问题,特别是处理包含非ASCII字符的XML时
代码展示了使用Java DOM API解析XML字符串的基本方法,你可以根据实际需求进行调整和扩展。
