[XML.NET] 20. XmlReader 클래스 ReadInnerXml, ReadOuterXml

 XmlReader 클래스에서는 요소 읽기와 특성 읽기 외에도 XML 데이터 소스에 있는 다양한 내용을 읽기 위한 메서드와 속성을 제공하고 있습니다.여기에서는 이러한 부가적인 기능과 속성을 개괄적으로 소개할게요.

 현재 노드의 내용을 문자열로 반환하는 ReadString 메서드를 제공하고 있습니다. ReadString 메서드를 이용하면 새로운 태그가 나타나기 전의 내용을 문자열 형태로 반환합니다.

public string ReadString ( );
if (reader.IsStartElement("book"))
{
    Console.WriteLine(reader.ReadString());
}

 태그 내부에 있는 모든 내용을 문자열로 읽을 때는 ReadInnerXml 메서드를 이용합니다.

public string ReadInnerXml ( );

  그리고 태그를 포함하여 현재 위치의 노드와 모든 자식 노드의 정보를 얻고자 할 때는 ReadOuterXml 메서드를 사용합니다.

public string ReadOuterXml ( );

 다음의 XML 데이터 파일을 소스로 XmlReader 개체를 만들어서 ReadInnerXml 메서드와 ReadOuterXml 메서드의 결과가 어떻게 다른지 간단히 살펴봅시다.

다음은 “data.xml” 데이터 파일의 내용입니다.

<?xml version="1.0" encoding="utf-8"?>
<books>
  <book price="12000" count="50">
    <title>ADO.NET </title>
  </book>
  <book price="15000" count="60">
    <title>XML.NET </title>
  </book>
</books>

 다음은 ReadInnerXml메서드 호출 예제 코드입니다.

using System;
using System.Xml;

namespace 예제_ReadInnerXml_사용
{
    class Program
    {
        static void Main(string[] args)
        {
            using(XmlReader reader = XmlReader.Create("data.xml"))
            {
                while(reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        Console.WriteLine("---ReadInnerXml 호출 결과---");
                        Console.WriteLine(reader.ReadInnerXml());                        
                    }                                        
                }
            }
        }
    }
}
실행 화면

다음은 ReadOuterXml 메서드 호출 예제 코드입니다.

using System;
using System.Xml;

namespace 예제_ReadOuterXml_사용
{
    class Program
    {
        static void Main(string[] args)
        {
            using (XmlReader reader = XmlReader.Create("data.xml"))
            {
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        Console.WriteLine("---ReadOuterXml 호출 결과---");
                        Console.WriteLine(reader.ReadOuterXml());                        
                    }
                }
            }
        }
    }
}
실행 화면

 이 외에 처리 명령이나 문서 형식, 주석, 공백 같은 형식의 노드를 거너뛰고 실제 내용이 있는 노드로 이동하는 MoveToContent 메서드를 제공하고 있습니다. MoveToContent 메서드에서는 현재 위치의 노드 형식을 반환합니다.

public XmlNodeType MoveToContent ( );

 그리고 ReadSubtree 메서드를 이용하면 현재 노드 위치부터 자식 노드들을 읽을 때 사용할 XmlReader 개체를 반환받아 사용할 수 있습니다.

public virtual XmlReader ReadSubtree ( );