次はJava SE 6の新機能を勉強。
今回は、Streaming API for XML、通称 StAX というものを使ってみます。これはDOM、SAXに続く新しいXMLパーサ。StAX では 2 種類の方法でパースをすることができます。ひとつが Cursor API で、もうひとつが Event Iterator API 。ここではCursor APIを使ってみます。
「XMLファイルを読み込み、要素が開始されるとその要素名を標準出力に出力」
[java]
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamException;
public class StAXCursor {
public StAXCursor(String xmlfile) {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = null;
BufferedInputStream stream = null;
try {
stream = new BufferedInputStream( new FileInputStream(xmlfile) );
reader = factory.createXMLStreamReader(stream);
while (reader.hasNext()) {
int eventType = reader.next();
if (eventType == XMLStreamReader.START_ELEMENT) {
System.out.println(“Name: ” + reader.getName());
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (XMLStreamException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (XMLStreamException e) {}
}
if (stream != null) {
try {
stream.close();
} catch (IOException e) {}
}
}
}
public static void main(String[] args) {
new StAXCursor(args[0]);
}
}
[/java]
次のXMLをパースしてみます。
<root> <Person> <FirstName>ミク</FirstName> <LastName>初音</LastName> <Gender>女性</Gender> <Age>16</Age> <Height>158cm</Height> <Weight>42kg</Weight> </Person> <Person> <FirstName>リン</FirstName> <LastName>鏡音</LastName> <Gender>女性</Gender> <Age>14</Age> <Height>152cm</Height> <Weight>43kg</Weight> </Person> <Person> <FirstName>レン</FirstName> <LastName>鏡音</LastName> <Gender>男性</Gender> <Age>14</Age> <Height>156cm</Height> <Weight>47kg</Weight> </Person> </root>
実行結果:
Name: root Name: Person Name: FirstName Name: LastName Name: Gender Name: Age Name: Height Name: Weight Name: Person Name: FirstName Name: LastName Name: Gender Name: Age Name: Height Name: Weight Name: Person Name: FirstName Name: LastName Name: Gender Name: Age Name: Height Name: Weight
XML データの読み取りに使用する XMLStreamReader インタフェースのインスタンスを取得するにはjavax.xml.stream.XMLInputFactory の createXMLStreamReader メソッドを使用します。
XMLStreamReader を用いると、XML データの先頭から順番に読み取り専用アクセスを行うことができます。XMLStreamReader の使い方は、読み取ることができる要素が残っていることを hasNext メソッドで判定し、next メソッドで次の要素へ移動する、その他のメソッドで現在の要素の値などを取得する、という具合です。ここでは、イベントタイプが要素の開始を示すSTART_ELEMENTの場合、getNameメソッドを使用して要素の名前を出力しています。今回はgetNameメソッドで要素名だけ出力させましたが、属性名ならgetAttributeNameメソッド、名前空間ならgetNamespaceURIメソッドなど、他にもいろいろ取れます。また、イベントタイプがCHARACTERSの場合、getTextメソッドで要素内容(”ミク”、”初音”、”女性”など)を取得することができます。
StAXは読むだけじゃなく、XMLを書き出すこともできます。Event Iterator API含め、続きはまた今度。