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 |