倭マン's BLOG

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

Source

今回は javax.xml.transform.Source インターフェースとその実装クラスを見ていきます。

Source インターフェース自体にはあまりメソッドは定義されていません。 これは入力となる XML 文書をオブジェクト化して Transformer オブジェクトに渡すためのインターフェースと思いましょう。

Source インターフェースを実装したクラスには、以下のようなものがあります*1

  • javax.xml.transform.stream.StreamSource
  • javax.xml.transform.sax.SAXSource
  • javax.xml.transform.stax.StAXSource
  • javax.xml.transform.dom.DOMSource
  • org.jdom.transform.JDOMSource
  • org.dom4j.io.DocumentSource




それぞれ簡単に使い方を見ていきましょう。

javax.xml.transform.stream.StreamSource★


StreamSource はファイルや java.io.Reader から XML 文書を読み込む際に使用します。

Source src = new StreamSource("sample.xml");

コンストラクタに指定できる型には以下のようなものがあります:

  • java.lang.String(ファイル名もしくはリソースの URI*2
  • java.io.File
  • java.io.InputStream
  • java.io.Reader

javax.xml.transform.sax.SAXSource★


SAXSource は org.xml.sax パッケージに定義されている InputSource クラスを入力として用いたいときに使用します。

InputSource input = new InputSource("sample.xml");
Source src = new SAXSource(input);

InputSource オブジェクト自体は java.io.InputStream や java.io.Reader から生成することがほとんどですが、この場合 StreamSource クラスを用いても同様のことが出来るので、あまり SAXSource クラスを使うことはないかと思います*3

逆に、Source オブジェクトを InputSource オブジェクトに変換したい場合は、SAXSource クラスの static メソッド SAXSource#sourceToInputSource() を使います:

Source src = ...;
InputSource input = SAXSource.sourceToInputSource(src);

javax.xml.transform.stax.StAXSource★


StAXSource は XML イベント(の列)を入力にしたい場合に使用します。

XMLStreamReader reader = ...;
Source src = new StAXSource(reader);

コンストラクタとして使用できるクラスは以下の2つ:

  • javax.xml.stream.XMLStreamReader
  • javax.xml.stream.XMLEventReader

javax.xml.transform.dom.DOMSource★


使用方法は簡単で、DOM の Document オブジェクト*4コンストラクタに渡すだけです。 サンプル・コード(にもなってないけど)だけ載せておきます。

Document doc = ...;
Source src = new DOMSource(doc);

org.jdom.transform.JDOMSource★


DOMSource とほとんど同じです:

import org.jdom.Document;
import org.jdom.transform.JDOMSource;

Document doc = ...;
Source src = new JDOMSource(doc);

org.dom4j.io.DocumentSource★


DOMSource, JDOMSource とほとんど同じです:

import org.dom4j.Document;
import org.dom4j.io.DocumentSource;

Document doc = ...;
Source src = new DocumentSource(doc);

*1:Java SE 6 の標準 API 内には、他に javax.xml.bind.util.JAXBSource がありますが、これは無視。

*2:String オブジェクトの内容自体が XML 文書になっている場合は、java.io.StringReader クラスを用いて java.io.Reader オブジェクトとしてコンストラクタに渡しましょう。

*3:独自の org.xml.sax.XMLReader を使用するときなどに使うのでしょうか?

*4:実際には Node オブジェクトならよいが、Document オブジェクト以外を使用することがあるのかどうか。