倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

StAX で入出力を行うインターフェース

StAX APIXML 文書の入出力を行うクラス群ですが、入出力それぞれに『ストリーム・ベース』と『イベント・ベース』の2種類のアプローチがあります。

イベント・ベース


SAX を説明したときに「SAX イベント」という言葉を(勝手に)使っていました。 これは、説明の為に持ち出した概念 (?) でしたが、「イベント・ベース」のアプローチでは、XML 文書の解析時に実際にこのようなイベント javax.xml.stream.events.XMLEvent のオブジェクトを生成します。 XMLEvent オブジェクトを生成する分、SAX や「ストリーム・ベース」に比べてパフォーマンス的には悪いですが、オブジェクト指向にそっている分、プログラミングはしやすいかと思います。 また、「ストリーム・ベース」のコーディングをする際にも、考え方は「イベント・ベース」の場合と大体同じなので、「イベント・ベース」のコーディング方法も知っておいた方がよいかと思います。

  • 入力 : javax.xml.stream.XMLEventReader
  • 出力 : javax.xml.stream.XMLEventWriter

ストリーム・ベース


パフォーマンスが要求される場合には「ストリーム・ベース」のアプローチを用いましょう。 「ストリーム・ベース」のアプローチでは、プログラムにもよりますが、SAX と同程度のパフォーマンスが出せるそうです。

  • 入力 : javax.xml.stream.XMLStreamReader
  • 出力 : javax.xml.stream.XMLStreamWriter

XMLInputFactory, XMLOutputFactory クラス


『ストリーム・ベース』と『イベント・ベース』のどちらのアプローチでも、入力は javax.xml.stream.XMLInputFactory クラスから作成し、出力は javax.xml.stream.XMLOutputFactory クラスから作成します:

XMLInputFactory, XMLOutputFactory クラスの使い方、特にこれらのファクトリ・クラスのインスタンスを取得する方法は javax.xml.parsers パッケージにあったファクトリ・クラスと殆ど同じです:

// 1. XMLInputFactory オブジェクトを取得する
XMLInputFactory factory = XMLInputFactory.newInstance();

// 2. (必要なら)XMLInputFactory の設定をする
factory.setProperty("some-property", propObj);

// 3. XMLStreamReader または XMLEventReader のインスタンスを取得する
factory.createXMLStreamReader(new FileReader("sample.xml"));

XMLOutputFactory の使い方も同様です。 XMLInputFactory オブジェクトから XMLStreamReader や XMLEventReader のインスタンスを取得する方法はまたもう少し詳しくやります。