DOMはXMLを解析するに当たって、最初にXML文書の要素構造に対応する木構造をメモリ上に構築します。この概念はJavaScriptでHTMLを操作したことがある方には馴染み深いものでしょう。メモリを大きく消費する一方で、繰り返し更新を掛けてXML文書の構造を変更するような処理に適しているといえます。DOMツリーは、Javaではインタフェースの集まりになります。ツリーのノードになりうるインタフェースを表1に挙げます。概要NodeDOMツリーの一つのノードを表す。以下は全てNodeインタフェースの継承。文書に対する最小限度の種類のノードが用意されていることが分かります。散漫に感じる場合は、ノードの種類に対応するXML整形式規則(XML仕様)を確認していただく必要があります。DOMに関する若干の歴史DOMの登場当初('97-'98頃)は、JavaScriptの標準化を目的としているように受け取られたこともあります。MicroSoftのJScriptなどのベンダー実装が乖離し始めていました。Internationalによる標準化の試みであるECMAScriptによっても、なかなか実装される機能が集約されないという、混乱の予兆に満ちていました。HTMLの流れを後押ししようと決定したのです。して登場したのが、DOMです。DOMは、XML文書というマークアップ言語のモデリングを規定します。DOMは、誕生の契機こそJavaScriptでしたが、既に普及していたツーリー構造によるモデリングというアイデアを踏襲することを除いては、言語に依存しない、タグによるマークアップ言語において汎用的な、モデリング規則を定める仕様になっています。Javaは、DOMの主要なターゲット言語の一つという位置づけになります。JavaScriptは、クライアント・サイドでの文書の動的な処理であったり、サーバ・サイドでの負荷分散を目的とした前処理であったりという位置づけになります。一方で、DOMが言語の実装から抽象化されたことで、サーバ・サイドでの主たる処理に利用可能となり、汎用的なプログラミング言語における、強力な要素技術に昇華したのです。Javaは、DOMの可能性を最大限に引き出す能力を持つ言語の一つです。論より証拠、百聞は一見に如かずです。DOMを使ってXML文書を解析するJavaのソースコードを紹介しましょう。DOMパーサは、クラスorg.apache.xerces.parsers.DOMParserで参照します。リスト2は、メソッドparse()の引数のストリームからXML文書を受け取って、メソッドgetDocument()でDocumentインスタンスを生成するものです。}}リスト1に誤ったXML文書を読み込ませて見ましょう。「XML文書」で紹介したリスト1のXMLの冒頭をリスト2のように変更しましょう。リスト2は、name要素の終了タグが存在しないために、整形式ではありません。kind="email"></access>...リスト2のdemo2.xmlを読み込ませる実行結果は、リスト3のようになります。解析途中で例外org.xml.sax.SAXParseExceptionが発生していることが分かります。DomParseDemo.main(DomParseDemo.java:11)>一方、正しいXML文書である、リスト1のdemo.xmlを読み込ませた場合は、なにも出力されません。実際には、Documentインスタンスを取得した後、それを使って何らかの作業をすることになります。demo.xml>エラー・ハンドリングリスト1ではパーサのエラーを例外でキャッチしようとしましたが、XMLパーサのエラーはイベントとして発生するので、エラー・ハンドラという仕組みで取り扱うことができます。エラー・ハンドラは、インタフェースorg.xml.sax.ErrorHandlerを実装することで、アプリケーション側で用意します。定義されているメソッドは表2の三つです。exception)警告。インタフェースErrorHandlerの実装クラスとして、org.xml.sax.helpers.DefaultHandlerを使うことも可能です。EntityResolverのメソッドも実装しており、このクラスを継承することで、不要なメソッドの実装を省略することができます。リスト5はリスト1にErrorHandlerを追加したものです。}}リスト5のDomParseDemo2を使ってリスト2(demo2.xml)を処理したのが、リスト6になります。DomParseDemo2.main(DomParseDemo2.java:13)>DOMによる妥当性検証DTDを持つXML文書に対する妥当性検証を行ってみましょう。address.dtdとdemo.xmlを同じディレクトリに配置し、demo.xmlの冒頭にDTD宣言を追加します。ここではaddress要素にlang属性を追加してみましょう。lang="ja">...リスト7のdemo3.xmlは、DTDに定義されていないlang属性が記述されているため、妥当性検証には引っかかるはずですが、リスト1のDomParseDemoで処理してもなにも出力しません。XercesのDOMパーサは、デフォルトでは妥当性を検証しない設定になっています。そのため、DTD宣言が存在するXML文書でも、DTDがSYSTEM識別子から取得できない、XMLが整形式でない、DTDの構文が間違っているなどの場合を除いて例外を発生しません。XercesでDOMパーサに妥当性検証を行わせるには、フィーチャーと呼ばれる仕組みで指定します。XercesのDOMパーサのフィーチャーはURIの形式をしていて、非常にたくさんのものが定義されています。ここでは全てを紹介することはできませんが、DOM/SAX共通のもののなかから重要なものを表4に挙げました。詳細についてはXercesのドキュメントで参照いただけます。false妥当性検証を行うためには、parserに対して、次のように記述します。true);リスト1にフィーチャーの指定を追加したのが、リスト8になります。demo3.xmlを解析した結果がリスト9になります。"address".>demo3.xmlの場合は、確かに、DTDに定義されていないlang属性が不正であるため、エラーが報告されています。lang属性を削除して改めて実行していただければ、何も出力されないことを確かめられるでしょう。demo2.xmlの場合は、DTD宣言が存在しないためのエラーが報告されています。フィーチャーとして、DTD宣言が存在するときに限り妥当性検証を行う、"http://apache.org/xml/features/validation/dynamic"をtrueにすれば、このエラーは消えます。Schemaを使った文書も解析できるようになります。�������C�u。