XMLをJavaで扱う
月曜日, 2月 21st, 2005SAXとDOM
XMLからデータを読んでDBへ…、という機能を作りました。
JavaでXMLを操作する際は、SAX (Simple API for XML)とDOM(Document Object Model)という標準APIが使えます。オープンソースのXML解析ライブラリもどちらかを使っています。
今回は以下のようなXMLを読込み実験しました。
XML:
-
<?xml version="1.0" encoding="Shift_JIS" ?>
-
<root>
-
<aaa>あいうえお</aaa>
-
</root>
XMLはW3Cの規約に沿っていないと読み込み時に例外が発生します。
マルチバイト文字の数字とか、括弧とかもです。(意外)
SAXはXML文書を先頭から順に読んでいき、発生したイベント(タグが始まった、終わった等)をアプリケーションでとらえて処理するAPIです。
ノードに階層の深さが決まりきっているXMLを読む際は便利です。
実装はorg.xml.sax.helpers.DefaultHandlerを継承したHandlerクラスを作成します。
JAVA:
-
package test;
-
-
import org.xml.sax.*;
-
import org.xml.sax.helpers.*;
-
-
public class SampleHandler extends DefaultHandler {
-
-
public void startDocument() {
-
//ドキュメント開始
-
}
-
public void endDocument() {
-
//ドキュメント終了
-
}
-
/**
-
* @param namespaceURI
-
* @param localName
-
* @param qName
-
* @param atts
-
*/
-
public void startElement
-
// 要素の始まりの処理
-
}
-
/**
-
* @param namespaceURI
-
* @param localName
-
* @param qName
-
*/
-
}
-
public void characters(char[] ch, int start, int length) {
-
// 要素の間の値
-
}
-
}
上で作ったHandlerはこのように使います。
JAVA:
-
SAXParserFactory factory = SAXParserFactory.newInstance();
-
SAXParser parser = factory.newSAXParser();
-
SampleHandler handler = new SampleHandler("a");
-
parser.parse(url, handler);// これで解析ができる。
DOMは要素の入れ子階層が不確定なときにwhileなどで使うのに便利です。
JAVA:
-
package test;
-
-
import java.io.*;
-
-
import org.w3c.dom.Document;
-
import org.w3c.dom.Node;
-
import javax.xml.parsers.*;
-
-
/**
-
* @author nakaya
-
*
-
* $Log: $
-
*/
-
public class NodeSample {
-
-
// XMLファイル読込
-
// ルートノード
-
Node rootNode = (Node)document.getDocumentElement();
-
-
// 最初のノード
-
Node firstNode = rootNode.getFirstChild();
-
while (null!=firstNode) {
-
// ノード名
-
if (nodeName.equals(nodeNameText)) {
-
firstNode = firstNode.getNextSibling();
-
continue;
-
} else if (nodeName.equals("aaa")) {
-
threeNestings(firstNode);
-
} else if (nodeName.equals("bbb")) {
-
threeNestings(firstNode);
-
}
-
firstNode = firstNode.getNextSibling();
-
}
-
}
-
-
/**
-
* 入れ子が2段階
-
* @param firstNode
-
*/
-
private static void twoNestings (Node firstNode) {
-
Node secondNode = firstNode.getFirstChild();
-
while (null!=secondNode) {
-
if (!nodeName2.equals(nodeNameText)) {
-
+ secondNode.getFirstChild().getNodeValue());
-
}
-
secondNode = secondNode.getNextSibling();
-
}
-
}
どちらにせよ、XMLの書式は始めにきっちり決めておいた方が作りやすいのは間違いないですが…。