次はJava SE 6の新機能を勉強。
今回は、Streaming API for XML、通称 StAX というものを使ってみます。これはDOM、SAXに続く新しいXMLパーサ。StAX では 2 種類の方法でパースをすることができます。ひとつが Cursor API で、もうひとつが Event Iterator API 。ここではCursor APIを使ってみます。
「XMLファイルを読み込み、要素が開始されるとその要素名を標準出力に出力」
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
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]); } } |
次のXMLをパースしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<span class="tag"><root></span> <span class="tag"><Person></span> <span class="tag"><FirstName></span>ミク<span class="tag"></FirstName></span> <span class="tag"><LastName></span>初音<span class="tag"></LastName></span> <span class="tag"><Gender></span>女性<span class="tag"></Gender></span> <span class="tag"><Age></span>16<span class="tag"></Age></span> <span class="tag"><Height></span>158cm<span class="tag"></Height></span> <span class="tag"><Weight></span>42kg<span class="tag"></Weight></span> <span class="tag"></Person></span> <span class="tag"><Person></span> <span class="tag"><FirstName></span>リン<span class="tag"></FirstName></span> <span class="tag"><LastName></span>鏡音<span class="tag"></LastName></span> <span class="tag"><Gender></span>女性<span class="tag"></Gender></span> <span class="tag"><Age></span>14<span class="tag"></Age></span> <span class="tag"><Height></span>152cm<span class="tag"></Height></span> <span class="tag"><Weight></span>43kg<span class="tag"></Weight></span> <span class="tag"></Person></span> <span class="tag"><Person></span> <span class="tag"><FirstName></span>レン<span class="tag"></FirstName></span> <span class="tag"><LastName></span>鏡音<span class="tag"></LastName></span> <span class="tag"><Gender></span>男性<span class="tag"></Gender></span> <span class="tag"><Age></span>14<span class="tag"></Age></span> <span class="tag"><Height></span>156cm<span class="tag"></Height></span> <span class="tag"><Weight></span>47kg<span class="tag"></Weight></span> <span class="tag"></Person></span> <span class="tag"></root></span> |
実行結果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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含め、続きはまた今度。