StAX – Java SE 6

次はJava SE 6の新機能を勉強。

Java SE 6 Mustang新機能

今回は、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含め、続きはまた今度。

参考:Java SE 6 じゃじゃ馬ならし

あわせて読む:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です