便利なコードパーツ集!

やまろうのプログラミングTips

Java

[Java] DOMでXMLを読み込む

投稿日:2016年12月6日 更新日:

2003/02/28
どうもー、やまろうでぃーす。
2日間のXML講習に行ってきました。たぶん受講料とか高いんだろうけど、
会社持ちなのでOKなのね。元請けの会社のご厚意で参加させて
頂きました(感謝)。

内容はJavaでDOMやSAXを使ってXMLを操作するってやつ。
XMLってずいぶん前から注目されてたけど、結局今まであまり
お目にかかることは少なくて、web.xmlとか、ejb_jar.xmlとか
設定ファイル等の脇役的存在でした。所がここに来て主役の座へ
躍り出ようとしています。それがWebサービスです!Webサービスってのは
リモート呼出しの出来る関数なんですけど、その関数の戻り値は
XMLなのです。ということでこれからがXMLの真価が問われるって
わけです。

で、プログラムからXMLを解析するには
・自力でタグを解析するコードを書く
・DOMやSAX等のAPIを使う
の2通りがあります。

DOMはXMLファイルを一気に全て読み込んで、メモリー上にツリー構造
に展開します。メモリーをたくさん消費しますが、要素へのアクセスが
簡単です。DOMはW3Cの規格です。

SAXはXMLファイルを少しずつ読み込んで、開始タグが見つかったよー、
等のイベントを通知してきます。軽快で高速に動作しますが、
要素へのアクセスはDOMより面倒です。単純な処理に向いてるようです。
SAXはメーリングリストから生まれたそうです。

今回はDOM使って、
以下のようなXMLファイル(peopleData.xmlの名前で保存)

<?xml version="1.0" encoding="Shift_JIS" ?>
<people>
<person>
<name>田中</name>
<tall>154</tall>
</person>
<person>
<name>太田</name>
<tall>170</tall>
</person>
</people>

を読み込んで田中の身長を表示します。
それではソースを見て下さい。

package dom;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import javax.xml.parsers.*;

class XMLSearch {

	public static void main(String[] args) throws Exception {
      //XML読み込み
      DocumentBuilderFactory factory                               // (1)
        = DocumentBuilderFactory.newInstance();                    // (2)
      DocumentBuilder builder = factory.newDocumentBuilder();      // (3)
      Document doc = builder.parse("peopleData.xml");              // (4)
                                                                   // (5)
      //田中の身長を探す                                           // (6)
      Element docElem = doc.getDocumentElement();                  // (7)
      NodeList persons = docElem.getElementsByTagName("person");   // (8)
      int len = persons.getLength();                               // (9)
      Element person = null;                                       // (10)
      for (int i = 0; i < len; i++) {                              // (11)
        person = (Element)persons.item(i);                         // (12)
                                                                   // (13)
        String name = person.getElementsByTagName("name").item(0)  // (14)
          .getFirstChild().getNodeValue();                         // (15)
        if (name.equals("田中")) {                                 // (16)
          break;                                                   // (17)
        }                                                          // (18)
      }                                                            // (19)
      String tall = person.getElementsByTagName("tall").item(0)    // (20)
          .getFirstChild().getNodeValue();                         // (21)
      p("田中の身長は" + tall + "cm");                             // (22)
  }                                                                // (23)
  private static void p(String s){                                 
    System.out.println(s);                                         
  }                                                                
}                                                                  

(1)から(4)で、XMLファイルを読み込んでメモリー上にツリー構造で
展開しています。といってもAPIが勝手にやってくれます。呼び出すだけ。
(7)からがプログラマの出番です。
(7)でXMLの情報部のルート、つまり<people>〜</people>を
取得してます。
(8)で"person"という名前の要素の一覧を取得。
(9)で一覧の要素数を取得して、
(11)のfor文で1要素ずつ処理していくってわけです。
(14)でnameタグの値を取得して、
(16)それが田中かどうか比較して、
田中だったら、検索終了なのでfor文を抜けます。
(20)でtallタグの値を取得して、出力して終了ってわけです。

では実行してみましょう!

今回のプログラムはXMLの処理にJAXPというパッケージを使っています。
JAXPはJDK1.4には標準で含まれています。もし、1.4より前の
JDKを使ってる方は1.4をインストールするかJAXPパッケージを
ダウンロードしてクラスパスに追加して下さい。

それでは、このメルマガをDirSearch.javaという名前で保存してください。
そして、上の方で出てきたXMLをpeopleData.xmlという名前でソースと
同じフォルダに保存します。

DOSプロンプトで
javac -d . XMLSearch.java

java dom.XMLSearch

実行結果

田中の身長は154cm

ってなわけです。
どうでしたか、XMLプログラミング。面白いけど、けっこう面倒くさい
なぁというのが僕の感想です。

んじゃぁねぇーーーーーー!!

スポンサーリンク

-Java

Copyright© やまろうのプログラミングTips , 2022 AllRights Reserved Powered by AFFINGER4.