JAXPとは?

 Java API for XML Processing (JAXP) とは、サン・マイクロシステムズ社が配布している、 Java言語でXML文書の解析処理やXSLT変換を行うためのAPI仕様のことです。 サンはAPI仕様であるところのJAXPのリファレンス実装もjaxp-*.zip というアーカイブ名で配布しているので、 このリファレンス実装自体がJAXPと呼ばれることも多いようです。
 JAXPのリファレンス実装は、J2SE 1.4には標準で同梱されています。 J2SE 1.3向けには、拡張パッケージとして配布されており、 このページからダウンロードできます。

XML文書を解析する簡単なサンプル
 まずはサンプルとして、XML文書の各タグとその値を表示するだけのプログラムです。 これは、こちらのページがたいへん参考になりました。 この場を借りてお礼を申し上げたいと思います。

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

/**
 * JAXPのサンプル・プログラム
 * 2002/03/23
 */
public class XMLTester2 {
  public static void main(String[] args) {
    String filename = "test.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 baseNode, int level) {
    for(Node node = baseNode; node != null; node = node.getNextSibling()) {
      String str = "";
      // 階層レベルの表示
      for(int i=0; i<level; i++) { str += "  "; }
      // ノード名の表示
      String nodeName = node.getNodeName();

      // ノード値の表示
      String nodeValue = "";
      if (node.getNodeValue() != null) {
        nodeValue = node.getNodeValue().trim();
      }
      str += "[" + nodeName + "] = [" + nodeValue + "] ";
      // ノードタイプの表示
      str += ", " + node.getNodeType();
      // 属性ノードの有無表示
      if (node.hasAttributes())  str += ", ATTR";

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

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

 ただし、このプログラムでは、 タグとその値の間に改行文字が入っている場合には、 値の側には別のタグ「#text」が入ってしまうのでうまくタグと値の対応づけがとれません。 (なんのことだ、という方は実際に動かしてみると、 "#text" が出てくる位置で分かると思います) これを改良したのが下のプログラムです。

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

/**
/**
 * JAXPのサンプル・プログラム
 * 2002/03/23
 */
public class XMLTester3 {
  public static void main(String[] args) {
    String filename = "test.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 baseNode, int level) {
    for(Node node=baseNode; node != null; node = node.getNextSibling()) {
      String str = "";
      // 階層レベルの表示
      for(int i=0; i<level; i++) { str += "  "; }
      // ノード名の表示
      String nodeName = node.getNodeName();
      // 空タグの行を表す #text の場合は飛ばします。
      if(nodeName.equals("#text")) continue;

      // ノード値の表示
      String nodeValue = "";
      if (node.getNodeValue() != null) {
        nodeValue = node.getNodeValue().trim();
      }
      NodeList nlist = node.getChildNodes();
      int nlistlen = nlist.getLength();
      for(int i=0; i<nlistlen; i++){
        Node child = nlist.item(i);
        if(child.getNodeName().equals("#text")){
          String childValue = child.getNodeValue().trim();
          if(childValue != null) nodeValue += childValue;
        }
      }
      // ノード情報の表示
      str += "[" + nodeName + "] = [" + nodeValue + "] ";
      System.out.println(str);

      // さらに再帰して下のレベルを探します。
      if(nlistlen != 0){
        showChild(nlist.item(0), level+1);
      }
    }
    return;
  }
}

XML文書を解析するツール
 上記のサンプルに、タグの属性も表示する処理をつけて、 コマンドラインツールっぽくしてみたのが次のプログラムです。
ParseTool.java

XML Top

(first uploaded 2002/03/24 last updated 2002/10/06, KQ Taura)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル