レベル: 中級 Brett D. McLaughlin, Sr. (brett@newInstance.com), Author and Editor, O'Reilly Media, Inc.
2002年 11月 01日 DOMによるブートストラッピングに関する連載記事の第1回であるこのヒントでは、ブートストラッピングとは何かを説明し、それに関連した問題について調べ、レベル1およびレベル2のDOMを使用する際の基本的な事柄について説明します。
DOM (Document Object Model) の使用に関して最も誤解され、誤用されている面の1つは、プログラミングに使用する最初のDOMインプリメンテーションを入手することです。通常、これはブートストラッピングと呼ばれており、しばしば正しくない仕方で行われているようです。もちろん、インプリメンテーションが手元になければDOMを使って何かを行うことはできないので、ブートストラッピングが正しく行われなければすべてのプログラムが嘆くことになります。このことがこれまでに思い浮かんだことがなければ、にわとりと卵のどちらが先に現れたか、といった古典的な例の1つと考えることができます。開始点がなければDOMを使って何かをすることはできませんが、開始点そのものも1つのDOMクラスなのです。それで、DOMを使って作業を始めるにはDOMクラスが必要ですが、DOMクラスを入手するにはDOMを使って作業する必要があります・・・混乱してきませんか?続くいくつかのヒントでは、このことを分かりやすく説明します。
注: JAXP (Java API for XML Processing。SunのXML処理用Java API) を使えば、このヒントで示されているステップを行わなくてもDOMインプリメンテーションを入手することが可能です。しかし、常にJAXPインプリメンテーションが周りにあるとは限らないので、優れたDOMプログラマーとして、JAXPを使わずになんとかする方法を知っておく必要があります。それで、JAXPが使用可能であっても、このヒントは役に立つでしょう。
レベル1とレベル2のいずれのDOMであっても、DOMインプリメンテーションを入手するために行う処理は多少問題にとなります。次のヒントでは、すべての問題を修正する方法について扱います。まず、DOMインプリメンテーションが必要な理由と、ブートストラッピングを行わない方法について理解する必要があります。両方ともこのヒントで扱われます。
既存のファイルや入力ストリームからXML文書を読み込む場合、このセクション全体で述べられていることは無視できます。この場合は、reader.getDocument()メソッドからDOMDocumentオブジェクトが戻され、そのDOMツリーを問題なく操作できます。しかし、DOMの便利なところは、DOMツリーを使って新しいXML構造を作成し、その構造をファイルや他の出力シンクに直列化出力できることでもあります。その場合に、ベンダーに固有の部分が問題になります。
ブートストラッピングの最終目標は、org.w3c.dom.Documentインターフェースのベンダー固有のインプリメンテーションを入手することです。ほとんどのデベロッパーは、このインプリメンテーション・インスタンスを入手するために以下のようなコードを使用する傾向があります。
Document doc = new org.apache.xerces.dom.DocumentImpl();
|
このコードを使う場合は、いくつかの問題があります。
- コードがApache Xercesに結び付けられ、他のパーサーを使って処理するのが難しくなる。
- 使っているパーサーの別のバージョンでは、このコードは動作さえしないことがしばしばある。
- そもそも、これはDOM作成機構にアクセスする適切な方法ではない。
このインターフェースがベンダー固有のものであることに加え、org.w3c.dom.DocumentTypeインターフェースのインプリメンテーションを入手するためにも、付加的なベンダー固有のステップを実行しなければなりません。
より優れたアプローチは、org.w3c.dom.DOMImplementationクラスを使うことです。このクラスは、これら2つのインターフェースのファクトリーとして機能します。DOMDocumentインプリメンテーションを直接入手する代わりに、次のようなコードを使用します。
DOMImplementation domImpl =
new org.apache.xerces.dom.DOMImplementationImpl();
DocumentType docType = domImpl.createDocumentType("rootElementName", "public ID", "system ID");
Document doc = domImpl.createDocument("", "rootElementName", docType);
|
これで、DOMImplementationオブジェクトにアクセスできます。ツリーの構築に使用する両方のタイプのDOM構造 (DocumentTypeおよびDocumentインターフェース) を生成できます。これにより、前述した余分なベンダー固有のステップは不要になります。もちろん、Xerces固有のDOMImplementationインプリメンテーション・クラスを引き続き参照しているので、すべてが丸く収まったわけではありません。すでに述べたように、パーサーを変更するというだけの目的で、コード全体を再コンパイルしなければなりません。これは、現実的な解決策ではありません。
この問題を修正するにはより多くの作業が必要であり、その作業についてはこの連続記事の次のヒントで扱うことにします。今のところは、ブートストラッピングの基本的な概念と、そもそもなぜこれが問題になるのかについて理解しておいてください。次のヒントでは、コード内でDOMインプリメンテーションを具体的に参照しなければならないという要件を回避する方法を示し、実際にいくらかのプログラミングを行ってこれを処理します。それでは、またオンラインでお会いしましょう。
参考文献
著者について  | 
|  | Brett McLaughlin氏は、Logo (小さな三角形を覚えていますか?) の時代からコンピューターの仕事をしています。現在の専門は、JavaおよびJava関連のテクノロジーを使ったアプリケーション・インフラストラクチャーの構築です。ここ数年は、Nextel Communications and Allegiance Telecom, Inc. でこれらのインフラストラクチャーの実装に携わっています。Brett氏は、Javaサーブレットを使ってWebアプリケーション開発のための再利用可能なコンポーネント・アーキテクチャーを構築するJava ApacheプロジェクトTurbineの共同設立者の1人です。同氏はまた、オープン・ソースのEJBアプリケーション・サーバーであるEJBossプロジェクトと、オープン・ソースのXML Web公開エンジンであるCocoonにも貢献しています。Brettの連絡先は、brett@oreilly.com です。 |
記事の評価
|