DOM解析器全称为文档对象模型解析器,是一种将XML文档完整加载到内存中并转换成树形结构进行处理的工具,开发者可以通过操作这棵树来实现对XML文档的读取、修改、删除等操作。
DOM解析器的基本概念
DOM解析器属于XML解析器的一种,它的核心特点是会把整个XML文档一次性加载到内存中,然后按照XML的层级结构构建一个节点树。和其他解析方式比如SAX解析不同,DOM解析器不需要边读边处理,而是把整个文档的结构都保留在内存里,方便开发者随时访问任意位置的节点。
DOM解析器通常遵循W3C的DOM规范,不同编程语言都有对应的DOM解析器实现,比如Java的javax.xml.parsers.DocumentBuilder,Python的xml.dom.minidom模块等。使用DOM解析器处理XML的典型流程是:先创建解析器实例,然后加载XML文档,接着获取内存中的文档树对象,最后通过节点操作方法处理数据。
DOM解析器在内存中的XML表示方式
DOM解析器把XML文档加载到内存后,会将其映射为一棵由多种类型节点组成的树形结构,这棵树的根节点是Document节点,整个XML文档的内容都作为这棵树的子节点存在。常见的节点类型包括:
- Document节点:整个文档的根节点,所有其他节点都是它的后代
- Element节点:对应XML中的元素标签,比如<user>、<name>等
- Text节点:对应元素中的文本内容,比如<name>张三</name>中的张三就是Text节点
- Attribute节点:对应元素的属性,比如<user id="1">中的id属性
- Comment节点:对应XML中的注释内容
举个例子,下面是一段简单的XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1">
<name>张三</name>
<age>25</age>
</user>
</users>
DOM解析器加载这段XML后,内存中的树结构会是这样的:
- 根节点是Document节点
- Document节点的子节点是<users> Element节点
- <users>节点的子节点是<user> Element节点
- <user>节点有一个Attribute节点id,值为1,同时有两个子节点:<name> Element和<age> Element
- <name>节点的子节点是Text节点,内容为张三
- <age>节点的子节点是Text节点,内容为25
通过代码示例查看内存中的DOM树
下面用Java的DOM解析器演示如何加载XML并查看内存中的节点结构:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class DomParseDemo {
public static void main(String[] args) throws Exception {
// 创建DOM解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 获取解析器实例
DocumentBuilder builder = factory.newDocumentBuilder();
// 加载XML文档,得到内存中的Document节点(根节点)
Document document = builder.parse("users.xml");
// 获取根元素users
Element rootElement = document.getDocumentElement();
System.out.println("根元素名称:" + rootElement.getNodeName());
// 获取所有user子元素
NodeList userNodes = rootElement.getElementsByTagName("user");
for (int i = 0; i < userNodes.getLength(); i++) {
Element userElement = (Element) userNodes.item(i);
// 获取user元素的id属性
String userId = userElement.getAttribute("id");
System.out.println("用户id:" + userId);
// 获取name子元素的文本内容
String name = userElement.getElementsByTagName("name").item(0).getTextContent();
// 获取age子元素的文本内容
String age = userElement.getElementsByTagName("age").item(0).getTextContent();
System.out.println("用户名:" + name + ",年龄:" + age);
}
}
}
上面的代码中,builder.parse("users.xml")方法就是加载XML文档并生成内存中的DOM树,返回的Document对象就是整个树的根。后续通过getDocumentElement、getElementsByTagName等方法都是在操作内存中的这棵节点树。
DOM解析器的优缺点
DOM解析器的优势在于可以随机访问任意节点,方便修改文档内容,适合处理结构复杂、需要频繁操作的XML文档。但它的缺点也很明显,因为要把整个文档加载到内存,所以如果XML文档体积很大,会占用大量内存,甚至导致内存溢出,这种情况下就不适合使用DOM解析器。
在实际开发中,需要根据XML文档的大小和处理需求选择合适的解析方式,小体积文档或者需要修改文档的场景优先选择DOM解析器,大体积文档只需要读取数据的场景则更适合使用SAX或者StAX这类流式解析器。
DOM_parserXML解析内存树模型节点操作修改时间:2026-07-20 14:18:40