SAX(10) サンプルプログラムの作成(5): 属性の取得

2006年03月26日(日)更新


SAXで、要素の属性を取得

たけち: 前回まででSAXを使用した簡単なプログラムを作成してみて、だいたいのイメージをつかんだね。

さらら: えぇ。いろいろと準備がたいへんだったけど。。。

たけち: 今回からは、要素の属性と内容を取得するための処理を追加してみようね。

さらら: そうね。「要素が始まりました。」だけじゃ、つまんないものね。

サンプルXMLデータの変更

たけち: じゃ、まずは、サンプルXMLデータにつぎのようにpno属性とptype属性を追加してみよう。pno属性は、万葉集の歌の番号を、ptype属性は歌の種類を示すことにするね。

さらら: はい。それで、プログラムで属性をみることを確認するのね。

たけち: そうだよ。

サンプルXMLデータ(属性を追加) sample.xml

<?xml version="1.0" encoding="UTF-8" ?>
<sample>
    <name>持統天皇</name>
    <poem pno="0028" ptype="雑歌">春過ぎて夏来るらし白妙の衣干したり天の香具山</poem>
    <poem pno="0161" ptype="挽歌">北山にたなびく雲の青雲の星離り行き月を離れて</poem>
    <poem pno="0236" ptype="雑歌">いなと言へど強ふる志斐のが強ひ語りこのころ聞かずて我れ恋ひにけり</poem>
</sample>


要素の属性を取得する方法

たけち: まずは、要素の属性を取得する方法をみておこうね。

さらら: はい。

属性の取得

たけち: 上の図に説明してあるように、startElementのパラメタに、Attributesが渡されるんだね。

さらら: そうなの。。。

たけち: Attributesには、属性名と属性値が順番に含まれているんだ。で、Attributesから、属性名や属性値をとってくるには、つぎのようなメソッド(主なものだけを掲載しています)を使うんだ。

Attributesのメソッド 取得できるもの
getIndex("属性名")"属性名"のインデックス(インデックスは 0〜)
getLength()Attributesに含まれる属性の数
getQName(インデックス)インデックスに対応する属性名
getType(インデックス)インデックスに対応する属性の型(CDATAなど)
getValue(インデックス)インデックスに対応する属性の値

SimpleSAXHandlerのstartElementメソッドに処理を追加

さらら: う〜ん。。。具体的にどう書いたらいいか、わからないわ。

たけち: じゃ、簡単な例を書いて実行してみよう。

さらら: えぇ、お願い。。

たけち: じゃ、前回までに作成したSimpleSAXHandlerのstartElementメソッドに処理を追加してみるから。

SimpleSAXHandler.javaのstartElementメソッド
(属性の取得・表示を追加)

 public void startElement(String uri,
          String name,
          String qualifiedName,
          Attributes attributes) throws SAXException
   {

   System.out.println("要素名 " + name + " の開始です。");

   /*
    * attributes.getLength()でAttributesに含まれる属性の数を得ます
    */
   int length = attributes.getLength();
   if (length == 0) {
    return;
   }

   /*
    * 属性の数だけ、属性名と属性値を取得、表示します
    */
   for (int i = 0; i < length; i++) {
    System.out.println(attributes.getQName(i) + " = " + attributes.getValue(i));
   }

 }


変更したプログラムでサンプルXMLデータの読込みを実行

たけち: コメントを書いておいたから、だいたいのイメージはわかると思うけど、どう?

さらら: attributes.getLength()でAttributesに含まれる属性の数を求めておいてから、その数の分だけ、インデックス(変数 i )を使って、getQName()で属性名、そしてgetValue()で属性値をとってきているのね。

たけち: そうそう。じゃ、実際にEclipseを使って実行してみるね。

さらら: あっ、そうだね。


サンプルXMLデータの読込み結果の確認

たけち: poem要素のpno属性とptype属性が、ちゃんと表示されているよね。

さらら: そうね。

sample.xmlを読み込んだ例の確認

たけち: 今回は、SAXでの属性の取得についてやってみたけど、どうだった?。

さらら: だいたいのイメージは理解できたと思うわ。あぁ、もう少しJavaのプログラミングが分かるとたのしいんだろうけど。。

たけち: じゃ、今回はここまで。次回は、要素の内容を取得してみよう。。

さらら: あっ、は〜い。

→次回は、要素の内容を取得する例です。・・・ (^ ^;