DOM: 兄弟ノードを取得する

2007年06月17日(日)更新


■兄弟ノードを取得する

たけち: 前回は、子ノードを取得するメソッドについて学んだね。

さらら: えぇ、DOCUMENTノードの最初の子ノードを見たわね。

たけち: で、今回は、兄弟ノードを取得する方法を学ぼう。

さらら: あっ、はい。

たけち: あるノードの兄弟ノードをたどって見てゆくには、getNextSiblingメソッドを使うんだ。

DOMツリーでの兄弟ノードをたどって見てゆく方法


■getNextSibling

さらら: 横にたどっていく感じね。

たけち: そうだね。じゃ、getNextSiblingの書き方を見ておこうね。

さらら: は〜い。


getNextSiblingメソッド

Node

getNextSibling()

機能: このノードの兄弟ノードを取得します。
パラメタ: ありません
戻り値: Node 次の兄弟ノード
     null このノードが次の兄弟を持っていない場合

さらら: 分かるわ。getNextSiblingの戻り値がnullになるまで兄弟ノードをたどることができるのね。

たけち: そうそう。


■サンプルXMLデータ

たけち: じゃ、今回は次のようなsample2.xmlファイルを使ってノードをたどってみよう。

さらら: はい。次のXMLデータね。

サンプルXMLデータ(2) sample2.xml

<?xml version="1.0" encoding="UTF-8" ?>
<sample>
<child>子1です</child>
<child>子2です</child>
<child>子3です</child>
</sample>

さらら: childって名前の兄弟の要素が3つあるのね。

たけち: そうだね。プログラムを作ってたどる前にsample2.xmlのDOMツリーの概観を確認しておこう。

さらら: あっ、はい。

sample2.xmlのDOMツリー

たけち: 人が見て分かりやすいようにsample2.xmlに入れた改行も、DOMツリーではTEXTノードとして扱われるからね。

さらら: わかったわ。でも、ちょっと面倒な感じね。

たけち: それについては、そのうち説明するからね。今回はあまり気にしないで。

さらら: はい。


■DOMサンプルプログラム(3)

たけち: じゃ、次にDOMサンプルプログラム(3)のソースコードを載せておくね。

さらら: はい。

DOMサンプルプログラム(3) DOMSample3.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package dom.study.sample_1;

import java.io.IOException;
import org.apache.xerces.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;

public class DOMSample3 {

  public static void main(String[] args) {	
		
    String file = args[0];

    try {
			
      DOMParser parser = new DOMParser();       // パーサの生成
      parser.parse(file);                       // XMLファイルのパース

      Document document = parser.getDocument(); // DOCUMENTノードの取得

      traceNodes(document);                 // すべての子ノードをたどる


    } catch (SAXException e) {		
        System.out.println("XMLデータが不正です。");
        e.printStackTrace();
    } catch (IOException e) {			
        e.printStackTrace();
    }
  }

  static private void traceNodes(Node node) {

    Node child=node.getFirstChild();      // 子ノードを取得

    while (child!=null) {
        printNode(child);                // ノードの情報を表示

        traceNodes(child);               // さらに子ノードをたどる
        child = child.getNextSibling();  // 兄弟ノードを取得
    }
  }

  static private void printNode(Node node) {

    System.out.print("ノード名 = " + node.getNodeName() + " "); // ノード名
    System.out.print("ノードタイプ = " + node.getNodeType() + " "); // ノードタイプ
    System.out.println("ノード値 = " + node.getNodeValue()); // ノード値

  }

}

さらら: えっ〜と。。。41行目の
child = child.getNextSibling();
で兄弟ノードを見ているらしいってわかるけど・・・・・

たけち: そうだね。33行目〜43行目のtraceNodes()メソッドで、DOCUMENTノードの最初の子ノードから順にたどっているんだ。45行目〜51行目のprintNode()メソッドで、ひとつひとつのノードの情報を表示しているね。

さらら: えっ、えぇ。

たけち: プログラムの細かいことはいずれ説明するから、ここではこのプログラムでsample2.xmlのDOMノードをどうたどるかを図で示しておくね。

さらら: はい。

DOMSample3.javaプログラムでのsample2.xmlのDOMツリーのたどりかた


■DOMSample3の実行例(sample2.xmlの処理)

たけち: じゃ、sample2.xmlファイルを指定して、DOMSample3プログラムを実行させてみよう。実行結果は次のようになるよ。

DOMサンプルプログラム(3) DOMSample3.javaの実行結果
ノード名 = sample ノードタイプ = 1 ノード値 = null
ノード名 = #text ノードタイプ = 3 ノード値 =

ノード名 = child ノードタイプ = 1 ノード値 = null
ノード名 = #text ノードタイプ = 3 ノード値 = 子1です
ノード名 = #text ノードタイプ = 3 ノード値 =

ノード名 = child ノードタイプ = 1 ノード値 = null
ノード名 = #text ノードタイプ = 3 ノード値 = 子2です
ノード名 = #text ノードタイプ = 3 ノード値 =

ノード名 = child ノードタイプ = 1 ノード値 = null
ノード名 = #text ノードタイプ = 3 ノード値 = 子3です
ノード名 = #text ノードタイプ = 3 ノード値 =

さらら: 図でみせてもらった順にノードの情報が表示されているわ。

たけち: だいたいの雰囲気はわかったかな。

さらら: 子ノードを下にたどりながら、兄弟ノードをみていけばいいことは分かったわ。

たけち: 今回はそれでいいかな。お疲れさま。

さらら: えぇ、ありがと。

→ 次は、getNodeValueでノードの値を取得します。....... (^ ^;