DOM

DOMとは、Document Object Model の略で、プラットフォームやプログラム言語に依存しない XML文書の標準的なプログラミングインターフェイスを定義した仕様を指します。

つまり、プログラム中からXML文書にアクセスする際のインターフェイスが DOMです。XML文書へのアクセスインターフェイスが標準化されていることにより、プログラムの再利用化、移植が容易になる便利さを持っています。

参考資料

http://www.w3.org/DOM/ W3C Document Object Model (DOM)

DOMの構造
XMLは、「パーサ」と呼ばれる読み込みプログラムを利用することにより、DOMツリー構造で XML文書をメモリ上に展開することができます。
メモリ上に展開すると、ツリー構造に階層化されたオブジェクトとして構成されます。このオブジェクトを「DOM」と呼びます。
DOMでメモリ上に展開された 。XMLデータは、DOMの標準的な API でアクセスすることが可能になります。
このように、XMLデータをメモリ上でオブジェクトとして管理し、標準的な API でアクセスすることにより、アプリケーションの部品化が進み、また、複数のアプリケーション間でプログラムを容易に流用することができるようになります。

アプリケーションから APIを通してXMLデータを参照する図

DOMには、DOM1DOM2、そして DOM3 までが W3C によって勧告されています。
DOM1で用意されているインターフェイスには、Core と呼ばれる部分と、HTML と呼ばれる2種類があります。
Core
ツリー構造でメモリ上に展開されたオブジェクトをアクセスするための、最も基本となる低水準インターフェイスが用意されています。
インターフェイスには、XMLHTMLのオブジェクトで共通的に利用できる基本インターフェイスと、XMLのオブジェクトのみで利用できる拡張インターフェイスの2種類があります。
HTML
Core部分と併用して、HTMLのオブジェクトのみで利用できる高水準のインターフェイスが用意されています。
DOM2仕様は実際には、Core、View、Event、Style、Traversal と Range、HTML という別々の6つのインターフェイスを持った勧告となっています。
DOM3仕様では、Core、Load&Save、Validation、Event、XPath などのインターフェイスが勧告されています。
(※ この章では DOM1 を中心に解説しています。古くて申し訳ありません、勉強します。)
DOMのインターフェイス
DOM1Core部分には、基本インターフェイスと拡張インターフェイスの2種類があります。これらのインターフェイスを使って XML文書にアクセスし、文書の内容を参照したり、操作することができます。
基本インターフェイスは、XMLHTMLのオブジェクトで共通に利用できるインターフェイスで、以下の表の通りです。
基本インターフェイス
Interface内容
DocumentXML 文書全体のルートを示すオブジェクトを操作する。
DocumentFlagment ツリー構造のルートを示すオブジェクトを操作する。
DOMImplementation XML宣言を操作する。
Comment コメント文を示すオブジェクトを操作する。
Node ツリー構造中の単一のツリー部分を示すオブジェクトを操作する。
NodeList 同じ階層上のノードの集合を示すオブジェクトを操作する。
Element 要素を示すオブジェクトを操作する。
Atrr 要素の属性を示すオブジェクトを操作する。
NamedNodeMap 要素の中の属性の集合を示すオブジェクトを操作する。
Text 要素の内容や属性の値を示すオブジェクトを操作する。
CharacterData 要素の内容や属性の値の文字列を操作する。
拡張インターフェイスは、XMLのオブジェクトのみで利用できるインターフェイスを提供するもので、以下の表のインターフェイスがあります。
拡張インターフェイス
Interface内容
CDATASectionCDATA セクションを示すオブジェクトを操作する。
ProcessingInstruction 処理命令を示すオブジェクトを操作する。
DocumentTypeDTD DTDを示すオブジェクトを操作する。
Notation 記法宣言を示すオブジェクトを操作する。
Entity エンティティ宣言を示すオブジェクトを操作する。
EntityReference エンティティ参照を示すオブジェクトを操作する。
Documentオブジェクトの生成
XML文書を DOMAPI で扱いたい場合、まず、Documentオブジェクトの生成と、XML文書の読み込みを行う必要があります。
XML文書の内容はあらかじめファイルで作成しておく方法と、JavaScript の中で作成する方法があります。特に、マイクロソフトの「Internet Explorer」JavaScriptを使用する場合、ActiveXサーバを生成するための処理を記述します。
ActiveX による Documentオブジェクトの生成
 ver Documentオブジェクト名=
 new ActiveXObject("ActiveサーバのプログラムID");
実際の ActiveXサーバのプログラムIDでは、「Microsoft XMLDOM」が割り当てられます。
JavaScriptによる Documentオブジェクトの生成
JavaScriptでは、そのプログラムの中で、あらかじめ作成された XML文書を読み込む方法があります。
JavaScriptによる XML文書の読み込み
 ver 戻り値 = Documentオブジェクト名.load(XML文書の URI);
実際の戻り値は true (読み込み成功)、false (読み込み失敗) となる。
具体的な記述として、
 var retNumber = magazineinfoDocument.load('magazineinfo.xml");
  if (retNumber != true) {
    window.alert("magazineinfoDocument Load Error!");
    }
このように magazineinfo.xml といったような読み込みさせたい XML文書のファイルを指定し、読み込みが成功すると、XML文書はツリー構造でメモリ上に展開されます。

XML文書の読み込みと表示方法を示した流れの図ただし、読み込まれた XML文書を Webブラウザで表示させたい場合には、XML以外に、HTMLXSL などのファイルが別途必要となります。

右の図は、HTML文書がメインとなり、JavaScriptの関数を呼び出すことで、XML文書と XSLスタイルシートの読み込みと表示が行われている流れの様子を示したものです。
いずれそのうちに、JavaScriptを利用した documentオブジェクトの生成サンプルを用意したいと思います。
Documentオブジェクトは XML文書の基本
Documentオブジェクトは、XML文書全体のツリー構造のルートオブジェクトになります。XML文書を操作する場合には、まず、Documentオブジェクトから操作することになります。
XML宣言の参照
Documentオブジェクトから参照する場合、その文書が XML文書なのか、あるいは HTML文書なのかという文書の種別とバージョンを確認する方法について述べます。
文書の種別を確認するため、まず、DOMImplementationオブジェクトの参照処理を行い、次に DOMImprementationオブジェクトのテスト処理を行います。
XML宣言の参照は、以下のように記述します。
DOMImplementationオブジェクトの利用
 var DOMImplementationオブジェクト名 = 
   Documentオブジェクト名.implementation;
DomImplementationオブジェクトのテスト
 var 戻り値 = DOMImplementationオブジェクト名.
     hasFeature("文書種別","バージョン");
hasFeature では、戻り値の文書種別が「XML」で、versionが「1.0」であれば1を返します。このテストで、文書の種別が特定できます。
具体的な XML宣言の参照の記述
 var DOMImplementationObject = DocumentObject.implementation;
 var RetNumber = DOMImplementationObject.hasFeature("XML","1.0");
  if (RetNumber != true ) {
    window.alert("magazineinfoImplement Error!");
    }
DTDの参照
Documentオブジェクトでは、DTD(文書型定義)に記述されているルート要素の名前や、エンティティ宣言、記法宣言の内容を参照することができます。
ルート要素の名前を参照する場合には、まず DocumentTypeオブジェクトの参照処理を行い、次に DTDのルート要素の名前の参照処理を行います。
ルート要素の名前の参照は、以下のように記述します。
DocumentTypeオブジェクトの参照
 var DocumentTypeオブジェクト名 = Documentオブジェクト名.doctype;
DTDのルート要素の名前の参照
 var ルート要素名 = DocumentTypeオブジェクト名.name;
具体的な記述として
 var DocumentTypeObject = DocumentObject.doctype;
 var RootElementName = DocumentTypeObject.name;
エンティティ宣言の内容を参照する場合には、DocumentTypeオブジェクトから参照処理を行った後に、エンティティ宣言のリストの参照処理を行います。
次いで、システム識別子や公開識別子、記芳名の参照処理を最後に行います。エンティティ宣言の内容を参照する場合、NamedNodeMapオブジェクトによって参照処理を行います。
エンティティ宣言の内容を参照する記述は以下の通りです。
エンティティリスト宣言のリストの参照
 var NamedNodeMapオブジェクト名 = DocumentTypeオブジェクト名.entities;
システム識別子の参照
 var システム識別子 = 
        NamedNodeMapオブジェクト名.item(マップの位置).systemId;
公開識別子の参照
 var 公開識別子 = 
        NamedNodeMapオブジェクト名.item(マップの位置).publicId;
記法名の参照
 var 記法名 = 
        NamedNodeMapオブジェクト名.item(マップの位置).notationName;
エンティティ宣言のリストを参照する具体的な記述は、
 var DocumentTypeObject = DocumentObject.doctype;
 var NamedNodeMapObject = DocumentTypeObject.entities;
 var SystemId = NamedNodeMapObject.item(0).systemId;
 var PublicId = NamedNodeMapObject.item(0).publicId;
 var NotationName = NamedNodeMapObject.item(0).natationName;
記法宣言の内容を参照する場合には、NamedNodeMapオブジェクトを利用して、記法宣言のリストの参照処理を行います。最後に、システム識別子や公開識別子の参照処理を行います。
記法宣言の内容の参照は、以下のように記述します。
記法宣言のリストの参照
 var NamedNodeMapオブジェクト名 = 
       DocumentTypeオブジェクト名.notations;
具体的な記法宣言のリストの参照の記述
 var DocumentTypeObject = DocumentObject.doctype;
 var NamedNodeMapObject = DocumentTypeObject.notations;
 var SystemId = NamedNodeMapObject.item(0).systemId;
 var PublicId = NamedNodeMapObject.item(0).publicId;
ルート要素の参照
Documentオブジェクトから、ルート要素の名前を参照するには、ルート要素のオブジェクトの参照処理を行った後に、ルート要素の名前の参照処理を行います。
ルート要素の名前を参照する記述は以下の通りです。
ルート要素のオブジェクトの参照
 var Elementオブジェクト名 = 
      Documentオブジェクト名.documentElement;
ルート要素の名前の参照
 var ルート要素名 = Elementオブジェクト名.tagName;
具体的なルート要素の名前の参照の記述
 var ElementObject = DocumentObject.documentElement;
 var RootElementName = ElementObject.tagName;
DOMで利用するオブジェクト
この節で登場したオブジェクトを以下の通りにまとめました。
オブジェクト内容
DOMImplementation インターフェイスとは、ドキュメントオブジェクトモデルの特定のインスタンスに依存しない処理を実行するための多くのメソッドをアプリケーションに提供します。
DocumentType DOM Level1Coreでの DocumentTypeインタフェースは文書のために定義されたエンティティのリストへのインターフェースを提供します。
NamedNodeMap NamedNodeMapインターフェースを実装しているオブジェクトは、名前によりアクセスすることができるノードの集合体を表わすために使われます。
Element Elementインターフェースにはルート要素、及びルート要素で示される Attr(属性)オブジェクトを名前によって取り出したり、属性の値を名前で取り出すためのメソッドを提供しています。
つづき → Nodeオブジェクトについて(未完)


Valid XHTML 1.1! Valid CSS! 初版更新日 2003年10月12日   最新更新日 2004年3月31日
Copyright(C) 2002〜2004 banban@scollabo.com