다음을 통해 공유


XML 데이터에 개체 계층 구조 매핑

XML 문서가 메모리에 있는 경우 개념적 표현은 트리입니다. 프로그래밍의 경우 트리의 노드에 액세스할 수 있는 개체 계층 구조가 있습니다. 다음 예제에서는 XML 콘텐츠가 노드가 되는 방법을 보여 줍니다.

XML이 XML DOM(문서 개체 모델)에 읽혀질 때 조각은 노드로 변환되고 이러한 노드는 노드 형식 및 값과 같은 자체에 대한 추가 메타데이터를 유지합니다. 노드 형식은 해당 개체이며 수행할 수 있는 작업과 설정하거나 검색할 수 있는 속성을 결정합니다.

다음과 같은 간단한 XML이 있는 경우:

입력

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

입력은 할당된 노드 형식 속성을 사용하여 다음 노드 트리로 메모리에 표시됩니다.

예제 노드 트리
책과 제목의 노드 트리 표현

요소는 bookXmlElement 개체가 되고, 다음 요소는 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>

입력을 한 번에 한 줄씩 사용하고 코드에서 생성된 출력을 사용하여 다음 표를 사용하여 출력 줄을 생성한 노드 테스트를 분석하여 어떤 XML 데이터가 어떤 종류의 노드 형식이 되었는지 이해할 수 있습니다.

입력 출력 노드 유형 테스트
<?xml version="1.0"?> <?xml version='1.0'?> XmlNodeType.XmlDeclaration
<-- 샘플 XML 문서입니다.> <--이 예제 XML 문서입니다.> XmlNodeType.Comment
<!DOCTYPE 항목 [<!ENTITY 번호 "123">]> <!DOCTYPE 항목 [<!ENTITY 번호 "123">] XmlNodeType.DocumentType
<항목> <항목> XML 노드 유형: 요소
<항목> <항목> XML 노드 유형: 요소
엔터티로 테스트: &number; 엔터티로 테스트: 123 XmlNodeType.Text (텍스트 노드 유형)
</항목> </항목> XmlNodeType.EndElement
<항목> <항목> XmNodeType.Element
자식 요소를 사용하여 테스트 자식 요소를 사용하여 테스트 XmlNodeType.Text (텍스트 노드 유형)
<더> <더> XML 노드 유형: 요소
물건 물건 XmlNodeType.Text (텍스트 노드 유형)
</항목> </항목> XmlNodeType.EndElement
<항목> <항목> XML 노드 유형: 요소
CDATA 섹션을 사용하여 테스트 CDATA 섹션을 사용하여 테스트 XmlTest.Text
<! [CDATA[<456>]]> <! [CDATA[<456>]]> XmlTest.CDATA
def def XmlNodeType.Text (텍스트 노드 유형)
</항목> </항목> XmlNodeType.EndElement
<항목> <항목> XML 노드 유형: 요소
char 엔터티로 테스트: A char 엔터티를 사용하여 테스트: A XmlNodeType.Text (텍스트 노드 유형)
</항목> </항목> XmlNodeType.EndElement
<이 요소에 14개의 문자를 --.> <--이 요소에 있는 14개의 문자입니다.--> XmlNodeType.Comment
<항목> <항목> XML 노드 유형: 요소
1234567890ABCD 1234567890ABCD XmlNodeType.Text (텍스트 노드 유형)
</항목> </항목> XmlNodeType.EndElement
</항목> </항목> XmlNodeType.EndElement

노드 형식이 유효한 작업의 종류와 설정하고 검색할 수 있는 속성 종류를 제어하므로 어떤 노드 형식이 할당되었는지 알고 있어야 합니다.

공백에 대한 노드 생성은 PreserveWhitespace 플래그에 의해 데이터가 DOM에 로드될 때 제어됩니다. 자세한 내용은 DOM을 로드할 때 공백 및 중요한 공백 처리를 참조하세요.

DOM에 새 노드를 추가하려면 XML 문서에 노드 삽입을 참조하세요. DOM에서 노드를 제거하려면 XML 문서에서 노드, 콘텐츠 및 값 제거를 참조하세요. DOM에서 노드의 콘텐츠를 수정하려면 XML 문서에서 노드, 콘텐츠 및 값 수정을 참조하세요.

참고하십시오