JavaでDOM処理を行う場合、
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new File(xmlFile)); Element elem = (Element)doc.getElementsByTagName(tagName).item(0);
のように記述します。SDKドキュメントを見るとDocumentBuilderFactoryとDocumentBuilderは抽象クラス、DocumentやElementはインターフェースであることがわかります。では実際に処理を行っているのは誰なのでしょうか?今回はここら辺のからくりを読み解きたいと思います。
まずDocumentBuilderFactoryについて見ていきましょう。 newInstance()の動作はSDKドキュメントに記述されています。newInstance()ではDocumentBuilderFactoryを実装するクラスをいろいろな方法で探しているようです。JavaではこのようにAPIだけ定義しておいて実際の処理を行うクラスはプロパティで切り替えられるようにしておくという方式がよく用いられています。
では最後のデフォルトのDocumentBuilderFactoryインスタンスって何者でしょうか?ソースを見ると
public static DocumentBuilderFactory newInstance() { return (DocumentBuilderFactory) FactoryFinder.find( /* The default property name according to the JAXP spec */ "javax.xml.parsers.DocumentBuilderFactory", /* The fallback implementation class name */ "org.apache.crimson.jaxp.DocumentBuilderFactoryImpl"); }
となっています。つまりcrimsonがデフォルトのDocumentBuilderFactoryとして利用されていることがわかります。
それではcrimsonがどのようにDOMを実装しているか見ていきましょう。
以下コード読み中