倭マン's BLOG

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

SAXParser#parse() メソッドと org.xml.sax.InputSource クラス

前回、SAXParser オブジェクトの取得方法を見ました(記事一覧)。 今回は SAXParser を用いて SAX 解析を行う方法を見ていきます。

SAXParser#parse() メソッド


SAX 解析を行うには SAXParser#parse() メソッドを用います。 parse() メソッドは、次の5種類がオーバーロードされています:

  • parse(String, DefaultHandler)
  • parse(File, DefaultHandler)
  • parse(InputStream, DefaultHandler)
  • parse(InputStream, DefaultHandler, String)
  • parse(InputSource, DefaultHandler)

第2引数の org.xml.sax.helpers.DefaultHandler は次回に。 各メソッドの第1引数はどれも XML 文書の入力を指定します:

第1引数 説明
String 第1引数の文字列で名前が指定されるファイル(正確には URI が指定されるリソース)を読み込みます。
File 第1引数で指定されるファイルを読み込みます。
InputStream 第1引数で指定される InputStream(バイトストリーム)から読み込みます。 第3引数の文字列が指定されている場合、その文字列は入力のシステム識別子として設定されます。
InputSource 入力を抽象化したオブジェクト org.xml.sax.InputSource で指定される入力から読み込みます。

InputSource オブジェクトについては次節参照。

org.xml.sax.InputSource クラス


XML 文書の入力として扱えるのは、ファイルや InputStream(バイトストリーム), Reader(文字ストリーム)などがあります。 InputSource クラスはこれらの(XML 文書の)入力を抽象化したクラスです。

★コンストラクタから InputSource オブジェクトを取得する★

InputSource クラスに定義されているコンストラクタは次の4つです:

  • InputSource()
  • InputSource(String)
  • InputSource(InputStream)
  • InputSource(Reader)

このうち、引数のある3つのコンストラクタの説明は下表の通り:

コンストラクタ 説明
InputSource(String) 引数の文字列で指定されるファイル(実際には URI で指定されるリソース)を読み込みます。
InputSource(InputStream) 引数の InputStream (バイトストリーム)を読み込みます。
InputSource(Reader) 引数の Reader (文字ストリーム)を読み込みます。

引数のないコンストラクタで InputSource オブジェクトを生成した場合は、生成後にシステム ID、InputStream、 Reader のいずれかを設定する必要があります。

★javax.xml.transform.Source オブジェクトから InputSource オブジェクトを取得する★

XML 文書の)入力を抽象化したクラスとして、javax.xml.transform.Source クラスというものがあります(こちらの方がよく使われるかと思います)。 この Source オブジェクトから InputSource オブジェクトを取得するためには、javax.xml.transform.sax.SAXSource クラスに定義されている static メソッド SAXSource#sourceToInputSource() メソッドを用います:

import org.xml.sax.InputSource;
import javax.xml.transform.sax.SAXSource;

InputSource toInputSource(Source source){
    return SAXSource.sourceToInputSource(source);
}

★システム識別子★

InputSource の(JavaBeans としての)プロパティとして、システム識別子(System ID)というものがあります。 これは特に設定する必要はありませんが、文書の読み込みに失敗したときなどの原因究明などに使えるので可能ならセットしておきましょう。

ファイルを読み込んでいる場合はファイル名を、URL (URI) で指定されているリソースを読み込んでいる場合は URL (URI) の文字列を指定すれば良いでしょう。

エンコーディング

エンコーディングXML 文書の内容から特定されるのが望ましいですが、実際にはそのようになっていない模様*1。 エンコーディングの決定は以下のように行われるようです:

  1. Reader (文字ストリーム)がセットされていれば、その Reader にセットされているエンコーディングが使用される。
  2. InputStream (バイトストリーム)がセットされていれば、
    1. InputSource にエンコーディングが指定されている → そのエンコーディングが用いられる。
    2. InputSource にエンコーディングが指定されていない → OS のデフォルト・エンコーディングが用いられる。

*1:SAXParser の実装によるのでしょうが。