XML DOM 遍历节点树
遍历是指循环或遍历节点树。
遍历节点树
通常您想要循环遍历 XML 文档,例如:当您想要提取每个元素的值时。
这被称为“遍历节点树”。
下面的示例循环遍历 <book> 的所有子节点,并显示其名称和值。
示例
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
var x, i ,xmlDoc;
var txt = "";
var text = "<book>" +
"<title>Everyday Italian</title>" +
"<author>Giada De Laurentiis</author>" +
"<year>2005</year>" +
"</book>";
parser = new DOMParser();
xmlDoc = parser.parseFromString(text,"text/xml");
// documentElement 始终表示根节点
x = xmlDoc.documentElement.childNodes;
for (i = 0; i < x.length ;i++) {
txt += x[i].nodeName + ": " + x[i].childNodes[0].nodeValue + "<br>";
}
document.getElementById("demo").innerHTML = txt;
</script>
</body>
</html>
输出
title: Everyday Italian
author: Giada De Laurentiis
year: 2005
尝试一下 »
示例说明
- 将 XML 字符串加载到 xmlDoc 中
- 获取根元素的子节点
- 对于每个子节点,输出节点名称和文本节点的节点值
浏览器在 DOM 解析中的差异
所有现代浏览器都支持 W3C DOM 规范。
但是,浏览器之间存在一些差异。一个重要的区别是
- 它们处理空白和换行符的方式
DOM - 空白和换行符
XML 经常在节点之间包含换行符或空白字符。这在文档由简单的编辑器(如记事本)编辑时很常见。
以下示例(由记事本编辑)在每行之间包含 CR/LF(换行符),并在每个子节点前面包含两个空格
<book>
<title>Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
Internet Explorer 9 及更早版本不将空空白或换行符视为文本节点,而其他浏览器则会。
以下示例将输出根元素(books.xml)的子节点数量。IE9 及更早版本将输出 4 个子节点,而 IE10 及更高版本以及其他浏览器将输出 9 个子节点
示例
function myFunction(xml) {
var xmlDoc = xml.responseXML;
x = xmlDoc.documentElement.childNodes;
document.getElementById("demo").innerHTML =
"子节点数量: " + x.length;
}
尝试一下 »
PCDATA - 解析的字符数据
XML 解析器通常解析 XML 文档中的所有文本。
当 XML 元素被解析时,XML 标记之间的文本也会被解析
<message>此文本也会被解析</message>
解析器执行此操作是因为 XML 元素可以包含其他元素,如本示例中,<name> 元素包含两个其他元素 (first 和 last)
<name><first>Bill</first><last>Gates</last></name>
解析器会将其分解成以下子元素
<name>
<first>Bill</first>
<last>Gates</last>
</name>
解析的字符数据 (PCDATA) 是一个用于描述将被 XML 解析器解析的文本数据的术语。
CDATA - (未解析的)字符数据
CDATA 术语用于描述不应被 XML 解析器解析的文本数据。
在 XML 元素中,"<" 和 "&" 等字符是非法的。
"<" 将会产生错误,因为解析器将其解释为新元素的开始。
"&" 将会产生错误,因为解析器将其解释为字符实体的开始。
某些文本,如 JavaScript 代码,包含大量的 "<" 或 "&" 字符。为了避免错误,脚本代码可以定义为 CDATA。
解析器会忽略 CDATA 部分中的所有内容。
CDATA 部分以“<![CDATA[”开头,以“]]>”结尾
<script>
<![CDATA[
function matchwo(a,b) {
if (a < b && a < 0) {
return 1;
} else {
return 0;
}
}
]]>
</script>
在上面的示例中,CDATA 部分内的所有内容都会被解析器忽略。
关于 CDATA 部分的注意事项
CDATA 部分不能包含字符串“]]>”。不允许嵌套 CDATA 部分。
标记 CDATA 部分结束的“]]>”不能包含空格或换行符。