|
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
(first uploaded 2002/03/24 last updated 2002/10/06, KQ Taura)
|