DOM: 子ノードを取得する

2007年06月17日(日)更新


■子ノードを取得する

たけち: 前回は、DOMを処理してくれるパーサの利用方法とDOCUMENTノードの取得方法を学んだね。

さらら: それって要素ノードなんかを見てゆく出発点なのね。

たけち: 今回は、そのDOCUMENTノードの最初の子ノードから見ていこう。

さらら: はい。

たけち: あるノードの子ノードを見てゆくには、通常次のような方法をとるんだ。

DOMツリーで子ノードを見てゆく方法

さらら: えっ〜と。。。最初に、自分のノードに子ノードがあるのを確認してから、一番最初の子ノードをとりに行くって事なのね。

たけち: そうだね。


■hasChildNodes、getFirstChild

たけち: じゃ、hasChildNodesとgetFirstChildの書き方を見ておこうね。

さらら: は〜い。


hasChildNodesメソッド

boolean

hasChildNodes()

機能: このノードが子ノードを持っているかどうかを判断します。
パラメタ: ありません
戻り値: true このノードが子を持っている場合
     false このノードが子を持っていない場合

getFirstChildメソッド

Node

getFirstChild()

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

さらら: あら、思ったほどは難しくなさそう。。。。ところで、ノードが子を持っていないことは、getFirstChildの戻り値がnullってことで分かるのね。

たけち: あっ、そうなんだよ。だから、hasChildNodesで確かめないで、いきなりgetFirstChildで子ノードを取得しにいくこともできるんだね。

さらら: で、戻り値がnullだったら、「あっ、無かったんだ」というわけね。

たけち: そうそう。


■サンプルXMLデータで試してみましょう

たけち: じゃ、前回使ったsample.xmlファイルを使ってgetFirstChildでDOCUMENTノードの子ノードを取得してみよう。

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

サンプルXMLデータ(1) sample.xml

<?xml version="1.0" encoding="UTF-8" ?>
<sample>サンプルです</sample>

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

さらら: はい。

DOMサンプルプログラム(2) DOMSample2.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

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 DOMSample2 {

  public static void main(String[] args) {

    String file = args[0];

    try {

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

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

      if (document.hasChildNodes()) {    // 子ノードがある場合
            Node node = document.getFirstChild();           // DOCUMENTノードの最初の子ノード

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

       } else {
           System.out.println("DOCUMENTノードに子ノードがありません。");
       }

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

さらら: あっ、22行目と23行目を見ればいいのね。

たけち: そうだね。まず、22行目で、子ノードがあるかどうかをみているね。

さらら: えぇ。

たけち: で、子ノードがある場合には、23行目で最初の子ノードを取得しているね。
      Node node = document.getFirstChild();

さらら: わかるわ。

たけち: あとは、25行目と26行目で、取得した子ノードのノード名とノードタイプを見ているね。

さらら: はい。このプログラムを動かしてみたいわ。


■DOMSample2の実行例(sample.xmlの処理)

たけち: じゃ、sample.xmlファイルを指定して、DOMSample2プログラムを実行させてみよう。実行結果を図に載せておくね。

さらら: はい。

サンプルプログラム DOMSample_2の実行結果の確認

さらら: データタイプ番号が1、のノードタイプは要素ノード?

たけち: そう、「要素ノード」だね。

さらら: 子ノードはsampleって名前の要素ノードなのね!!

たけち: そうだね。

さらら: 子ノードを取ってきてるのが実感できてうれしい。

たけち: じゃ、今回はここまで。お疲れさま。

さらら: ありがと。

→次は、getNextSiblingで兄弟ノードをたどります。....... (^ ^;