最新的Web開發教程
 

XML DOM遍歷節點樹


遍歷裝置通過循環或跨節點樹行駛。


遍歷節點樹

通常要循環的XML文檔,例如:當你想提取每個元素的值。

這就是所謂的"Traversing the node tree"

下面的例子通過<書>的所有子節點循環,並顯示它們的名稱和值:

<!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 always represents the root node
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
試一試»

例子解釋:

  1. 加載XML字符串載入xmlDoc
  2. 得到根元素的子節點
  3. 對於每個子節點,輸出節點名稱和文本節點的節點值

在DOM解析瀏覽器的差異

所有現代瀏覽器都支持W3C DOM規範。

但是,也有瀏覽器之間的一些差異。 一個重要的區別是:

  • 他們處理白色空間和新的生產線的方式

DOM - 白色空間和新線路

XML通常包含新行,或空格字符,節點之間。 這通常是當文檔被簡單的編輯器如記事本編輯的情況下。

下面的例子(edited by Notepad)包含CR / LF (new line)每一行,並在每個子節點的前面兩個空間之間:

<book>
  <title>Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

Internet Explorer 9的和更早的版本不把空的空白或換行作為文本節點,而其他瀏覽器做的。

下面的例子將輸出孩子的節點數的根元素(of books.xml )了。 IE9和更早版本將輸出4子節點,而IE10及更高版本,和其他瀏覽器將輸出9子節點:

function myFunction(xml) {
var xmlDoc = xml.responseXML;
    x = xmlDoc.documentElement.childNodes;
    document.getElementById("demo").innerHTML =
    "Number of child nodes: " + x.length;
}
試一試»

PCDATA - 解析字符數據

XML解析器通常解析XML文檔中的所有文本。

當XML元素被解析時,XML標籤之間的文本也被解析:

<message>This text is also parsed</message>

解析器這是否因為XML元素可以包含其他元素,如在本實施例中,其中的<name>元素包含其它兩個要素(first and last)

<name><first>Bill</first><last>Gates</last></name>

分析器將它分解成這樣子元素:

<name>
  <first>Bill</first>
  <last>Gates</last>
</name>

經過分析的字符數據(PCDATA)是用於關於將由XML解析器解析的文本數據的術語。


CDATA - (Unparsed)字符數據

術語CDATA用於關於不應由XML解析器解析的文本數據。

字符,如"<""&"是XML元素是非法的。

"<"會因為解析器解釋為新元素的開始產生錯誤。

"&"會因為解析器將其解釋為一個字符實體的開始產生錯誤。

一些文字,像JavaScript代碼,包含了很多的"<""&"字符。 為了避免錯誤的腳本代碼可以被定義為CDATA。

CDATA節內的一切都被解析器忽略。

CDATA項開頭" <![CDATA[ " and ends with " ]]> "

<script>
<![CDATA[
function matchwo(a,b) {
    if (a < b && a < 0) {
        return 1;
    } else {
        return 0;
    }
}
]]>
</script>

在上面的例子中,CDATA節內的一切都被解析器忽略。

Notes on CDATA sections:

一個CDATA部件不能包含字符串"]]>" 嵌套CDATA部分是不允許的。

"]]>"的標記CDATA節的結尾不能包含空格或換行符。