HOWTO · Csharp

C#에서 XML을 개체로 역직렬화

이 자습서에서는 예제를 사용하여 xml을 C# 개체로 역직렬화하는 다양한 방법을 배웁니다. Visual Studio xsd 도구의 붙여넣기 특수 기능을 사용하고 C#에 해당 클래스를 입력합니다.

이 페이지의 내용

XML을 C# 개체로 역직렬화하려면 문서 구조에 맞는 멤버를 가진 클래스를 정의하고 XmlSerializer을 사용합니다. 클래스를 직접 작성하거나 Visual Studio의 선택하여 붙여넣기로 XML 샘플에서 생성할 수 있고, XSD 도구로 XML 스키마에서 생성할 수도 있습니다. 클래스 생성은 형식을 만드는 단계이며, 역직렬화는 XML을 해당 형식의 인스턴스로 읽어 들이는 별도의 단계입니다. (선택하여 붙여넣기)

직접 작성한 클래스로 XML을 C# 개체로 역직렬화하기

<Company><Employee name="Ana" age="30" /></Company>와 같은 XML에서는 루트 요소가 Company 형식에 대응하고, 반복되는 Employee 요소는 컬렉션에 대응하며, name 및 age 특성은 XmlAttribute로 표시된 속성에 대응합니다. 요소와 특성 이름을 일치시키고, 문서에 네임스페이스가 있다면 이를 고려해야 합니다. XmlSerializer은 이 매핑을 사용해 문서를 개체 그래프로 읽어 들입니다.

다음 전체 예제를 실행합니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

public class Company
{
    [XmlElement("Employee")]
    public List<Employee> Employees { get; set; } = new List<Employee>();
}

public class Employee
{
    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlAttribute("age")]
    public int Age { get; set; }
}

public class Program
{
    public static void Main()
    {
        const string xml = "<Company><Employee name=\"Ana\" age=\"30\" /><Employee name=\"Bo\" age=\"32\" /></Company>";
        var serializer = new XmlSerializer(typeof(Company));
        using (var reader = new StringReader(xml))
        {
            var company = (Company)serializer.Deserialize(reader);
            Console.WriteLine($"Employees: {company.Employees.Count}; first: {company.Employees[0].Name}, {company.Employees[0].Age}");
        }
    }
}
Employees: 2; first: Ana, 30

파일을 읽는 애플리케이션에서는 StringReader 대신 해당 파일을 위한 StreamReader를 Deserialize에 전달합니다. XmlSerializer.Deserialize는 object를 반환하므로, 이 예제처럼 serializer가 예상하는 루트 형식인 Company로 캐스팅합니다. 역직렬화는 XML을 개체로 읽어 들이고, 직렬화는 그 반대 작업으로 개체를 XML으로 기록합니다. 값이나 요소 이름이 클래스 매핑과 다르면 문서에 맞게 형식이나 직렬화 특성을 조정합니다.

Visual Studio의 선택하여 붙여넣기로 XML에서 C# 클래스 생성하기

선택하여 붙여넣기를 사용하면 대표적인 XML 샘플을 바탕으로 기본 클래스 모델을 만들 수 있습니다. XML 문서를 복사하고 Visual Studio에서 C# 파일을 열거나 새로 만든 다음 Edit > Paste Special > Paste XML As Classes를 선택합니다. 스크린샷에는 Edit 메뉴의 Paste Special 하위 메뉴에 있는 명령이 표시됩니다.

Visual Studio의 Edit 메뉴에서 Paste Special 하위 메뉴를 펼쳐 Paste XML As Classes를 선택한 화면

스크린샷에는 펼쳐진 Edit > Paste Special 메뉴에서 Paste XML As Classes가 보입니다. 화면의 메뉴 문구는 영어로 표시됩니다.

생성된 클래스를 XmlSerializer의 대상 형식으로 사용합니다. 메뉴 명령 자체가 문서를 개체로 읽어 들이는 것은 아닙니다. 생성된 멤버 이름과 특성이 실제 XML에 맞는지 검토하세요. 특히 문서에 네임스페이스, 선택적 필드 또는 반복 요소가 있으면 주의해서 확인해야 합니다. 생성되는 구체적인 구조는 샘플에 따라 달라질 수 있으므로 초안으로 보고 필요한 수정 사항을 프로젝트에 반영하세요. 사용하는 환경에서 메뉴 항목을 사용할 수 없다면 위의 수동 매핑이나 아래의 스키마 작업 흐름을 이용하세요. 이 문서는 특정 Visual Studio 버전이나 워크로드를 전제로 하지 않습니다.

XSD 도구로 XML에서 C# 클래스 생성하기

XSD 작업 흐름에는 서로 다른 변환 단계가 두 가지 있습니다. 먼저 대표적인 XML 문서에서 XML 스키마를 만든 다음, 그 스키마에서 C# 클래스를 생성합니다. 파일이 작업 디렉터리에 있을 때는 xsd test.xml을 실행한 다음 xsd /c test.xsd를 실행합니다. 첫 번째 명령은 스키마 파일을 만들고, 두 번째 명령은 해당 스키마에서 C# 클래스를 생성하도록 요청합니다. 이 명령들은 도구의 입력과 실행 순서를 보여 주는 예입니다. 도구를 사용할 수 있는지와 호출 방법은 설치된 개발 환경에 따라 다를 수 있으므로 설치 경로를 단정하지 말고 해당 환경에서 제공하는 XSD 도구 문서를 참고하세요.

생성된 클래스와 멤버 이름은 직접 작성한 이름과 다를 수 있지만, XML 매핑 메타데이터를 통해 XmlSerializer이 문서의 요소와 특성을 대응시킬 수 있습니다. 생성이 끝나면 결과 클래스를 애플리케이션에서 참조하고, 위에서 설명한 XmlSerializer 패턴으로 XML 문서를 생성된 루트 형식으로 역직렬화합니다. 스키마나 소스 파일만 생성해서는 데이터가 채워진 개체가 만들어지지 않습니다. 작고 안정적인 형식에는 직접 작성한 클래스를, IDE에서 XML 샘플을 다룰 때는 선택하여 붙여넣기를, XSD이 작업 흐름에 포함되어 있거나 생성할 형식의 기준이 되어야 할 때는 스키마 방식을 선택하세요.