次の方法で共有


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

XML ドキュメントがメモリ内にある場合、概念表現はツリーです。 プログラミングの場合、ツリーのノードにアクセスするためのオブジェクト階層があります。 次の例は、XML コンテンツがノードになる方法を示しています。

XML が XML ドキュメント オブジェクト モデル (DOM) に読み込まれると、その部分はノードに変換され、これらのノードはノードの種類や値など、それ自体に関する追加のメタデータを保持します。 ノードの種類はそのオブジェクトであり、実行できるアクションと、設定または取得できるプロパティを決定します。

次の単純な XML がある場合:

入力

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

入力は、割り当てられたノード型プロパティを持つ次のノード ツリーとしてメモリ内で表されます。

ノード ツリーの例
ブックとタイトル ノード ツリーの表現

book要素は XmlElement オブジェクトになり、次の要素titleXmlElement になり、要素の内容は XmlText オブジェクトになります。 XmlElement のメソッドとプロパティを見ると、メソッドとプロパティは、XmlText オブジェクトで使用できるメソッドとプロパティとは異なります。 そのため、XML マークアップがどのノードタイプになるかを知ることは重要です。これは、そのノードタイプが実行できるアクションを決定するためです。

次の例では、XML データを読み取り、ノードの種類に応じて異なるテキストを書き出します。 次の XML データ ファイルを入力として使用 して、items.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: A</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 reader As XmlTextReader = Nothing  
  
        Try  
            ' Load the reader with the data file and
            'ignore all white space nodes.
            reader = New XmlTextReader(filename)  
            reader.WhitespaceHandling = WhitespaceHandling.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  
using System;  
using System.IO;  
using System.Xml;  
  
public class Sample  
{  
    private const String filename = "items.xml";  
  
    public static void Main()  
    {  
        XmlTextReader reader = null;  
  
        try  
        {  
            // Load the reader with the data file and ignore
            // all white space nodes.  
            reader = new XmlTextReader(filename);  
            reader.WhitespaceHandling = WhitespaceHandling.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>

一度に 1 行ずつ入力し、コードから生成された出力を使用して、次の表を使用して、どの出力行を生成したノード テストを分析し、どのような XML データがノードの種類になったかを理解できます。

インプット アウトプット ノードの種類のテスト
<?xml version="1.0"?> <?xml version='1.0'?> XmlNodeType.XmlDeclaration
<-- これはサンプル XML ドキュメントです--> <--これはサンプル XML ドキュメントです--> XmlNodeType.Comment
<!DOCTYPE アイテム [<!ENTITY 番号 "123">]> <!DOCTYPE アイテム [<!ENTITY 番号 "123">] XmlNodeType.DocumentType
<項目> <項目> XmlNodeType.Element
<アイテム> <アイテム> XmlNodeType.Element
エンティティを使用してテストする: > エンティティを使用してテストする: 123 XmlNodeType.Text
</アイテム> </アイテム> XmlNodeType.EndElement
<アイテム> <アイテム> XmNodeType.Element
子要素を使用してテストする 子要素を使用してテストする XmlNodeType.Text
<もっとその> <もっとその> XmlNodeType.Element
詰め込む 詰め込む XmlNodeType.Text
</アイテム> </アイテム> XmlNodeType.EndElement
<アイテム> <アイテム> XmlNodeType.Element
CDATA セクションを使用してテストする CDATA セクションを使用してテストする XmlTest.Text
<![CDATA[<456>]]> <![CDATA[<456>]]> XmlTest.CDATA
デフ デフ XmlNodeType.Text
</アイテム> </アイテム> XmlNodeType.EndElement
<アイテム> <アイテム> XmlNodeType.Element
char エンティティを使用してテストする: >#65; char エンティティを使用してテストする: A XmlNodeType.Text
</アイテム> </アイテム> XmlNodeType.EndElement
<この要素の 14 文字を--します。--> <--この要素の 14 文字。--> XmlNodeType.Comment
<アイテム> <アイテム> XmlNodeType.Element
1234567890ABCD 1234567890ABCD XmlNodeType.Text
</アイテム> </アイテム> XmlNodeType.EndElement
</項目> </項目> XmlNodeType.EndElement

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

空白のノード作成は、 PreserveWhitespace フラグによってデータが DOM に読み込まれるときに制御されます。 詳細については、「DOM の 読み込み時の空白と重要な空白処理」を参照してください。

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

こちらも参照ください