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 파일을 다루는 데 효율적이고 성능적으로 우수한 솔루션을 제공할 수 있습니다.