ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

JAXPによるDOMプログラミング

JAXPとは

 JAXPとは、Java Api for Xml Processingの略で、サン・マイクロシステムズ株式会社から提供されているXMLパーサなどの、XMLデータを操作するためのクラスライブラリです。 DOMやSAXなどを使ってプログラミングすることもできます。

 ただ、JAXPは、改行コードの扱い方に不具合があり、XMLデータから改行コードを削除しないと、正しく動作しません。 サンプルソースは、以下に公開していますので、プログラム側に問題がある場合は、指摘していただけるとうれしいです。

ノード情報の表示

 DOMを使って、ノード情報の階層構造を表示してみましょう。 以下のソースを入力してください。
 Documentオブジェクトは、DocumentBuilderFactoryと、DocumentBuilderを作成し、XMLパーサに通すと出力されます。 ノード情報は、再帰呼出しを使って、ノード名、ノード値、ノードタイプ番号、属性ノードの有無を表示しています。

XML.java
import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

public class XML {
  public static void main(String[] args) {
    String filename = "addr.xml";

    if (args.length > 0) {
      filename = args[0];
    }

    try {
      // DOMオブジェクトの作成
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      DocumentBuilder db = dbf.newDocumentBuilder();
      Document doc = db.parse(new File(filename));

      // ノード情報の表示
      showChild(doc, 0);

    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  private static void showChild(Node obj, int level) {
    Node node;
    String str;
    int i;

    node = obj;
    while(true) {
      // 階層レベルの表示
      str = "";
      for(i = 0; i < level; i++) { str += '+'; }

      // ノード名の表示
      str += node.getNodeName();

      // ノード値の表示
      str += ", ";
      if (node.getNodeValue() != null) {
        str += node.getNodeValue().trim();
      }

      // ノードタイプの表示
      str += ", ";
      str += node.getNodeType();

      // 属性ノードの有無表示
      if (node.hasAttributes()) {
        str += ", ATTR";
      }

      // ノード情報の表示
      System.out.println(str);

      // 子ノードの表示(再帰)
      if (node.hasChildNodes()) {
        showChild(node.getFirstChild(), level + 1);
      }

      node = node.getNextSibling();
      if (node == null) { break; }
    }
    return;
  }
}

 サンプルのXMLデータとして以下のデータを用意します。

addr.xml
<?xml version="1.0" encoding="UTF-8" ?>

<住所録>
  <個人情報 ID="1">
    <名前>升村 丞</名前>
    <郵便番号>920-0967</郵便番号>
    <住所>金沢市菊川1-9-6</住所>
    <電話番号>076-261-4921</電話番号>
  </個人情報>
  <個人情報 ID="2">
    <名前>北陸 太郎</名前>
    <郵便番号>920-0000</郵便番号>
    <住所>金沢市大手町1-1-1</住所>
    <電話番号>076-111-3333</電話番号>
  </個人情報>
  <個人情報 ID="3">
    <名前>金沢 花子</名前>
    <郵便番号>920-0123</郵便番号>
    <住所>金沢市片町1-2-3</住所>
    <電話番号>076-123-4567</電話番号>
  </個人情報>
</住所録>

 コンパイルして実行すると、以下のような表示がされます。
 XMLファイル名をパラメータとして指定すると、任意のXMLファイルの階層構造を表示できます。

dos# javac XML.java
dos# java XML
#document, , 9
+住所録, , 1
++個人情報, , 1, ATTR
+++名前, , 1
++++#text, 升村 丞, 3
+++郵便番号, , 1
++++#text, 920-0967, 3
+++住所, , 1
++++#text, 金沢市菊川1-9-6, 3
+++電話番号, , 1
++++#text, 076-261-4921, 3
++個人情報, , 1, ATTR
+++名前, , 1
++++#text, 北陸 太郎, 3
+++郵便番号, , 1
++++#text, 920-0000, 3
+++住所, , 1
++++#text, 金沢市大手町1-1-1, 3
+++電話番号, , 1
++++#text, 076-111-3333, 3
++個人情報, , 1, ATTR
+++名前, , 1
++++#text, 金沢 花子, 3
+++郵便番号, , 1
++++#text, 920-0123, 3
+++住所, , 1
++++#text, 金沢市片町1-2-3, 3
+++電話番号, , 1
++++#text, 076-123-4567, 3


Copyright (C)1995-2002 ASH multimedia lab.
mail : info@ash.jp