XML (Extensible Markup Language)
마크업 형태를 쓰는 데이터 교환 형식
마크업 형태
마크업 태그 등을 이용하여 문서나 데이터 구조를 나타내는 방법
- 속성 부여도 가능
구성
- 프롤로그 : 버전, 인코딩
- 루트요소 : 단 하나만 존재
- 하위 요소들
<?xml version="1.0" encoding="UTF-8"?> // 프롤로그 버전, 인코딩
<OSTLIST> // 루트 요소
<OST> // 하위 요소
<name>마녀 배달부 키키</name> <song>따스함에 둘러쌓인다면</song>
</OST>
<OST>
<name>하울의 움직이는 성</name> <song>세계의 약속</song>
</OST>
</OSTLIST>
HTML과 XML 차이
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,
initial-scale=1.0">
<title>Document</title>
</head>
<body>
<p></p>
<div></div>
</body>
</html>
| HTML | XML | |
| 용도 | 데이터를 표시 | 데이터를 저장 및 전송 |
| 태그 | 미리 정의된 태그 사용 | 커스텀 하게 사용자가 고유한 태그를 만들고 정의 가능 |
| 대소문자 구분 | 구분하지 않음 | 구분하기 때문에 대소문자가 다르면 XML 구문 분석기 오류 발생 가능 |
JSON과 XML 차이
- 닫힌 태그가 계속해서 들어가는 XML이 상대적으로 더 무거움
- Object 변환 시 JSON보다 더 많은 노력이 필요
- XML은 XSD 파일로 JSON보다 훨씬 강력한 데이터 유효성 검사 기능을 기본적으로 제공하고, JSON은 개발자의 몫
Unity에서 XML 직렬화 / 역직렬화
1. 내장 라이브러리 사용
using UnityEngine;
using System.IO;
using System.Xml;
using System.Text;
using System.Text.Json;
// Unity 외부 라이브러리 없이 XML 직렬화 / 역직렬화 예시
public class XmlToJsonExample : MonoBehaviour
{
void Start()
{
string path = Path.Combine(Application.streamingAssetsPath, "a.xml");
// 1. XML 파일 읽기
string xmlText = File.ReadAllText(path);
// 2. XML → XmlDocument
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlText);
// 3. XML → JSON
string json = ConvertXmlToJson(xmlDoc);
Debug.Log(json);
}
string ConvertXmlToJson(XmlDocument xmlDoc)
{
using var stream = new MemoryStream();
using var writer = new Utf8JsonWriter(stream, new JsonWriterOptions { Indented = true });
writer.WriteStartObject();
WriteNode(writer, xmlDoc.DocumentElement);
writer.WriteEndObject();
writer.Flush();
return Encoding.UTF8.GetString(stream.ToArray());
}
void WriteNode(Utf8JsonWriter writer, XmlNode node)
{
writer.WritePropertyName(node.Name);
if (node.HasChildNodes && node.ChildNodes.Count > 1)
{
writer.WriteStartObject();
foreach (XmlNode child in node.ChildNodes)
{
WriteNode(writer, child);
}
writer.WriteEndObject();
}
else
{
writer.WriteStringValue(node.InnerText);
}
}
}
2. Newtonsoft.Json
using UnityEngine;
using System.IO;
using System.Xml;
using Newtonsoft.Json;
// Newtonsoft.Json 을 사용하는 방법 (실무에서 더 많이 사용)
public class XmlToJsonNewtonsoft : MonoBehaviour
{
void Start()
{
string path = Path.Combine(Application.streamingAssetsPath, "a.xml");
string xml = File.ReadAllText(path);
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string json = JsonConvert.SerializeXmlNode(doc, Formatting.Indented);
Debug.Log(json);
}
}
XML의 타입을 지정하는 .XSD 파일 예제
// .XSD
<?xml version="1.0" encoding="utf-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="쪽지">
<complexType>
<sequence>
<element name="수신" type="string"/>
<element name="발신" type="string"/>
<element name="제목" type="string"/>
<element name="내용" type="string"/>
</sequence>
</complexType>
</element>
</schema>
// .XML
<?xml version="1.0" encoding="utf-8" ?>
<쪽지 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="noti.xsd">
<수신>김상민</수신>
<발신>황현숙</발신>
<제목>출장 스케쥴</제목>
<내용>이번 주말 출장 잊지마세요.</내용>
</쪽지>
XML 활용
sitemap.xml로 보통 쓰임
sitemap.xml 이란?
- 서비스에 여러 페이지가 있고, 이를 구글에 검색했을 때에 1, 2, 3 페이지가 나타나도록 하고 싶다면, SEO(Search Engine Optimization)을 사용
- 구글이라는 회사의 데이터베이스에 서비스의 페이지들이 토큰화 되어 저장되어 있음
- 이를 통해 검색 시 페이지를 노출
- 종속되어 있는 페이지는 보통 크롤링 봇을 통해 상대적으로 잘 저장됨
- 종속되지 않은 '장바구니'와 같은 페이지는 저장하지 않을 수도 있음
그렇기 때문에 sitemap.xml이라는 파일을 제출하여 페이지를 구글의 크롤링 봇이 잘 저장할 수 있도록 도와줌
'CS' 카테고리의 다른 글
| [CS 지식의 정석 - 필기 노트] JSON과 직렬화 / 역직렬화 (0) | 2025.12.15 |
|---|