C# 개발에서 XML과 JSON은 가장 널리 사용되는 데이터 형식입니다. 다행히 Json.NET(Newtonsoft.Json) 라이브러리는 XmlNodeConverter를 통해 두 형식 간의 변환을 손쉽게 지원합니다.
변환 과정에서 요소(Element), 속성(Attribute), 텍스트, 주석(Comment), 문자 데이터(CDATA), 처리 명령(Processing Instruction), 네임스페이스, 그리고 XML 선언부까지 모두 그대로 보존되므로, 기존 문서 구조를 잃지 않고 안전하게 변환할 수 있다는 점이 큰 장점입니다.
1. SerializeXmlNode — XML을 JSON으로 변환
JsonConvert 클래스는 XML과 JSON 사이를 변환하는 두 가지 헬퍼 메서드를 제공합니다. 첫 번째는 SerializeXmlNode()입니다. 이 메서드는 XmlNode 객체를 입력받아 JSON 텍스트로 직렬화합니다.
XML의 속성은 JSON에서 @ 접두사가 붙은 키로 표현됩니다.
2. DeserializeXmlNode — JSON을 XML로 변환
두 번째 메서드는 DeserializeXmlNode()입니다. 이 메서드는 반대로 JSON 텍스트를 입력받아 XmlNode 객체로 역직렬화합니다.
JSON에서 @version, ?xml처럼 특수 접두사가 붙은 키는 각각 XML 속성과 처리 명령(XML 선언)으로 매핑됩니다.
예제 1: XML → JSON 변환
static void Main(string[] args) {
string xml = @"<person id='1'><name>Alan</name><url>https://www.google1.com</url><role>Admin1</role></person>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string json = JsonConvert.SerializeXmlNode(doc);
Console.WriteLine(json);
Console.ReadLine();
}실행 결과
{"person":{"@id":"1","name":"Alan","url":"https://www.google1.com","role":"Admin1"}}위 결과에서 볼 수 있듯이, XML의 id 속성이 @id라는 JSON 키로 변환된 것을 확인할 수 있습니다.
예제 2: JSON → XML 변환
static void Main(string[] args) {
string json = @"{
'?xml': {
'@version': '1.0',
'@standalone': 'no'
},
'root': {
'person': [
{
'@id': '1',
'name': 'Alan',
'url': 'https://www.google1.com'
},
{
'@id': '2',
'name': 'Louis',
'url': 'https://www.yahoo1.com'
}
]
}
}";
XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(json);
Console.WriteLine(doc.OuterXml);
Console.ReadLine();
}입력 JSON 구조
'?xml': {
'@version': '1.0',
'@standalone': 'no'
},
'root': {
'person': [
{
'@id': '1',
'name': 'Alan',
'url': 'https://www.google1.com'
},
{
'@id': '2',
'name': 'Louis',
'url': 'https://www.yahoo1.com'
}
]
}JSON 내의 ?xml 키가 XML 선언부(<?xml version="1.0" standalone="no"?>)로 변환되며, 여러 개의 person 객체는 반복되는 XML 요소로 생성됩니다.
마무리 및 참고 사항
Json.NET의 XML-JSON 변환 기능을 활용하면 별도의 커스텀 파서를 작성할 필요 없이 몇 줄의 코드만으로 데이터 형식을 자유롭게 전환할 수 있습니다. 다만 다음 사항을 유의하세요.
- JSON을 XML로 변환할 때는 루트 요소가 하나여야 합니다. 필요하다면
DeserializeXmlNode(json, "root")처럼 루트 이름을 지정할 수 있습니다. @접두사는 속성,#text는 텍스트 노드,#cdata-section은 CDATA를 의미합니다.- NuGet에서
Newtonsoft.Json패키지를 설치한 후using Newtonsoft.Json;네임스페이스를 추가해야 사용할 수 있습니다.