XML DOM ノードツリーの巡回

巡回(Traverse)とは、ノードツリーを循環することを意味します。

ノードツリーの巡回

よくXMLドキュメントをループする必要があります。例えば、各要素の値を抽出したい場合です。

このプロセスは「ノードツリーの巡回」と呼ばれます

以下の例では、<book>のすべての子ノードをループして、その名前と値を表示します:

<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
var x, i ,xmlDoc;
var txt = "";
var text = "<book>" +
"<title>雅舍谈吃</title>" +
"<author>梁实秋</author>" +
"<year>2013</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>

実際に試してみてください

例説明:

  1. XML文字列を xmlDoc
  2. ルート要素の子ノードを取得
  3. 各子ノードの名前を出力し、そのテキストノードのノード値

ブラウザのDOM解析における違い

すべての現代ブラウザはW3C DOM規范をサポートしています。

しかし、ブラウザ間にはいくつかの違いがあります。重要な違いの一つは:

それらは空白と改行を処理する方法

DOM - 空白と改行

XMLは通常、ノード間に改行コードや空白文字を含んでいます。ノートパソコンなどのシンプルなエディタを使用して文書を編集する場合、このようなことがよく起こります。

以下の例(ノートパソコンで編集)では、各行間にCR/LF(改行コード)が含まれており、各子ノードの前に2つのスペースがあります:

<book>
  <title>雅舍谈吃</title>
  <author>梁实秋</author>
  <press>江苏文艺出版社</press>
  <year>2013</year>
  <price>35</price>
  <ISBN>9787539962771</ISBN>
</book>

Internet Explorer 9およびその以前のバージョンでは、空白や新しい行をテキストノードとして認識しませんが、他のブラウザではそうします。

以下の例では、ルート要素(books.xml)が持つ子ノードの数を出力します。IE9およびその以前のバージョンでは6つの子ノードが、IE10およびその後のバージョンや他のブラウザでは9つの子ノードが出力されます:

function myFunction(xml) {
var xmlDoc = xml.responseXML;
    x = xmlDoc.documentElement.childNodes;
    document.getElementById("demo").innerHTML =
    "子ノードの数:" + x.length;
}

実際に試してみてください

PCDATA - 解析される文字データ(Parsed Character Data)

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 - 未解析の文字データ(Unparsed Character Data)

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 部分の終わりを示す「"」]]>"はスペースや改行文字を含むことができません。