XML文档对象模型DOM是一套用于访问和操作XML文档的标准编程接口,它把整个XML文档映射为一个由节点组成的树形结构,开发者可以通过这套接口读取、修改、添加或删除XML文档中的内容,不需要直接处理XML的原始文本格式。DOM的核心目标是让XML文档的处理变得更标准化,不同编程语言只要实现了DOM规范,就能用相似的逻辑操作XML数据。

DOM的核心定义
DOM全称Document Object Model,是W3C制定的一套标准,最初用于HTML文档的操作,后来扩展到XML文档的处理。当XML解析器加载一个XML文档后,会按照DOM规范把文档的所有内容转化为一个个节点对象,这些节点按照XML的层级关系组合成树形结构,也就是我们常说的DOM树。每个节点都对应XML文档中的一个组成部分,比如标签、属性、文本内容、注释等,开发者可以通过节点提供的属性和方法完成各类操作。
DOM树的结构组成
DOM树是一个层次化的结构,最顶层是文档节点,往下按照XML的嵌套关系延伸出不同类型的节点,常见的节点类型如下:
- 文档节点(Document Node):是整个DOM树的根节点,代表整个XML文档,所有其他节点都是它的后代节点,提供了访问文档整体信息的接口。
- 元素节点(Element Node):对应XML中的标签,比如<user>、<name>这类标签都会转化为元素节点,元素节点可以包含子节点,也可以拥有属性节点。
- 属性节点(Attribute Node):对应XML标签中的属性,比如<user id="1">中的id="1"就是属性节点,属性节点不属于元素节点的子节点,而是作为元素节点的附属存在。
- 文本节点(Text Node):对应XML标签中的文本内容,比如<name>张三</name>中的"张三"就是文本节点,文本节点是元素节点的子节点。
- 注释节点(Comment Node):对应XML中的注释内容,比如<!-- 用户信息 -->就会转化为注释节点,通常不影响文档的实际数据处理。
我们可以用一个简单的XML示例来对应DOM树的结构,假设有如下XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<!-- 用户列表 -->
<user id="1">
<name>张三</name>
<age>25</age>
</user>
<user id="2">
<name>李四</name>
<age>28</age>
</user>
</users>
对应的DOM树结构如下:最顶层是文档节点,下一层是根元素节点<users>,<users>下有一个注释节点和一个元素节点<user>(实际有两个<user>,这里简化说明),每个<user>元素节点下有两个属性节点(id)和两个子元素节点<name>、<age>,每个<name>和<age>下各有一个文本节点。
DOM的基本操作示例
下面用Python的xml.dom.minidom模块演示如何操作DOM树,首先解析上面的XML文档并获取根节点:
import xml.dom.minidom
# 解析XML字符串,也可以替换为parse("文件路径")解析本地文件
xml_str = """<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1">
<name>张三</name>
<age>25</age>
</user>
</users>"""
dom = xml.dom.minidom.parseString(xml_str)
# 获取文档根节点,也就是<users>元素
root = dom.documentElement
print("根节点名称:", root.nodeName) # 输出 users
接下来演示如何遍历子节点和获取文本内容:
# 获取所有user元素节点
user_nodes = root.getElementsByTagName("user")
for user in user_nodes:
# 获取id属性值
user_id = user.getAttribute("id")
# 获取name元素的文本值
name_node = user.getElementsByTagName("name")[0]
name = name_node.firstChild.data
# 获取age元素的文本值
age_node = user.getElementsByTagName("age")[0]
age = age_node.firstChild.data
print(f"用户ID:{user_id},姓名:{name},年龄:{age}")
如果需要修改XML内容,比如给第一个用户添加邮箱信息,可以这样操作:
# 创建新的email元素节点
email_element = dom.createElement("email")
# 创建文本节点
email_text = dom.createTextNode("zhangsan@ipipp.com")
# 把文本节点添加到email元素下
email_element.appendChild(email_text)
# 把email元素添加到第一个user节点下
first_user = user_nodes[0]
first_user.appendChild(email_element)
# 输出修改后的XML内容
print(dom.toprettyxml())
DOM的优缺点
DOM的优势在于接口标准化,操作逻辑直观,适合处理结构复杂、需要频繁修改的XML文档,开发者可以像操作普通树结构一样处理XML数据。但它的缺点也比较明显,解析XML时会把整个文档加载到内存中生成完整的DOM树,如果XML文档体积很大,会占用较多的内存资源,这种情况下更适合使用SAX这类基于事件的流式解析方式。
总的来说,DOM是XML处理中非常基础且常用的技术,理解DOM树的结构是掌握XML操作的关键,只要理清不同节点的类型和关系,就能快速上手各类XML相关的开发任务。
XML_DOMDOM_treeXML_parsernode_operation修改时间:2026-06-09 06:21:25