DATE : 2006/08/02 (Wed)
DOM でノードの種類(要素、テキスト、コメントなど)を調べるには、Node インタフェースの nodeType プロパティを調べます。
例えば、次のような XML があったとします。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<child1>text</child1>
<child2>text2</child2>
</root>
この XML にある root 要素の子ノードの内容を取り出すコードは、次のようになりそうな気がします。(getElementsByTagName メソッドを使う方法もありますが、以下のコードではルートノードから辿る方法を使います)
// root 変数には、root 要素の Node が格納されている
// root 要素の子ノードを取得
var children = root.nodeList();
var results = [];
// 子ノードの内容を結果を表す配列に追加
for (var i = 0; i < children.length; i++) {
var aChild = children.item(i);
results.push(aChild.nodeValue);
}
このコードでは、root 要素の子ノードの内容を結果として格納しています。しかし、この方法は間違いです。上の XML を見ると、root 要素の中に child1 要素と child2 要素があるので、一見間違いなさそうに見えます。しかし、 child1 要素、child2 要素のそれぞれの両端には、改行と半角スペースがあります。この一見何もないように見える部分も、立派な root 要素の子ノードです。child1, child2 要素が Element 型であるのに対し、その外側の空白や改行、child1 や child2 タグに囲まれた文字列は Text 型になります。
そこで、取得できたノードが Element 型かどうかを判別する必要がでてきます。ノードが Element 型かどうかは、JavaScript の場合、以下のようになります。
// node 変数に、取得できたノードが格納されている
node.nodeType == 1
nodeType プロパティを参照すると、そのノードの型が分かります。ノードの型は整数で定義されており、Element 型は「1」になっています(実際には、1は定数としてどこかに定義しておいた方がよさそうです)。型と nodeType プロパティの値との対応は、DOM Level1 に定義されています。
すると、上の間違ったコードは、次のように書きなおせます。
// root 変数には、root 要素の Node が格納されている
// root 要素の子ノードを取得
var children = root.nodeList();
var results = [];
var NODE_TYPE_ELEMENT = 1;
// 子ノードの内容を結果を表す配列に追加
for (var i = 0; i < children.length; i++) {
var aChild = children.item(i);
if (aChild.nodeType == NODE_TYPE_ELEMENT) {
results.push(aChild.nodeValue);
}
}