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の名前で保存)
<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
実行結果
ってなわけです。
どうでしたか、XMLプログラミング。面白いけど、けっこう面倒くさい
なぁというのが僕の感想です。
んじゃぁねぇーーーーーー!!