Share via


XML ドキュメント オブジェクト モデル (DOM)

ドキュメント オブジェクト モデル (DOM) クラスは、XML ドキュメントのインメモリ表現です。DOM を使用すると、XML ドキュメントの読み込み、操作、および変更をプログラムから実行できます。XmlReader クラスでも XML を読み込むことができますが、XmlReader クラスが提供しているのは、非キャッシュ、前方参照専用、読み取り専用のアクセスです。つまり、XmlReader には、属性の値または要素の内容を編集する機能や、ノードを挿入したり削除したりする機能はありません。DOM の主な機能は編集です。XML データは、通常、メモリ上では構造的に表現されますが、実際の XML データをファイルに保存したり、別のオブジェクトから取り込む場合は、直線的な形式で格納されます。XML データの例を次に示します。

入力

<?xml version="1.0"?>
  <books>
    <book>
        <author>Carson</author>
        <price format="dollar">31.95</price>
        <pubdate>05/01/2001</pubdate>
    </book>
    <pubinfo>
        <publisher>MSPress</publisher>
        <state>WA</state>
    </pubinfo>
  </books> 

この XML データが DOM 構造に読み込まれるとき、メモリがどのように構造化されるかを次の図に示します。

XML ドキュメントの構造

図中のそれぞれの円は、XML ドキュメント構造における 1 つのノードを表します。これは XmlNode オブジェクトと呼ばれます。XmlNode オブジェクトは、DOM ツリーの基本オブジェクトです。XmlNode を拡張する XmlDocument クラスは、たとえばドキュメントをメモリに読み込んだり、XML をファイルに保存するなど、ドキュメント全体を操作するためのメソッドをサポートしています。さらに XmlDocument では、XML ドキュメント全体のノードを参照して操作する手段も提供されます。XmlNode および XmlDocument は、いずれもパフォーマンスと使いやすさが向上しています。これらのオブジェクトには、次の操作を実行するメソッドとプロパティがあります。

  • 要素ノード、エンティティ参照ノードなど、DOM に固有なノードへのアクセスと変更。

  • 要素ノードのテキストなど、ノードに格納されている情報およびノード全体の取得。

    メモ   DOM で提供される構造や編集機能をアプリケーションが必要としない場合は、XmlReader クラスと XmlWriter クラスで提供される、XML への非キャッシュ、前方参照専用のストリーム アクセスを利用できます。詳細については、「XmlReader による XML の読み取り」と「XmlWriter による XML の書き方」を参照してください。

Node オブジェクトには、適切に定義された基本的な特性と、メソッドおよびプロパティのセットが含まれます。オブジェクトが持つ特性のいくつかを次に示します。

  • 各ノードは 1 つの親ノードを持ちます。親ノードは、そのノードの 1 つ上のノードです。親ノードを持たないノードは、ドキュメントのルートだけです。ドキュメントのルートは最上位のノードであり、そのドキュメント自身とドキュメント フラグメントを格納します。

  • ほとんどのノードは、複数の子ノードを持つことができます。子ノードは、そのノードの 1 つ下のノードです。子ノードを持つことができるノード タイプの一覧を次に示します。

    • Document
    • DocumentFragment
    • EntityReference
    • Element
    • Attribute

    XmlDeclarationNotationEntityCDATASectionTextCommentProcessingInstructionDocumentType の各ノードには、子ノードはありません。

  • 図中に book および pubinfo として同レベルに表現されているノードは兄弟です。

DOM の特性の 1 つは、属性の取り扱い方法にあります。属性は、親子関係や兄弟関係の一部であるノードとは異なります。属性は要素ノードのプロパティと見なされ、名前と値のペアで構成されます。たとえば、要素 price に関連付けられている format="dollar" という形式の XML データがある場合は、単語 format が名前になり、format 属性の値は dollar になります。price ノードの format="dollar" 属性を見つけるには、price ** 要素ノードにカーソルを置いて、GetAttribute メソッドを呼び出します。詳細については、「DOM の属性へのアクセス」を参照してください。

XML をメモリに読み込むと、ノードが作成されます。ただし、すべてのノードが同じタイプというわけではありません。XML の要素の規則と構文は、処理命令の規則と構文とは異なります。さまざまなデータが読み込まれるに従って、各ノードにノード タイプが割り当てられます。このノード タイプによって、ノードの特性と機能が決定されます。

メモリに生成されるノード タイプの詳細については、「XML ノードの種類」を参照してください。ノード ツリーに作成されるオブジェクトの詳細については、「オブジェクト階層の XML データへのマップ」を参照してください。

Microsoft では、W3C の DOM Level 1 および Level 2 で規定されている API を拡張して XML ドキュメントの操作を簡単にしました。W3C の標準を完全にサポートする一方で、追加のクラス、メソッド、プロパティにより、W3C の XML DOM で実現できる以上の機能が付加されています。新しいクラスを使用すると、リレーショナル データにアクセスし、ADO.NET との同期をとりながら、データを XML として公開できます。詳細については、「Dataset と XmlDataDocument の同期」を参照してください。

DOM が最も役に立つのは、XML データをメモリに読み込み、その構造を変更したり、ノードを追加または削除したり、要素内のテキストとしてノードが保持しているデータを変更したりする場合です。ただし、他のクラスも用意されており、シナリオによっては DOM より高速になる場合もあります。XML に対して高速、非キャッシュ、前方専用のストリーム アクセスを行うには、XmlReaderXmlWriter を使用します。カーソル モデルと XPath を使用したランダム アクセスが必要な場合は、XPathNavigator クラスを使用します。

参照

XML ノードの種類 | オブジェクト階層の XML データへのマップ