倭マン's BLOG

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

XMLInputFactory に設定できるプロパティ

今回は javax.xml.stream.XMLInputFactory に設定できるプロパティを見ていきます。 プロパティの設定を変更することで、XML 文書の解析方法を変えることが出来ます。

解析方法の設定を、実際に解析を行う XMLEventReader や XMLStreamReader ではなく、それらのインスタンスを生成するファクトリ・クラス XMLInputFactory に行うことに注意。 XMLEvent Reader, XMLStreamReader インスタンスでは、設定値の取得はできます*1が、値をセットできません。 これは javax.xml.parsers パッケージ内のクラスも同じでした(こちらを参照)。

プロパティの設定方法


XMLInputFactory のプロパティを設定するには、setProperty() メソッドを用います。 例えば "javax.xml.stream.isCoalescing" プロパティの値を "true" に設定するためには以下のようにします(どちらか1行で OK):

// プロパティ名を直接用いる方法
factory.setProperty("javax.xml.stream.isCoalescing", true);

// XMLInputFactory に定義された定数を用いる方法
factory.setProperty(XMLInputFactory.IS_COALESCING, true);

setProperty() メソッドの第2引数はオブジェクト型を取りますが、ここでは AutoBoxing 機能を用いています。

プロパティ一覧


XMLInputFactory に設定できるプロパティを表にまとめると下表のようになります。 ただし、表中ではプロパティ名の接頭辞 "javax.xml.stream." を省略しています。 表中のプロパティ名が "isValidating" であれば、正式なプロパティ名は "javax.xml.stream.isValidating" となります。

プロパティ プロパティ値が "true" のときの振る舞い デフォルト値 SAX DOM
isValidating XML 文書の解析時に DTD による妥当性検証を行います。 false
isNamespaceAware 名前空間を解析します。 true
isCoalescing CDATA セクション内の文字データをエスケープして、テキストとして扱います。 このとき CDATA セクションの前後にテキストがあれば、それらも含めて1つのテキストノードとして扱われます。 false ×
isReplacingEntityReferences 内部実体参照を対応するテキストに置き換えます。 true ×
isSupportingExternalEntities 外部(解析)実体を解決します。 不特定 ×
supportDTD DTD による妥当性検証をサポートしています。 true × ×

幾つか注意を。

  • 表中にある「SAX」は、javax.xml.parsers.SAXParserFactory で同様の設定が可能かどうかを示しています。 "isReplacingEntityReferences", "isSupportingExternalEntities" プロパティは設定不可にしてありますが、Sun の JDK にデフォルトで付属している実装や Xerces では有無を言わさず実体参照をテキスト等に変換している模様。 設定は変更可能かも知れませんが、その方法は実装に依存していると思われます。
  • 表中にある「DOM」は、javax.xml.parsers.DocumentBuilderFactory で同様の設定が可能かどうかを示しています。

*1:getProperty(String) メソッドを用います。