C# xml 파싱 및 사용하는 방법 – 01[가장 쉬운 방법]

오늘은 C# xml 파싱 및 사용하는 방법에 대해 알아봅시다. Xml은 데이터 전송이나 저장을 위해 사용하는 데이터 구조 중 하나 입니다. 지난번에 적었던 글에서 사용했던 Json과 비슷한 용도로 사용되고 있습니다.

C# xml 파싱 및 사용하는 방법

Xml이란 무엇인가?

<?xml version="1.0"?>
<TestClass002_01 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Id>10</Id>
  <Value>20</Value>
  <Boolean>true</Boolean>
  <CustomData>
    <CustomClass002_01>
      <Code>10</Code>
      <Value>20</Value>
    </CustomClass002_01>
    <CustomClass002_01>
      <Code>30</Code>
      <Value>5</Value>
    </CustomClass002_01>
    <CustomClass002_01>
      <Code>60</Code>
      <Value>7</Value>
    </CustomClass002_01>
  </CustomData>
</TestClass002_01>

Xml은 일반적으로 위와 같은 형태를 가지고 있습니다. Json과 비슷하게 데이터를 전송하기 위해 만들어진 데이터 구조여서 그런지 그 형태나 구성이 Json과 비슷하게 되어있죠. 데이터, 즉 변수의 이름을 메타 데이터로 가지고 있기 때문에 사람이 해독하기 쉽고 따로 프로그램 없이 수정하기도 용이하죠. 생각보다 많은 곳에서 찾아볼 수 있습니다. 당장 제 블로그의 피드인 rss만 살펴봐도 xml로 이루어진 것을 확인할 수 있죠. 이외에도 다양한 게임 등에서 데이터 저장 용도로 Xml을 사용하기도 합니다. 대표적인 게임으로는 스타듀 밸리를 예로 들 수 있겠네요.

Xml은 다양한 방식으로 파싱이 가능합니다. 다만 이번 포스팅에서는 그 중에서도 가장 쉬운 방법에 대해 간단히 알아보려고 합니다.

바로 c#에서 제공되는 라이브러리 중 하나인 Xml.Serialization 라이브러리를 사용하는 것이죠. 해당 라이브러리를 이용하면 지난번에 Newtonsoft.Json 라이브러리를 이용한 것처럼 손쉽게 데이터 클래스를 Xml 문자열로 변환할 수 있습니다.

반대로 클래스의 형태를 알고 있다면 다시 데이터로 변환하기도 아주 쉽습니다. 바로 알아봅시다.

글에서 사용한 데이터 클래스는 아래와 같이 구성되어 있습니다.

using System;    
[Serializable]
public class TestClass002_01
{
    public int Id;
    public int Value;
    public bool Boolean;
    public CustomClass002_01[] CustomData;
}
[Serializable]
public class CustomClass002_01
{
    public int Code;
    public int Value;
}

C# Xml로 데이터 직렬화 하는 방법

Xml로 데이터를 변환하기 위해서는 System.Xml.Serialization 라이브러리를 불러온 뒤 XmlSerializer을 변환할 데이터 타입으로 생성해줘야 합니다.

using System.IO;
using System.Xml.Serialization;
using UnityEngine;
public class XmlTest : MonoBehaviour
{
    public string Path;//저장 경로
    public TestClass002_01 Data;//데이터 변경을 위한 변수

    public void ExportXmlData()
    {
        XmlSerializer serializer = new XmlSerializer(typeof(TestClass002_01));//TestClass002_01 데이터 타입으로 생성
        FileStream fileStream = new FileStream(Path + "/" + "data.xml", FileMode.Create);//생성한 데이터를 기록할 파일 생성
        serializer.Serialize(fileStream, Data);//데이터 변환 후 파일 스트림을 이용해 출력
        fileStream.Close();
        Debug.Log("File exported.");
    }
}

위처럼 typeof(변환한 클래스)를 생성자에 넣어 XmlSerializer을 생성하고 파일 스트림을 생성한 뒤 Serialize 함수를 이용해 데이터 변환 및 출력을 해주시면 됩니다. 데이터 출력이 완료되면 이번 포스팅 초반에 보여드렸던 Xml 파일이 출력되게 됩니다.

C# Xml로 데이터 역직렬화 하는 방법

마찬가지로 Xml을 데이터로 변환하기 위해서 System.Xml.Serialization 라이브러리를 불러온 뒤 XmlSerializer을 변환할 데이터 타입으로 생성해줘야 합니다.

using System.IO;
using System.Xml.Serialization;
using UnityEngine;
public class XmlTest : MonoBehaviour
{
    public TextAsset XmlFile;
    public TestClass002_01 Data;
    public void ImportXmlData()
    {
        StringReader reader = new StringReader(XmlFile.text);//스트림 리터를 통해 텍스트 불러오기
        XmlSerializer serializer = new XmlSerializer(typeof(TestClass002_01));//TestClass002_01 데이터 타입으로 생성
        Data = serializer.Deserialize(reader) as TestClass002_01;//데이터 변환 후 Data 변수에 기입
    }
}

StringReader을 이용해 문자열을 불러오고 Deserialize 함수를 이용하면 손쉽게 데이터를 변환할 수 있습니다.

유니티 c# xml 입출력 구현

마치면서

유니티에서 버튼을 이용해 해당 함수들을 실행시켜 데이터 입출력 테스트를 해볼 수 있도록 구현하였습니다.

위 결과물들은 아래 튜토리얼 포스팅의 깃허브에서 확인하실 수 있습니다.

유니티 프로그래밍 정보 총정리[유니티 튜토리얼] – PostiveGround

해당 라이브러리에 대한 자세한 정보는 아래 공식 문서에서 더 찾아보실 수 있습니다.

XML Serialization 예제 | Microsoft Docs

위로 스크롤