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을 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. 다음 XML 데이터 파일(items.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>  

한 번에 한 줄씩 입력하고 코드에서 생성된 출력을 사용하면 다음 표를 사용하여 출력 줄을 생성한 노드 테스트를 분석할 수 있어 어떤 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 출력Output 노드 형식 테스트Node Type Test
<?xml version="1.0"?><?xml version="1.0"?> <?xml version='1.0'?><?xml version='1.0'?> XmlNodeType.XmlDeclarationXmlNodeType.XmlDeclaration
<!-- This is a sample XML document --><!-- This is a sample XML document --> <!--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> <Items><Items> XmlNodeType.ElementXmlNodeType.Element
<Item><Item> <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> </Item></Item> XmlNodeType.EndElementXmlNodeType.EndElement
<Item><Item> <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> <more><more> XmlNodeType.ElementXmlNodeType.Element
stuffstuff stuffstuff XmlNodeType.TextXmlNodeType.Text
</Item></Item> </Item></Item> XmlNodeType.EndElementXmlNodeType.EndElement
<Item><Item> <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> </Item></Item> XmlNodeType.EndElementXmlNodeType.EndElement
<Item><Item> <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> </Item></Item> XmlNodeType.EndElementXmlNodeType.EndElement
<!-- Fourteen chars in this element.--><!-- Fourteen chars in this element.--> <--Fourteen chars in this element.--><--Fourteen chars in this element.--> XmlNodeType.CommentXmlNodeType.Comment
<Item><Item> <Item><Item> XmlNodeType.ElementXmlNodeType.Element
1234567890ABCD1234567890ABCD 1234567890ABCD1234567890ABCD XmlNodeType.TextXmlNodeType.Text
</Item></Item> </Item></Item> XmlNodeType.EndElementXmlNodeType.EndElement
</Items></Items> </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.

공백에 대한 노드 생성은 PreserveWhitespace 플래그에 의해 DOM으로 데이터가 로드될 때 제어됩니다.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