XML DOM ノードの定位

ノード間の関係を使用してノードを定位できます。

以下の例ではXMLファイルを使用しています books.xml

関数 loadXMLDoc()、外部のJavaScriptでXMLファイルをロードするために使用されます。

ノードの親ノードを取得する
この例では、parentNode 属性を使用して、ノードの親ノードを取得します。
ノードの最初の子ノードを取得
この例では、firstChild() メソッドとカスタム関数を使用して、ノードの最初の子ノードを取得します。

DOM ノードの定位

ノード間の関係を通じてノードツリーのノードにアクセスすることを通常「ノードナビゲーション」と呼びます。

XML DOM では、ノードの関係はノードの属性として定義されています:

  • parentNode
  • childNodes
  • firstChild
  • lastChild
  • nextSibling
  • previousSibling

以下の画像は以下を示しています: books.xml DOM ノードツリーの一部であり、ノード間の関係を説明しています:

DOM ノードツリー

DOM - 親ノード

すべてのノードは親ノードが1つだけあります。以下のコードは、<book> の親ノードを定位します:

xmlDoc=loadXMLDoc("books.xml");
x=xmlDoc.getElementsByTagName("book")[0];
document.write(x.parentNode.nodeName);

例解:

  • を使用して loadXMLDoc() "をbooks.xml「」を xmlDoc に読み込む
  • 最初の <book> ノードを取得
  • "x" の親ノードのノード名を出力

TIY

空のテキストノードを避ける

Firefox や他のブラウザは空の空白や改行をテキストノードとして扱いますが、IE はこのようにしません。

以下の属性を使用すると問題が発生します:firstChild、lastChild、nextSibling、previousSibling。

空のテキストノード(要素ノード間のスペースや改行シンボル)に位置するのを避けるために、ノードのタイプを確認する関数を使用します:

function get_nextSibling(n)
{
y=n.nextSibling;
while (y.nodeType!=1)
  {
  y=y.nextSibling;
  }
return y;
}

上記の関数があれば、get_nextSibling(node) を使用して node.nextSibling 属性に代えることができます。

コードの説明:

要素ノードのタイプは 1 です。同じ階層のノードが要素ノードでない場合は、次のノードに移動し、要素ノードが見つかるまで続けます。この方法により、IE と Firefox で同じ結果が得られます。

最初の要素を取得

以下のコードは、最初の <book> の最初の要素ノードを表示します:

<html>
<head>
<script type="text/javascript" src="loadxmldoc.js">
</script>
<script type="text/javascript">
//チェックをし、最初のノードが要素ノードであるかどうか
function get_firstChild(n)
{
y=n.firstChild;
while (y.nodeType!=1)
  {
  y=y.nextSibling;
  }
return y;
}
</script>
</head>
<body>
<script type="text/javascript">
xmlDoc=loadXMLDoc("books.xml");
x=get_firstChild(xmlDoc.getElementsByTagName("book")[0]);
document.write(x.nodeName);
</script>
</body>
</html>

出力:

title

例解:

  • を使用して loadXMLDoc() "をbooks.xml" xmlDoc 中に
  • 最初の <book> 上で get_firstChild 関数を使用して、要素节点内の最初の子节点を取得します
  • 最初の子节点(要素节点に属する)のノード名を出力します

TIY

以下の例では、似たような関数を使用しています:

  • firstChild: TIY
  • lastChild: TIY
  • nextSibling: TIY
  • previousSibling: TIY