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 |