遍历节点树(Traversing the Node Tree)是操作 XML DOM 的核心任务之一。在一个 XML 文档中,所有元素、属性、文本内容都会被 DOM 构建成一棵“树”状结构。理解并掌握如何遍历这棵节点树,对于读取、分析和修改 XML 内容非常关键。
目录
- 什么是 DOM 节点树
- 节点类型回顾
- 遍历节点树的常用方法
- 递归遍历示例
- 实用示例代码
- 注意事项
- 参考资料与出站链接
1. 什么是 DOM 节点树?
在 XML DOM 中,每一个文档都被表示为一个由节点(Node)组成的层级树结构:
Document
└── Root Element(如 <books>)
├── <book>
│ ├── <title>
│ └── <author>
└── <book> ...
每一个节点都有可能拥有子节点,形成父子结构。这种结构使得你可以从任意节点向下逐层访问子内容,或向上访问其父节点。
2. 节点类型回顾(常见类型)
节点类型 | nodeType | 描述 |
---|---|---|
元素节点 | 1 | 所有 XML 标签元素 |
属性节点 | 2 | 所有 XML 属性 |
文本节点 | 3 | 标签之间的文本内容 |
注释节点 | 8 | <!-- 注释 --> 类型内容 |
3. 遍历节点树的常用方法
方法 | 说明 |
---|---|
node.childNodes | 获取所有子节点(包括文本) |
node.firstChild | 第一个子节点 |
node.lastChild | 最后一个子节点 |
node.parentNode | 父节点 |
node.nextSibling | 下一个兄弟节点 |
node.previousSibling | 上一个兄弟节点 |
4. 递归遍历示例
使用递归是遍历 XML DOM 节点树最常见的方式之一:
function traverseNodes(node) {
if (node.nodeType === 1) { // 只处理元素节点
console.log("元素节点:", node.nodeName);
}
// 遍历所有子节点
for (var i = 0; i < node.childNodes.length; i++) {
traverseNodes(node.childNodes[i]);
}
}
调用方式:
traverseNodes(xmlDoc.documentElement);
5. 实用示例代码
示例 XML:
<library>
<book>
<title>XML for Beginners</title>
<author>Alice</author>
</book>
<book>
<title>DOM Deep Dive</title>
<author>Bob</author>
</book>
</library>
JavaScript 遍历:
function traverseNodes(node, indent = "") {
if (node.nodeType === 1) {
console.log(indent + "<" + node.nodeName + ">");
} else if (node.nodeType === 3 && node.nodeValue.trim()) {
console.log(indent + node.nodeValue.trim());
}
for (let i = 0; i < node.childNodes.length; i++) {
traverseNodes(node.childNodes[i], indent + " ");
}
}
traverseNodes(xmlDoc.documentElement);
输出:
<library>
<book>
<title>
XML for Beginners
<author>
Alice
<book>
<title>
DOM Deep Dive
<author>
Bob
6. 注意事项
.childNodes
会返回所有类型的子节点,包括文本节点(空格、换行也算),建议使用nodeType
过滤。- 若只需访问元素节点,可考虑使用
children
属性(只包含元素节点)。 - 递归遍历时注意避免死循环,应避免访问
.parentNode
造成向上遍历。
7. 参考资料与出站链接
通过遍历 XML 节点树,你可以自由访问和处理文档的任何部分,这是构建 XML 解析器、提取器和转换器的基础能力。
发表回复