C# XmlReader를 활용한 XML 데이터 읽기

XML은 많은 어플리케이션에서 데이터를 저장하고 전송하는 데에 널리 사용되는 형식입니다. C#에서는 XML 데이터를 읽고 처리하기 위해 XmlReader 클래스를 제공합니다. 이 클래스는 XML 데이터를 빠르고 효율적으로 읽을 수 있는 도구를 제공합니다. 이제 C# XmlReader를 활용하여 XML 데이터를 어떻게 읽고 처리할 수 있는지 알아보겠습니다.

XmlReader

XmlReader는 XML 데이터에 빠르고 캐시되지 않은, 단방향 액세스를 제공하는 리더를 나타냅니다. 이 클래스는 System.Xml 네임스페이스에서 제공되며, XML 데이터를 순차적으로 읽을 수 있습니다.

XmlWriter 에 관한 글은 다음을 참조 하실 수 있습니다.

C# XmlReader 예시

다음 예시는 간단한 C# XmlReader를 생성합니다.

example.xml이 다음과 같다고 가정 할때

<?xml version="1.0" encoding="utf-8"?>
<value>HaroStudio</value>

매우 간단한 XML 파일이 있습니다.

using System.Xml;

class Program
{
    static void Main()
    {
        using var reader = XmlReader.Create("example.xml");

        reader.MoveToContent();
        var data = reader.ReadElementContentAsString();

        Console.WriteLine(data);
    }
}

이 예시에서는 XmlReader로부터 간단한 XML 문서의 값을 읽습니다.

using var reader = XmlReader.Create("example.xml");

XmlReader는 Create 메서드로 생성됩니다.

reader.MoveToContent();

MoveToContent 메서드는 비-컨텐츠 노드를 건너뛰고 다음 컨텐츠 노드 또는 파일의 끝으로 이동합니다.

var data = reader.ReadElementContentAsString();

ReadElementContentAsString은 현재 요소를 읽고 내용을 문자열로 반환합니다.

출력은 다음과 같습니다.

HaroStudio

C# XmlReader ReadToFollowing

ReadToFollowing 메서드는 지정된 이름과 일치하는 다음 요소로 리더를 이동시키고 일치하는 요소를 찾으면 true를 반환합니다.

=> books.xml

<bookstore>
    <book genre='Computer'>
        <title>XML Developer's Guide</title>
        <author>Gambardella, Matthew</author>
        <price>44.99</price>
    </book>
    <book genre='Fantasy'>
        <title>Midnight Rain</title>
        <author>Ralls, Kim</author>
        <price>59.0</price>
    </book>
</bookstore>

이 XML 파일에는 책이 있습니다.

using System;
using System.Xml;

class Program
{
    static void Main()
    {
        using var reader = XmlReader.Create("books.xml");

        reader.ReadToFollowing("book");

        do
        {
            reader.MoveToFirstAttribute();
            Console.WriteLine($"장르: {reader.Value}");

            reader.ReadToFollowing("title");
            Console.WriteLine($"제목: {reader.ReadElementContentAsString()}");

            reader.ReadToFollowing("author");
            Console.WriteLine($"작가: {reader.ReadElementContentAsString()}");

            reader.ReadToFollowing("price");
            Console.WriteLine($"가격: {reader.ReadElementContentAsString()}");

            Console.WriteLine("-------------------------");

        } while (reader.ReadToFollowing("book"));
    }
}

이 예시는 books.xml 파일에서 두 권의 책을 읽습니다.

reader.ReadToFollowing("book");

첫 번째 책 요소로 진행합니다.

reader.MoveToFirstAttribute();
Console.WriteLine("genre: {reader.Value}");

MoveToFirstAttribute로 장르 속성을 읽습니다.

reader.ReadToFollowing("제목");
Console.WriteLine("제목: {reader.ReadElementContentAsString()}");

제목 요소의 내용을 읽습니다.

} while (reader.ReadToFollowing("book"));

while 루프를 사용하여 XML 파일의 모든 책 요소를 반복합니다.

출력은 다음과 같습니다.

장르: Computer
제목: XML Developer's Guide
작가: Gambardella, Matthew
가격: 44.99
-------------------------
장르: Fantasy
제목: Midnight Rain
작가: Ralls, Kim
가격: 59.0
-------------------------

C# XmlReader Read

Read 메서드는 스트림에서 다음 노드를 읽습니다.

=> products.xml

<?xml version="1.0" encoding="utf-8"?>
<products>
    <product>
        <id>1</id>
        <name>Product A</name>
        <price>1200</price>
    </product>

    <product>
        <id>2</id>
        <name>Product B</name>
        <price>1100</price>
    </product>
</products>

이 XML 파일에는 제품이 있습니다.

using System;
using System.Xml;

class Program
{
    static void Main()
    {
        Console.WriteLine("제품 목록");
        Console.WriteLine("----------------------");

        using (var reader = XmlReader.Create("products.xml"))
        {
            reader.MoveToContent();

            while (reader.Read())
            {
                string result = reader.NodeType switch
                {
                    XmlNodeType.Element when reader.Name == "product" => $"{reader.Name}\n",
                    XmlNodeType.Element => $"{reader.Name}: ",
                    XmlNodeType.Text => $"{reader.Value}\n",
                    XmlNodeType.EndElement when reader.Name == "product" => "-------------------\n",
                    _ => ""
                };

                Console.Write(result);
            }
        }
    }
}

이 예시는 XML 파일을 노드별로 읽고, 특정 요소, 텍스트, 속성 또는 다른 유형의 노드를 처리하는 전형적인 방법을 보여줍니다.

reader.MoveToContent();

루트 요소를 건너뛰고 문서의 내용으로 바로 이동합니다.

while (reader.Read())

Read 메서드는 문서의 끝까지 다음 노드를 읽습니다.

string result = reader.NodeType switch
{
    XmlNodeType.Element when reader.Name == "product" => $"{reader.Name}\n",
    XmlNodeType.Element => $"{reader.Name}: ",
    XmlNodeType.Text => $"{reader.Value}\n",
    XmlNodeType.EndElement when reader.Name == "product" => "-------------------\n",
    _ => ""
};

switch 표현식을 사용하여 다른 노드 유형을 처리합니다. Name 속성은 현재 노드의 이름을 제공합니다. Value 속성은 현재 노드의 텍스트 값을 가져옵니다.

제품 목록
----------------------
product
id: 1
name: Product A
price: 1200
-------------------
product
id: 2
name: Product B
price: 1100
-------------------

결론

C#의 XmlReader 클래스는 XML 데이터를 읽고 처리하는 데 필수적인 도구입니다. Read 메서드를 통해 XML 파일을 스트리밍 방식으로 처리하여 메모리를 효율적으로 활용할 수 있습니다. 이를 통해 대용량 XML 파일을 다루는 데 효율적이고 성능적으로 우수한 솔루션을 제공할 수 있습니다.

Leave a Comment