オブジェクト階層の XML データへのマップMapping the Object Hierarchy to XML Data

メモリに読み込まれた XML ドキュメントは、ツリーという概念で表現されます。When an XML document is in memory, the conceptual representation is a tree. プログラミングでは、オブジェクト階層を利用してツリーのノードにアクセスします。For programming, you have an object hierarchy to access the nodes of the tree. XML コンテンツがどのようにノードに変換されるかを次の例に示します。The following example shows you how the XML content becomes nodes.

XML が XML ドキュメント オブジェクト モデル (DOM) に読み込まれると、各部がノードに変換されます。これらのノードは、ノード型や値など、ノード自身に関する付加的なメタデータを保持しています。As the XML is read into the XML Document Object Model (DOM), the pieces are translated into nodes, and these nodes retain additional metadata about themselves, such as their node type and values. ノード型はノードのオブジェクトであり、ノード型によって実行可能なアクションおよび設定や取得が可能なプロパティが決まります。The node type is its object and is what determines what actions can be performed and what properties can be set or retrieved.

次のような簡単な XML があるとします。If you have the following simple XML:

入力Input

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

この入力は、メモリ上で次のようなノード ツリーとして表現され、ノード型プロパティが割り当てられます。The input is represented in memory as the following node tree with the assigned node type property:

サンプル ノード ツリーexample node tree
book と title のノード ツリー表現Book and title node tree representation

book 要素は XmlElement オブジェクトになり、次の要素の titleXmlElement になりますが、要素コンテンツは XmlText オブジェクトになります。The book element becomes an XmlElement object, the next element, title, also becomes an XmlElement, while the element content becomes an XmlText object. XmlElement のメソッドとプロパティは、XmlText オブジェクトで使用できるメソッドとプロパティとは異なります。In looking at the XmlElement methods and properties, the methods and properties are different than the methods and properties available on an XmlText object. 実行可能なアクションはノード型によって決定されるため、XML マークアップがどのノード型になるかを理解することがきわめて重要です。So knowing what node type the XML markup becomes is vital, as its node type determines the actions that can be performed.

XML データを読み込み、ノード型に応じて異なるテキストを書き出す例を次に示します。The following example reads in XML data and writes out different text, depending on the node type. 入力として、次の items.xml という XML データ ファイルを使用します。Using the following XML data file as input, items.xml:

入力Input

<?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 ファイルを読み込み、それぞれのノード型の情報を表示するコード サンプルを次に示します。The following code example reads the items.xml file and displays information for each node type.

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  

この例の出力を確認すると、データからノード型へのマップがわかります。The output from the example reveals the mapping of the data to the node types.

出力Output

<?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 データがどのノード型になったかがわかります。Taking the input one line at a time and using the output generated from the code, you can use the following table to analyze what node test generated which lines of output, thereby understanding what XML data became what kind of node type.

入力Input OutputOutput ノード型のテストNode Type Test
<?xml version="1.0"?> <?xml version='1.0'?> XmlNodeType.XmlDeclarationXmlNodeType.XmlDeclaration
<!-- This is a sample XML document --> <!--This is a sample XML document --> XmlNodeType.CommentXmlNodeType.Comment
<!DOCTYPE Items [<!ENTITY number "123">]><!DOCTYPE Items [<!ENTITY number "123">]> <!DOCTYPE Items [<!ENTITY number "123">]<!DOCTYPE Items [<!ENTITY number "123">] XmlNodeType.DocumentTypeXmlNodeType.DocumentType
<Items> <Items> XmlNodeType.ElementXmlNodeType.Element
<Item> <Item> XmlNodeType.ElementXmlNodeType.Element
Test with an entity: &number;Test with an entity: &number; Test with an entity:123Test with an entity: 123 XmlNodeType.TextXmlNodeType.Text
</Item> </Item> XmlNodeType.EndElementXmlNodeType.EndElement
<Item> <Item> XmNodeType.ElementXmNodeType.Element
test with a child elementtest with a child element test with a child elementtest with a child element XmlNodeType.TextXmlNodeType.Text
<more> <more> XmlNodeType.ElementXmlNodeType.Element
stuffstuff stuffstuff XmlNodeType.TextXmlNodeType.Text
</Item> </Item> XmlNodeType.EndElementXmlNodeType.EndElement
<Item> <Item> XmlNodeType.ElementXmlNodeType.Element
test with a CDATA sectiontest with a CDATA section test with a CDATA sectiontest with a CDATA section XmlTest.TextXmlTest.Text
<![CDATA[<456>]]><![CDATA[<456>]]> <![CDATA[<456>]]><![CDATA[<456>]]> XmlTest.CDATAXmlTest.CDATA
defdef defdef XmlNodeType.TextXmlNodeType.Text
</Item> </Item> XmlNodeType.EndElementXmlNodeType.EndElement
<Item> <Item> XmlNodeType.ElementXmlNodeType.Element
Test with a char entity: &#65;Test with a char entity: &#65; Test with a char entity:ATest with a char entity: A XmlNodeType.TextXmlNodeType.Text
</Item> </Item> XmlNodeType.EndElementXmlNodeType.EndElement
<!-- Fourteen chars in this element.--> <--Fourteen chars in this element.--> XmlNodeType.CommentXmlNodeType.Comment
<Item> <Item> XmlNodeType.ElementXmlNodeType.Element
1234567890ABCD1234567890ABCD 1234567890ABCD1234567890ABCD XmlNodeType.TextXmlNodeType.Text
</Item> </Item> XmlNodeType.EndElementXmlNodeType.EndElement
</Items> </Items> XmlNodeType.EndElementXmlNodeType.EndElement

有効なアクションの種類と設定および取得できるプロパティの種類はノード型によって決まるため、割り当てられているノード型を知っておく必要があります。You must know what node type is assigned, as the node type controls what kinds of actions are valid and what kind of properties you can set and retrieve.

空白ノードの作成は、データが DOM に読み込まれるときに PreserveWhitespace フラグによって制御されます。Node creation for white space is controlled when the data is loaded into the DOM by the PreserveWhitespace flag. 詳細については、「DOM を読み込むときの空白および有意の空白の処理」を参照してください。For more information, see White Space and Significant White Space Handling when Loading the DOM.

DOM に新しいノードを追加するには、「XML ドキュメントへのノードの挿入」を参照してください。To add new nodes to the DOM, see Inserting Nodes into an XML Document. DOM からノードを削除するには、「XML ドキュメントからのノード、コンテンツ、値の削除」を参照してください。To remove nodes from the DOM, see Removing Nodes, Content, and Values from an XML Document. DOM のノードのコンテンツを編集するには、「XML ドキュメントのノード、コンテンツ、値の変更」を参照してください。To modify the content of nodes in the DOM, see Modifying Nodes, Content, and Values in an XML Document.

関連項目See also