次の方法で共有


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

更新 : November 2007

XML ドキュメント オブジェクト モデル (DOM) クラスは、XML ドキュメントのメモリ内表現です。DOM を使用すると、XML ドキュメントの読み込み、操作、および変更をプログラムから実行できます。XmlReader クラスも XML を読み込めますが、非キャッシュ、前方参照専用、読み取り専用のアクセスしか実行できません。つまり、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 ドキュメント構造

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

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

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

    hf9hbf87.alert_note(ja-jp,VS.90).gifメモ :

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

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

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

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

    • Document

    • DocumentFragment

    • EntityReference

    • Element

    • Attribute

    XmlDeclaration ノード、Notation ノード、Entity ノード、CDATASection ノード、Text ノード、Comment ノード、ProcessingInstruction ノード、DocumentType ノードは子ノードを持ちません。

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

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

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

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

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

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

参照

概念

XML ノードの種類

オブジェクト階層の XML データへのマップ