エンタープライズ:特集 2003/09/24 14:41:00 更新

[JAVA Developer特別企画]2003年11月号
XMLプログラミング初歩の初歩 〜DOMの基本テクニック〜 (6/6)

JAVA Developer 2003年11月号より転載

XML−利用編
 ここまで、XML文書の記述方法について基礎知識を紹介してきました。最後に、JavaプログラムからXML文書を利用する方法として、Apache XML ProjectのXMLパーサー「Xerces-J」を使ったXML文書アクセスを紹介します。取り上げるのは、DOM(Document Object Model)と呼ばれるプログラミングモデルです。

●Xerces-JでXML文書を読む
 リスト1は、XML文書の要素をツリー表示するプログラムです。実行時のパラメータから、XML文書のファイル名を受け取り、パースした結果をDocumentクラスのインスタンスに格納します。

リスト1 Xerces-Jを使ってXML文書の要素をツリー表示(StartXMLクラス)

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.apache.xerces.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class StartXML {

   public static void main(String[] args) {
       Document xmlDoc = null;
       try {
           // XML文書を読み込み
           FileInputStream fis =
           new FileInputStream(args[0]);

           // XML文書をパース
           InputSource src = new InputSource(fis);
           DOMParser parser = new DOMParser();
           parser.parse(src);
           xmlDoc = parser.getDocument();
       }
       catch (FileNotFoundException e) {
           e.printStackTrace();
       } catch (SAXException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       }
       
       // ルート要素を取得
       Element root = xmlDoc.getDocumentElement();
       System.out.println("/" + root.getLocalName());
       // 子要素名を取得して表示
       NodeList children = root.getChildNodes();
       ShowNodes(children, "  ");
   }

   private static void ShowNodes(NodeList children, String tabs) {
       if (children != null) {
           for (int i=0; i<children.getLength(); i++) {
               // ノードリストからノードを取得
               Node child = children.item(i);
               if (child != null) {
                   // ノード名を取得
                   String name = child.getNodeName();
                   if (name.compareTo("#text") != 0) {
                       // 要素名を表示
                       System.out.println(tabs + "+" + name);
                       // さらに子要素を取得し、その要素名を表示
                       ShowNodes(child.getChildNodes(), tabs+"  ");
                   }
               }
           }
       }
   }
}

 DocumentクラスのgetDocumentElementメソッドは、ルート要素オブジェクトを取得するものです。あとはルート要素の子要素リストを取得し、順番にノード(子要素)を取り出して、ツリーを表示しています。注意する点としては、getNodeNameメソッドでノードの名前を取得できますが、名前が"#test"の場合は、子要素ではなく、要素の内容を意味します。
 コンパイルは、CLASSPATHにxercesImpl.jarとxmlParserAPIs.jarを指定して行います。
 実行パラメータとして、図9のXML文書のパス名を指定して実行した結果が、図13です。きちんと要素名をツリー表示できています。

図13 StartXMLクラスの実行結果

/book
 +category
   +name
   +item
     +title
     +writer
     +publisher
     +size
     +page
     +price
     +isbn
   +item
     +title
     +writer
     +publisher
     +size
     +page
     +price
     +isbn

●XMLの基本を身につけよう
 XML文書をサーバーサイドJavaで利用することは、今後ますます増えてくるでしょう。そして、便利なライブラリ(フレームワーク)により、XML文書や文書型定義ファイルを直接見ることは少ないかもしれません。しかし、見ることがないからといって知らないですまされないのが、この世界だと思います。どんな技術でも基礎は重要です。この記事を読んで、XMLの基礎を理解し、さらに活用してみてください。

コラム(2)XMLの文法

 XMLの文法は、拡張Backus-Naur Form(EBNF)表記法で記述されています。ここではこの表記表で使われている式(expression)を紹介します。

A? Aのオプショナルな出現とマッチする(オプションのA)
A B Aの次にBが出現するもの
A | B AまたはBのどちらか
A - B AとマッチするがBとはマッチしない任意の文字列
A+ Aの1回以上の繰り返し
A* Aの0回以上の繰り返し

 実際のXMLの定義を見てみましょう。
[1] document ::= prolog element Misc*
 document(文書)の定義です。documentは、prolog、element、0個以上のMiscの順に出現することを意味しています。

[3] S ::= (#x20 | #x9 | #xD | #xA)+
 S(空白)は、空白文字、タブ、改行、復帰のいずれかが、1回以上連続したものと定義されています。

[42] ETag ::= '</' Name S? '>'
 ETag(終了タグ)は、</ではじまり、Name、>の順に記述します。Sはオプションです。


関連書籍:
●XMLクイックリファレンス 第2版
Elliotte Rusty Harold、W.Scott Means著 瀬尾明志訳 オライリー・ジャパン

●すっきりわかるXML
西村めぐみ著 日本実業出版社

参考URL:
●Extensible Markup Language 1.0
http://www.w3.org/TR/REC-xml

[JAVA Developer特別企画]
XMLプログラミング初歩の初歩
 〜DOMの基本テクニック〜
・XML−基礎編
・文書型宣言
・XML−利用編

関連リンク
▼JAVA Developer
▼定期購読のご案内
▼バックナンバー販売協力店

JAVA Developer11月号表紙 JAVA Developer 11月号

大特集
DBチューニング大会

特集2 AS徹底解説番外編
[特別企画]
・動的画像生成
・DOMの基本テクニック
・目指せ最強! 最速! CodeRally
・WS-Iの最新事情レポート

前のページ | 1 2 3 4 5 6 |      

[松浦 武範,JAVA Developer]