XML DOM编程指的是基于文档对象模型(Document Object Model)对XML文档进行编程操作的技术,它将XML文档解析为一个由节点构成的树形结构,每个节点对应XML中的元素、属性、文本内容等组成部分,开发者可以通过操作这些节点实现对XML文档的完整控制。

XML DOM核心概念
XML DOM将XML文档中的每一个部分都视为一个节点,节点之间存在明确的层级关系,常见的节点类型包含以下几种:
- 文档节点:整个XML文档的根节点,对应
<DOMDocument>对象 - 元素节点:XML中的标签元素,比如
<user>、<name>都属于元素节点 - 属性节点:元素节点的属性,比如
<user id="1">中的id就是属性节点 - 文本节点:元素节点内部的文本内容,比如
<name>张三</name>中的“张三”就是文本节点
DOM操作XML的基本流程
使用DOM操作XML文档通常遵循以下四个步骤:
- 加载XML文档到内存,生成DOM树
- 获取目标节点或者节点集合
- 对节点执行对应的操作(查询、新增、修改、删除)
- 将修改后的DOM树保存回XML文档
不同语言的DOM操作示例
Java语言操作XML DOM
Java内置了DOM解析相关的API,位于javax.xml.parsers和org.w3c.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 XmlDomDemo {
public static void main(String[] args) throws Exception {
// 创建文档构建器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 创建文档构建器
DocumentBuilder builder = factory.newDocumentBuilder();
// 加载XML文档,生成DOM树
Document document = builder.parse("user.xml");
// 获取所有user元素节点
NodeList userNodes = document.getElementsByTagName("user");
// 遍历输出用户信息
for (int i = 0; i < userNodes.getLength(); i++) {
Element userElement = (Element) userNodes.item(i);
// 获取id属性
String id = userElement.getAttribute("id");
// 获取name子元素的文本内容
String name = userElement.getElementsByTagName("name").item(0).getTextContent();
// 获取age子元素的文本内容
String age = userElement.getElementsByTagName("age").item(0).getTextContent();
System.out.println("用户ID:" + id + ",姓名:" + name + ",年龄:" + age);
}
}
}Python语言操作XML DOM
Python的xml.dom.minidom模块提供了轻量级的DOM解析能力,以下是新增节点的示例:
from xml.dom.minidom import parse, Document
# 读取现有XML文档
dom_tree = parse("user.xml")
# 获取文档根元素
root = dom_tree.documentElement
# 创建新的user元素节点
new_user = dom_tree.createElement("user")
# 给user节点设置id属性
new_user.setAttribute("id", "3")
# 创建name子元素
name_element = dom_tree.createElement("name")
# 创建name元素的文本节点
name_text = dom_tree.createTextNode("王五")
# 将文本节点添加到name元素中
name_element.appendChild(name_text)
# 创建age子元素
age_element = dom_tree.createElement("age")
# 创建age元素的文本节点
age_text = dom_tree.createTextNode("22")
# 将文本节点添加到age元素中
age_element.appendChild(age_text)
# 将子元素添加到user节点
new_user.appendChild(name_element)
new_user.appendChild(age_element)
# 将新的user节点添加到根元素
root.appendChild(new_user)
# 将修改后的DOM树保存回文件
with open("user.xml", "w", encoding="utf-8") as f:
dom_tree.writexml(f, encoding="utf-8")DOM操作XML的优缺点
| 类型 | 说明 |
|---|---|
| 优点 | 操作逻辑直观,符合树形结构思维;支持随机访问任意节点;标准化程度高,跨语言兼容性好 |
| 缺点 | 需要将整个XML文档加载到内存,处理大文件时内存占用高;解析速度比SAX等流式解析方式慢 |
常见问题与注意事项
- 操作XML文档时要注意节点的层级关系,避免获取到空节点导致空指针异常
- 修改XML文档后要及时保存,否则修改只会停留在内存的DOM树中
- 如果XML文档包含命名空间,获取节点时需要使用对应的命名空间相关方法
- 处理大体积XML文档时,建议优先选择SAX或者StAX等流式解析方式,避免内存溢出