今回は 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) メソッドを用います。