YAML to XML
YAML을 XML 형식으로 변환
YAML 입력
XML 출력
YAML to XML 변환이란?
YAML to XML 변환은 YAML(YAML Ain't Markup Language)로 작성된 데이터를 XML(Extensible Markup Language)로 변환하는 작업입니다. YAML은 들여쓰기와 최소한의 구두점으로 구조화된 데이터를 표현하는 반면, XML은 명시적인 계층 구조를 가진 시작 태그와 끝 태그를 사용합니다. XML을 소비하는 시스템이 원래 YAML로 작성된 데이터를 받아야 할 때 두 형식 간 변환이 필요합니다.
YAML은 사람이 읽기 쉽도록 설계되었습니다. Kubernetes, Ansible, Docker Compose, GitHub Actions 같은 도구의 설정 파일은 간결하고 손으로 편집하기 쉬워 YAML로 작성됩니다. W3C XML 1.0 명세로 정의된 XML은 수십 년간 엔터프라이즈 시스템, SOAP 웹 서비스, 문서 중심 워크플로에서 기본 데이터 교환 형식으로 사용되어 왔습니다. YAML로 작성된 설정이 XML 기반 파이프라인에 공급되어야 할 때 변환이 필요합니다.
YAML과 XML 사이의 매핑은 일대일이 아닙니다. YAML은 불리언, 정수, 부동소수점, null 같은 데이터 타입을 기본으로 지원하는 반면, XML은 스키마(XSD 또는 DTD)가 외부에서 타입을 정의하지 않는 한 모든 내용을 텍스트로 처리합니다. YAML 시퀀스(목록)는 XML에 직접 대응하는 표현이 없어 반복되는 요소로 표현해야 합니다. 이러한 차이를 이해하면 출력을 예측하고 예상치 못한 결과를 피하는 데 도움이 됩니다.
이 YAML to XML 변환기를 사용하는 이유
YAML을 XML로 수동으로 다시 작성하는 것은 특히 깊이 중첩된 구조에서 번거롭고 오류가 발생하기 쉽습니다. 이 변환기는 구조적 변환을 즉시 처리합니다.
YAML to XML 활용 사례
YAML to XML 타입 매핑 참조
YAML 데이터 타입은 XML에 직접 매핑되지 않습니다. 아래 표는 각 YAML 구성 요소가 XML 동등값으로 어떻게 변환되는지 보여줍니다. 이 규칙을 이해하면 출력을 예측하고 예상치 못한 결과를 해결하는 데 도움이 됩니다.
| YAML 타입 | YAML 예시 | XML 출력 |
|---|---|---|
| Mapping (key: value) | { name: Alice } | <name>Alice</name> |
| Sequence (- item) | - apple\n- banana | <item>apple</item><item>banana</item> |
| Nested mapping | user:\n name: Alice | <user><name>Alice</name></user> |
| Scalar (string) | greeting: hello world | <greeting>hello world</greeting> |
| Scalar (number) | count: 42 | <count>42</count> |
| Scalar (boolean) | active: true | <active>true</active> |
| Null | value: null | <value/> |
| Multiline string | bio: |\n Line one\n Line two | <bio>Line one\nLine two</bio> |
YAML vs XML: 형식 차이점
YAML과 XML은 구조화된 데이터 표현이라는 동일한 문제를 서로 다른 방식으로 해결합니다. 어느 쪽이 무조건 더 낫다고 할 수 없으며, 데이터를 소비하는 대상에 따라 적합한 형식이 결정됩니다.
| 특징 | YAML | XML |
|---|---|---|
| 문법 | 들여쓰기 기반 | 태그 기반 (<tag>...</tag>) |
| 데이터 타입 | 기본 타입 (문자열, 정수, 불리언, null, 부동소수점) | 텍스트만 (스키마로 타입 추가) |
| 주석 | # 인라인 주석 | <!-- 블록 주석 --> |
| 속성 | 기본 지원 없음 | 지원 (<tag attr="val">) |
| 네임스페이스 | 지원 안 됨 | 지원 (xmlns:prefix) |
| 파일 크기 | 더 작음 (닫는 태그 없음) | 더 큼 (상세한 태그) |
코드 예제
다양한 언어와 환경에서 YAML을 XML로 프로그래밍 방식으로 변환하는 방법입니다:
import { parseDocument } from 'yaml'
import { js2xml } from 'xml-js'
const yamlStr = `
server:
host: localhost
port: 8080
ssl: true
`
const data = parseDocument(yamlStr).toJSON()
const xml = js2xml({ root: data }, { compact: true, spaces: 2 })
console.log(xml)
// → <root>
// → <server>
// → <host>localhost</host>
// → <port>8080</port>
// → <ssl>true</ssl>
// → </server>
// → </root>import yaml
import xml.etree.ElementTree as ET
yaml_str = """
database:
host: db.example.com
port: 5432
credentials:
user: admin
password: secret
"""
data = yaml.safe_load(yaml_str)
def dict_to_xml(tag, d):
elem = ET.Element(tag)
for key, val in d.items():
child = ET.SubElement(elem, key)
if isinstance(val, dict):
child.extend(dict_to_xml(key, val))
elem.remove(child)
elem.append(dict_to_xml(key, val))
else:
child.text = str(val)
return elem
root = dict_to_xml('root', data)
ET.indent(root, space=' ')
print(ET.tostring(root, encoding='unicode'))
# → <root>
# → <database>
# → <host>db.example.com</host>
# → <port>5432</port>
# → ...
# → </database>
# → </root>package main
import (
"encoding/xml"
"fmt"
"gopkg.in/yaml.v3"
)
type Server struct {
XMLName xml.Name `xml:"server"`
Host string `yaml:"host" xml:"host"`
Port int `yaml:"port" xml:"port"`
SSL bool `yaml:"ssl" xml:"ssl"`
}
func main() {
yamlData := []byte("host: localhost\nport: 8080\nssl: true")
var s Server
yaml.Unmarshal(yamlData, &s)
xmlBytes, _ := xml.MarshalIndent(s, "", " ")
fmt.Println(xml.Header + string(xmlBytes))
// → <?xml version="1.0" encoding="UTF-8"?>
// → <server>
// → <host>localhost</host>
// → <port>8080</port>
// → <ssl>true</ssl>
// → </server>
}# Using yq (YAML processor) with xq (XML wrapper around jq) # Install: pip install yq # Convert YAML file to XML yq -x . config.yaml # → <host>localhost</host><port>8080</port> # Pipe inline YAML through conversion echo "name: Alice" | yq -x . # → <name>Alice</name>