본문 바로가기

CS

[CS 지식의 정석 - 필기 노트] XML

XML (Extensible Markup Language)

마크업 형태를 쓰는 데이터 교환 형식

 

마크업 형태

마크업 태그 등을 이용하여 문서나 데이터 구조를 나타내는 방법

  • 속성 부여도 가능

 

구성

  1. 프롤로그 : 버전, 인코딩
  2. 루트요소 : 단 하나만 존재
  3. 하위 요소들
<?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