YAML เป็น XML
แปลง YAML เป็นรูปแบบ XML
อินพุต YAML
เอาต์พุต XML
การแปลง YAML เป็น XML คืออะไร?
การแปลง YAML เป็น XML คือกระบวนการเปลี่ยนข้อมูลที่เขียนในรูปแบบ YAML (YAML Ain't Markup Language) ให้เป็น XML (Extensible Markup Language) YAML ใช้การย่อหน้าและเครื่องหมายวรรคตอนขั้นต่ำในการแสดงข้อมูลแบบมีโครงสร้าง ในขณะที่ XML ใช้แท็กเปิดและปิดพร้อมลำดับชั้นที่ชัดเจน การแปลงระหว่างสองรูปแบบนี้เป็นงานปกติเมื่อระบบที่ใช้ XML จำเป็นต้องรับข้อมูลที่เขียนใน YAML
YAML ถูกออกแบบมาเพื่อความสะดวกในการอ่านโดยมนุษย์ ไฟล์กำหนดค่าสำหรับเครื่องมืออย่าง Kubernetes, Ansible, Docker Compose และ GitHub Actions เขียนใน YAML เพราะกระชับและแก้ไขด้วยมือได้ง่าย XML ที่กำหนดโดย W3C XML 1.0 specification เป็นรูปแบบแลกเปลี่ยนข้อมูลมาตรฐานในระบบองค์กร, SOAP web service และ workflow ที่เน้นเอกสารมาหลายทศวรรษ เมื่อการกำหนดค่าที่เขียนใน YAML ต้องส่งข้อมูลเข้า pipeline ที่ใช้ XML การแปลงจึงเป็นสิ่งจำเป็น
การแมประหว่าง YAML และ XML ไม่ใช่แบบหนึ่งต่อหนึ่ง YAML รองรับประเภทข้อมูลอย่าง boolean, integer, float และ null โดยธรรมชาติ ในขณะที่ XML ถือว่าเนื้อหาทั้งหมดเป็นข้อความ เว้นแต่ schema (XSD หรือ DTD) จะกำหนดประเภทไว้ภายนอก YAML sequence (รายการ) ไม่มีสิ่งเทียบเท่าโดยตรงใน XML และต้องแสดงด้วย element ที่ซ้ำกัน การเข้าใจความแตกต่างเหล่านี้ช่วยให้คุณคาดเดาผลลัพธ์และหลีกเลี่ยงปัญหาที่ไม่คาดคิด
ทำไมต้องใช้ตัวแปลง YAML เป็น XML นี้?
การเขียน YAML ใหม่เป็น XML ด้วยตนเองนั้นน่าเบื่อและเกิดข้อผิดพลาดได้ง่าย โดยเฉพาะกับโครงสร้างที่ซ้อนกันลึก ตัวแปลงนี้จัดการการแปลงโครงสร้างได้ทันที
กรณีการใช้งานการแปลง YAML เป็น XML
ตารางอ้างอิงการแมปประเภทข้อมูล YAML เป็น 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 กับ XML: ความแตกต่างของรูปแบบ
YAML และ XML แก้ปัญหาเดียวกัน — การแสดงข้อมูลแบบมีโครงสร้าง — ด้วยข้อดีข้อเสียที่แตกต่างกัน ไม่มีรูปแบบใดดีกว่าอีกแบบโดยสมบูรณ์ การเลือกขึ้นอยู่กับว่าใครหรืออะไรเป็นผู้ใช้ข้อมูล
| คุณสมบัติ | YAML | XML |
|---|---|---|
| Syntax | ใช้การย่อหน้า | ใช้แท็ก (<tag>...</tag>) |
| ประเภทข้อมูล | พื้นฐาน (string, int, bool, null, float) | ข้อความเท่านั้น (schema เพิ่มประเภท) |
| Comment | # inline comments | <!-- block comments --> |
| Attribute | ไม่รองรับโดยธรรมชาติ | รองรับ (<tag attr="val">) |
| Namespace | ไม่รองรับ | รองรับ (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>