次の方法で共有


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

メモリに読み込まれた XML ドキュメントは、ツリーという概念で表現されます。プログラミングでは、オブジェクト階層を利用してツリーのノードにアクセスします。XML コンテンツがどのようにノードに変換されるかを次の例に示します。

XML が DOM に読み込まれるとき、それぞれの部分はノードに変換されます。これらのノードには、ノード タイプや値など、自身に関する追加メタデータを保持します。ノード タイプは、そのノードのオブジェクトです。実行可能なアクションと取得または設定が可能なプロパティは、ノード タイプによって決定されます。

次のような簡単な XML があるとします。

入力

<book>
    <title>The Handmaid's Tale</title>
</book>

この入力は、メモリ上で次のようなノード ツリーとして表現され、ノード タイプ プロパティが割り当てられます。

book と title のノード ツリー表現

book 要素と title 要素は XmlElement になり、要素コンテンツは XmlText オブジェクトになります。XmlElement のメソッドとプロパティは、XmlText オブジェクトで使用できるメソッドとプロパティとは異なります。実行可能なアクションはノード タイプによって決定されるため、XML マークアップがどのノード タイプになるかを理解することがきわめて重要です。

XML データを読み込み、ノード タイプに応じて異なるテキストを書き出す例を次に示します。入力として、次の items.xml という XML データ ファイルを使用します。

入力

<?xml version="1.0"?>
<!-- This is a sample XML document -->
<!DOCTYPE Items [<!ENTITY number "123">]>
<Items>
  <Item>Test with an entity: &number;</Item>
  <Item>test with a child element <more/> stuff</Item>
  <Item>test with a CDATA section <![CDATA[<456>]]> def</Item>
  <Item>Test with a char entity: &#65;</Item>
  <!-- Fourteen chars in this element.-->
  <Item>1234567890ABCD</Item>
</Items>

items.xml ファイルを読み込み、それぞれのノード タイプの情報を表示するコード例を次に示します。

Imports System
Imports System.IO
Imports System.Xml

Public Class Sample
   Private Const filename As String = "items.xml"
      
   Public Shared Sub Main()
      Dim txtreader As XmlTextReader = Nothing
      Dim reader As XmlValidatingReader = Nothing
      
      Try
         ' Load the reader with the data file and 
   'ignore all whitespace nodes. 
         txtreader = New XmlTextReader(filename)
         txtreader.WhitespaceHandling = WhitespaceHandling.None
         
         ' Implement the validating reader over the text reader. 
         reader = New XmlValidatingReader(txtreader)
         reader.ValidationType = ValidationType.None
         
         ' Parse the file and display each of the nodes.
         While reader.Read()
            Select Case reader.NodeType
               Case XmlNodeType.Element
                  Console.Write("<{0}>", reader.Name)
               Case XmlNodeType.Text
                  Console.Write(reader.Value)
               Case XmlNodeType.CDATA
                  Console.Write("<![CDATA[{0}]]>", reader.Value)
               Case XmlNodeType.ProcessingInstruction
                  Console.Write("<?{0} {1}?>", reader.Name, reader.Value)
               Case XmlNodeType.Comment
                  Console.Write("<!--{0}-->", reader.Value)
               Case XmlNodeType.XmlDeclaration
                  Console.Write("<?xml version='1.0'?>")
               Case XmlNodeType.Document
               Case XmlNodeType.DocumentType
                  Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value)
               Case XmlNodeType.EntityReference
                  Console.Write(reader.Name)
               Case XmlNodeType.EndElement
                  Console.Write("</{0}>", reader.Name)
            End Select
         End While
      
      Finally
         If Not (reader Is Nothing) Then
            reader.Close()
         End If
      End Try
   End Sub 'Main ' End class
End Class 'Sample
[C#]
using System;
using System.IO;
using System.Xml;

public class Sample
{
  private const String filename = "items.xml";

  public static void Main()
  {
     XmlTextReader txtreader = null;
     XmlValidatingReader reader = null;

     try
     {  
        // Load the reader with the data file and ignore 
     // all whitespace nodes.
        txtreader = new XmlTextReader(filename);
        txtreader.WhitespaceHandling = WhitespaceHandling.None;

        // Implement the validating reader over the text reader. 
        reader = new XmlValidatingReader(txtreader);
        reader.ValidationType = ValidationType.None;

        // Parse the file and display each of the nodes.
        while (reader.Read())
        {
           switch (reader.NodeType)
           {
             case XmlNodeType.Element:
               Console.Write("<{0}>", reader.Name);
               break;
             case XmlNodeType.Text:
               Console.Write(reader.Value);
               break;
             case XmlNodeType.CDATA:
               Console.Write("<![CDATA[{0}]]>", reader.Value);
               break;
             case XmlNodeType.ProcessingInstruction:
               Console.Write("<?{0} {1}?>", reader.Name, reader.Value);
               break;
             case XmlNodeType.Comment:
               Console.Write("<!--{0}-->", reader.Value);
               break;
             case XmlNodeType.XmlDeclaration:
               Console.Write("<?xml version='1.0'?>");
               break;
             case XmlNodeType.Document:
               break;
             case XmlNodeType.DocumentType:
               Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value);
               break;
             case XmlNodeType.EntityReference:
               Console.Write(reader.Name);
               break;
             case XmlNodeType.EndElement:
               Console.Write("</{0}>", reader.Name);
               break;
           }       
        }           
     }

     finally
     {
        if (reader!=null)
          reader.Close();
     }
  }
} // End class

この例の出力を確認すると、データからノード タイプへのマップがわかります。

出力

<?xml version='1.0'?><!--This is a sample XML document --><!DOCTYPE Items [<!ENTITY number "123">]<Items><Item>Test with an entity: 123</Item><Item>test with a child element <more> stuff</Item><Item>test with a CDATA section <![CDATA[<456>]]> def</Item><Item>Test with a char entity: A</Item><--Fourteen chars in this element.--><Item>1234567890ABCD</Item></Items>

入力の各行に注目し、コードから生成された出力と対比させた表を次に示します。この表によって、どのノード テストによってどの出力行が生成されたのかを分析でき、どの XML データがどのノード タイプになるかがわかります。

入力 出力 ノード タイプのテスト
<?xml version="1.0"?> <?xml version='1.0'?> XmlNodeType.XmlDeclaration
<!-- This is a sample XML document --> <!--This is a sample XML document --> XmlNodeType.Comment
<!DOCTYPE Items [<!ENTITY number "123">]> <!DOCTYPE Items [<!ENTITY number "123">] XmlNodeType.DocumentType
<Items> <Items> XmlNodeType.Element
<Item> <Item> XmlNodeType.Element
Test with an entity: &number;</Item> Test with an entity: 123 XmlNodeType.Text
</Item> </Item> XmlNodeType.EndElement
<Item> <Item> XmNodeType.Element
test with a child element test with a child element XmlNodeType.Text
<more> <more> XmlNodeType.Element
stuff stuff XmlNodeType.Text
</Item> </Item> XmlNodeType.EndElement
<Item> <Item> XmlNodeType.Element
test with a CDATA section test with a CDATA section XmlTest.Text
<![CDATA[<456>]]> <![CDATA[<456>]]> XmlTest.CDATA
def def XmlNodeType.Text
</Item> </Item> XmlNodeType.EndElement
<Item> <Item> XmlNodeType.Element
Test with a char entity: &#65; Test with a char entity: A XmlNodeType.Text
</Item> </Item> XmlNodeType.EndElement
<!-- Fourteen chars in this element.--> <--Fourteen chars in this element.--> XmlNodeType.Comment
<Item> <Item> XmlNodeType.Element
1234567890ABCD 1234567890ABCD XmlNodeType.Text
</Item> </Item> XmlNodeType.EndElement
</Items> </Items> XmlNodeType.EndElement

有効なアクションの種類と設定および取得できるプロパティの種類はノード タイプによって決定されるため、割り当てられるノード タイプを知る必要があります。

空白を含むノードの作成は、データを DOM に読み込むときに PreserveWhitespace フラグによって制御します。詳細については、「DOM を読み込むときの空白および有意の空白の処理」を参照してください。

DOM に新しいノードを追加するには、「XML ドキュメントへのノードの挿入」を参照してください。DOM からノードを削除するには、「XML ドキュメントからのノード、コンテンツ、値の削除」を参照してください。DOM のノードのコンテンツを編集するには、「XML ドキュメントのノード、コンテンツ、値の変更」を参照してください。

参照

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