DOM: 属性の値を取得する

2007年06月17日(日)更新


■属性の値を取得する

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

さらら: えぇ、getNodeValueメソッドだったわね。

たけち: で、今回は、属性の値を取得するメソッドを学ぼう。

さらら: あっ、はい。

たけち: 属性の値を取得するには、今回は次のような手順を踏むね。

  1. getAtributes()で、要素ノードに関連付けられている要素ノード群を持っているNamedNodeMapを取得する
  2. getNamedItem(属性名)で、NamedNodeMapの中から指定した名前の属性ノードを取得する
  3. getNodeValue()で、属性ノードの内容を取得する

属性ノードの内容を取得する手順

さらら: getAttributeは前にノードの内容を取得するのに使ったわね。NamedNodeMapってなに?

たけち: NamedNodeMapは、名前付けされた複数のノードを持っているんだ。

さらら: そうなんだ。だから、名前を指定したgetNamedItem(属性名)で、属性ノードを取ってこれるのね。

たけち: そうなんだね。で、今回は、これまでのサンプルXMLデータに属性を追加したものを使って、その属性の値を取得してみようね。まずは、getAttributesメソッドとのgetNamedItemメソッド書き方を見ておこうね。

さらら: は〜い。


getAttributesメソッド

NamedNodeMap

getAttributes()

機能: 要素ノードに関連付けられている属性を持っているNamedNodeMapを取得します。
パラメタ: 無し
戻り値: NamedNodeMap 属性を持っているNamedNodeMap
      null 要素ノードに関連付けられている属性を持っているNamedNodeMapが無い場合

getNamedItemメソッド

Node

getNamedItem(String name)

機能: NamedNodeMapから、指定した名前のノードを取得します。
パラメタ: ノードの名前
戻り値: Node ノード
      null 指定した名前の属性が無い場合

■サンプルXMLデータ

たけち: じゃ、今回は属性を持った、ごくごく簡単なsample2.xmlファイルを使ってテキストノードの内容を表示してみよう。

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

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

<?xml version="1.0" encoding="UTF-8" ?>
<sample note="DOM学習" student="さらら">サンプルデータです。</sample>

さらら: noteとstudentっていう名前の属性があるのね。

たけち: そうだね。sample3.xmlのDOMツリーの概観を確認しておこう。

さらら: あっ、はい。

sample3.xmlのDOMツリー


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

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

さらら: はい。

DOMサンプルプログラム(5) DOMSample5.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
package dom.study.sample_1;

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

public class DOMSample5 {

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ノードの最初の子ノード

        NamedNodeMap attrs = node.getAttributes();  // NamedNodeMapの取得

        if (attrs!=null) {

          Node attr = attrs.getNamedItem("note");  // note属性ノード
          System.out.println("note属性 = " + attr.getNodeValue()); // note属性の値

          attr = attrs.getNamedItem("student");  // student属性ノード
          System.out.println("student属性 = " + attr.getNodeValue()); // student属性の値

        }	

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

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

さらら: えっ〜と。。。26行目の
NamedNodeMap attrs = node.getAttributes();
で、NamedNodeMapを取得しているのね。

たけち: そうだね。

さらら: で、30行目の
Node attr = attrs.getNamedItem("note");
と、33行目の
attr = attrs.getNamedItem("student");
で、noteとstudentという名前の属性ノードを取得しているのね。

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

さらら: えぇ。


■DOMSample5の実行例(sample3.xmlの処理)

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

DOMサンプルプログラム(5) DOMSample5.javaの実行結果
note属性 = DOM学習
student属性 = さらら

さらら: それぞれの要素ノードの内容が表示されているわ。

たけち: 今回は、属性名があらかじめわかっているときの属性ノードの内容を取得したね。

さらら: あっ、はい。

たけち: じゃね今回は、これでおしまい。おつかれさま。

さらら: あっ、は〜い。ありがとね。

→ 次回は、NamedNodeMapのメソッドについての補足です。....... (^ ^;