倭マン's BLOG

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

FEATURE フィールド

標準 API に定義されている Source, Result インターフェースの実装には、public static final な String フィールド「FEATURE」が定義されています。 これは TransformerFactory#getFeature() メソッドによって、各タイプの Source, Result をサポートしているかどうかを確認するのに使います。

使い方


デフォルトの TransformerFactory の実装が SAXSource をサポートしているかどうかを確認するためには、以下のようにします:

TransformerFactory factory = TransformerFactory.newInstance();
System.out.println(factory.getFeature(SAXSource.FEATURE));

SAXSource がサポートされているなら「true」が、サポートされていないなら「false」が標準出力に表示されます。

Sun の JDK


Sun MicrosystemsJDK (1.6.0_01) にデフォルトで組み込まれている TransformerFactory の実装について、各タイプの Source, Result がサポートされているかどうか調べてみました。 実装クラスは

com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl

Xalan かそれを修正したような実装のようですね。

TransformerFactory#getFeature() の実行結果は下表の通り:

Source サポート Result サポート
Stream StreamSource true StreamResult true
SAX SAXSource true SAXResult true
StAX StAXSource false StAXResult false
DOM DOMSource true DOMResult true
JAXB JAXBSource true JAXBResult true

StAX ってサポートされてないことになってるんですけど。 ソースコードを細かく追いかけたわけではありませんが、内部的には StAX イベントから SAX イベント (?) に変換しているようです。

JDOM, dom4j


JDOMSource, DocumentSource は SAXSource を、JDOMResult, DocumentResult は SAXResult をそれぞれ拡張しているので、これらの FEATURE フィールドは SAXSource.FEATURE, SAXResult.FEATURE と同じです。

これらのフィールドの他に、JDOM や dom4jnative にサポートしているかどうかを確認するための public static final な String フィールドも定義されています:

  • JDOMSource.JDOM_FEATURE
  • JDOMResult.JDOM_FEATURE
  • DocumentSource.DOM4J_FEATURE

DocumentResult にはこの手のフィールドは定義されていません。