DOM: テキストノードの値を取得する

2007年06月17日(日)更新


■テキストノードの値を取得する

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

さらら: えぇ、そうして、XMLデータの内容をたどって見たわね。

たけち: で、今回は、テキストノードの値を取得するメソッドを学ぼう。

さらら: あっ、はい。

たけち: テキストノードの値を取得するには、getNodeValueメソッドを使うんだ。

さらら: getTextValueとかじゃ、ないのね。

たけち: あっ、気がついたね。実は、getNodeValueメソッドは、属性ノード、テキストノード、コメントノードなどのノードの値を取得するためのメソッドなんだ。

さらら: あっ、そうなんだ。

たけち: 今回は、テキストノードについて、その値を取得してみようね。まずは、getNodeValueメソッドの書き方を見ておこうね。

さらら: は〜い。


getNodeValueメソッド

String

getNodeValue()

機能: このノードの内容を取得します。
パラメタ: ありません
戻り値: String ノードの内容(文字列)
      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つあるから、「子1です」、「子2です」と「子3です」という文字列を取得して表示するのね。

たけち: そうだね。前回と同じだけど、sample2.xmlのDOMツリーの概観を確認しておこう。

さらら: あっ、はい。

sample2.xmlのDOMツリー

さらら: あっ、ほかの場所にも、テキストノードかあったんだわ。

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

さらら: う〜ん。。。じゃあ、どうしたらいい?

たけち: さららが、「どうしたらいい?」って思うってことは、それが余分な文字列だと思っているんだよね。

さらら: そっ、そう言われればそうね。本当に余分なのかどうかは。。

たけち: このあたりについては、またそのうち考えてみることにして、今回は、すべてのテキストノードについて、getNodeValueメソッドで、その内容をそのまま表示しておこうと思うんだ。

さらら: えぇ、わかったわ。


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

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

さらら: はい。

DOMサンプルプログラム(4) DOMSample4.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
54
55
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 DOMSample4 {

  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) {
        printTextNode(child);         // ノードの情報を表示

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

    static private void printTextNode(Node node) {
                        // TEXT_NODEのときに、node.getNodeValue()
        if (node.getNodeType()==Node.TEXT_NODE) {
				
            System.out.println("テキストノード値 = " + node.getNodeValue()); // ノード値
			
        }

    }

}

さらら: えっ〜と。。。47行目の
if (node.getNodeType()==Node.TEXT_NODE)
って何しているの?

たけち: これは、いま見ているノードがテキストノードかどうかを判断しているんだね。

さらら: そっか。で、ノードがテキストノードの時に49行目の
node.getNodeValue()
で、テキストノードの内容を取得しているのね。

たけち: そうなんだね。そんなに難しくないでしょ。

さらら: えぇ。


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

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

DOMサンプルプログラム(4) DOMSample4.javaの実行結果
テキストノード値 =
テキストノード値 =

テキストノード値 = 子1です
テキストノード値 =

テキストノード値 = 子2です
テキストノード値 =

テキストノード値 = 子3です
テキストノード値 =

DOMSample4.javaの実行結果

さらら: 順にテキストノードの内容が表示されているわ。

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

さらら: はい。

たけち: じゃね今回は、これでおしまい。次は、属性ノードについてみてみようかな。

さらら: あっ、は〜い。

→ 次回は、属性の値を取得するです。....... (^ ^;