오늘은 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 입출력 구현](http://postiveground.com/wp-content/uploads/2022/08/image-1-1024x525.png)
마치면서
유니티에서 버튼을 이용해 해당 함수들을 실행시켜 데이터 입출력 테스트를 해볼 수 있도록 구현하였습니다.
위 결과물들은 아래 튜토리얼 포스팅의 깃허브에서 확인하실 수 있습니다.
유니티 프로그래밍 정보 총정리[유니티 튜토리얼] – PostiveGround
해당 라이브러리에 대한 자세한 정보는 아래 공식 문서에서 더 찾아보실 수 있습니다.