XML to YAML 변환기
XML을 YAML 형식으로 변환
XML 입력
YAML 출력
XML to YAML 변환이란?
XML to YAML 변환은 확장 가능한 마크업 언어(XML)의 데이터를 YAML Ain't Markup Language(YAML)로 변환하는 과정입니다. XML은 꺾쇠 괄호 태그와 속성을 사용하여 계층적 데이터를 표현하는 반면, YAML은 들여쓰기와 일반 텍스트 키-값 쌍으로 동일한 구조를 나타냅니다. XML을 YAML로 온라인 변환하는 것은 Java Spring, Maven, .NET과 같은 XML 기반 시스템에서 Kubernetes, Ansible, GitHub Actions, Docker Compose처럼 YAML을 선호하는 플랫폼으로 설정을 마이그레이션할 때 자주 사용되는 작업입니다.
두 형식은 데이터 모델에서 차이가 있습니다. XML은 기본적으로 모든 것을 텍스트로 처리하며 타입 적용을 위해 스키마 정의(XSD, DTD)에 의존합니다. YAML은 문자열, 정수, 부동소수점, 불리언, null, 시퀀스(배열), 매핑(객체)과 같은 기본 타입을 지원합니다. 변환 과정에서 "true", "5432", "3.14" 같은 값이 문자열로 유지되는 대신 YAML 기본 타입으로 해석될 수 있습니다. 신중한 변환기는 XML 소스의 원래 텍스트 표현을 보존하기 위해 이러한 값을 따옴표로 감쌉니다.
XML에는 YAML에 직접 대응하는 것이 없는 구성 요소도 있습니다: 속성, 네임스페이스, 처리 지시문, CDATA 섹션, 주석이 그것입니다. 변환 시 속성을 어떻게 표현할지(일반적으로 _attr처럼 밑줄 접두사 키 사용) 결정하고, 나머지를 버릴지 평탄화할지 선택해야 합니다. 변환 전에 이러한 절충점을 이해하면 올바른 도구를 선택하고, 적절히 설정하며, YAML 출력이 원래 XML 의도와 일치하는지 확인하는 데 도움이 됩니다.
<server>
<host>db.example.com</host>
<port>5432</port>
<credentials admin="true">
<username>deploy</username>
<password>s3cret</password>
</credentials>
<options>
<option>ssl=true</option>
<option>timeout=30</option>
</options>
</server>server:
host: db.example.com
port: "5432"
credentials:
_admin: "true"
username: deploy
password: s3cret
options:
option:
- ssl=true
- timeout=30온라인 XML to YAML 변환기를 사용하는 이유
변환 스크립트를 직접 작성하면 속성 매핑, 반복 요소 배열 감지, YAML 타입 강제 변환 예외 처리를 모두 다뤄야 합니다. 브라우저 기반 변환기는 이 모든 것을 한 번에 처리하여 YAML 출력을 바로 확인하고 설정 파일에 복사할 수 있게 해줍니다.
XML to YAML 활용 사례
XML to YAML 매핑 참조
XML과 YAML은 서로 다른 데이터 모델을 가집니다. 아래 표는 각 XML 구성 요소가 YAML 동등값으로 어떻게 매핑되는지 보여줍니다. 속성은 일반적으로 밑줄 접두사 키로 변환되고, 반복 요소는 YAML 시퀀스가 됩니다. 주석, 처리 지시문 같은 일부 구성 요소는 YAML에 대응하는 표현이 없어 변환 시 폐기됩니다.
| XML 구성 요소 | XML 예시 | YAML 동등값 |
|---|---|---|
| Element | <name>text</name> | name: text |
| Nested elements | <a><b>1</b></a> | a:\n b: "1" |
| Attributes | <el attr="v"/> | el:\n _attr: v |
| Text + attributes | <el a="1">text</el> | el:\n _a: "1"\n _text: text |
| Repeated elements | <r><i>1</i><i>2</i></r> | r:\n i:\n - "1"\n - "2" |
| Empty element | <el/> | el: "" |
| CDATA | <![CDATA[raw]]> | Treated as plain text |
| Comments | <!-- note --> | Discarded (no YAML equivalent) |
| Namespaces | xmlns:ns="uri" | Prefix preserved or stripped |
| Boolean-like text | <flag>true</flag> | flag: "true" (quoted to stay string) |
XML vs YAML: 데이터 모델 차이점
XML과 YAML 간 변환은 단순한 문법 교환이 아닙니다. 두 형식은 변환 후 데이터 표현 방식에 영향을 미치는 근본적인 구조적 차이가 있습니다.
코드 예제
아래는 JavaScript, Python, Go, 명령줄에서 XML을 YAML로 변환하는 실제 예제입니다. 각 예제는 중첩 요소, 속성, 반복되는 형제 태그를 처리합니다.
import { parseStringPromise } from 'xml2js'
import YAML from 'yaml'
const xml = `
<config>
<database host="localhost" port="5432">
<name>mydb</name>
</database>
<features>
<feature>auth</feature>
<feature>logging</feature>
</features>
</config>`
const obj = await parseStringPromise(xml, { explicitArray: false })
console.log(YAML.stringify(obj))
// → config:
// → database:
// → $:
// → host: localhost
// → port: "5432"
// → name: mydb
// → features:
// → feature:
// → - auth
// → - loggingimport xmltodict
import yaml
xml = """
<server>
<host>db.example.com</host>
<port>5432</port>
<replicas>
<replica>node-1</replica>
<replica>node-2</replica>
</replicas>
</server>
"""
# Step 1: XML → Python dict
data = xmltodict.parse(xml)
# Step 2: Python dict → YAML
print(yaml.dump(data, default_flow_style=False))
# → server:
# → host: db.example.com
# → port: '5432'
# → replicas:
# → replica:
# → - node-1
# → - node-2
# With the standard library only (no xmltodict)
import xml.etree.ElementTree as ET
def elem_to_dict(elem):
d = {}
if elem.attrib:
d.update({f"_{k}": v for k, v in elem.attrib.items()})
for child in elem:
val = elem_to_dict(child)
if child.tag in d:
if not isinstance(d[child.tag], list):
d[child.tag] = [d[child.tag]]
d[child.tag].append(val)
else:
d[child.tag] = val
if elem.text and elem.text.strip():
text = elem.text.strip()
return text if not d else {**d, "_text": text}
return d
root = ET.fromstring(xml)
print(yaml.dump({root.tag: elem_to_dict(root)}, default_flow_style=False))# xq is part of the yq package (pip install yq) # It parses XML via xq and outputs JSON, then pipe to yq for YAML echo '<config><host>localhost</host><port>8080</port></config>' | xq . | yq -y . # → config: # → host: localhost # → port: "8080" # Using xmlstarlet + yq (Go version: https://github.com/mikefarah/yq) xmlstarlet sel -t -c '/' input.xml | yq -p=xml -o=yaml # Reads XML from file and outputs YAML directly
package main
import (
"encoding/xml"
"fmt"
"strings"
"gopkg.in/yaml.v3"
)
type Server struct {
XMLName xml.Name `xml:"server"`
Host string `xml:"host" yaml:"host"`
Port int `xml:"port" yaml:"port"`
Options []string `xml:"options>option" yaml:"options"`
}
func main() {
data := `<server>
<host>db.example.com</host>
<port>5432</port>
<options><option>ssl=true</option><option>timeout=30</option></options>
</server>`
var srv Server
xml.NewDecoder(strings.NewReader(data)).Decode(&srv)
out, _ := yaml.Marshal(srv)
fmt.Println(string(out))
// → host: db.example.com
// → port: 5432
// → options:
// → - ssl=true
// → - timeout=30
}