ToolDeck

YAML เป็น XML

แปลง YAML เป็นรูปแบบ XML

ลองตัวอย่าง

อินพุต YAML

เอาต์พุต XML

ประมวลผลในเครื่อง · ปลอดภัยในการวางข้อมูลลับ
XML จะแสดงที่นี่…
ลองดูด้วย:YAML เป็น JSON

การแปลง 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 ที่จัดรูปแบบแล้วทันที ไม่ต้องเขียน script หรือติดตั้ง CLI tool สำหรับการแปลงครั้งเดียว
🔒
ประมวลผลโดยให้ความเป็นส่วนตัวก่อน
การแปลงทั้งหมดทำงานในเบราว์เซอร์ของคุณ ข้อมูล YAML ของคุณซึ่งมักมี server address, credential และรายละเอียดโครงสร้างพื้นฐาน จะไม่ถูกส่งออกจากเครื่องของคุณ
📋
ไม่ต้องสมัครบัญชี
ใช้ตัวแปลงได้โดยไม่ต้องสมัครสมาชิก ล็อกอิน หรือให้อีเมล เปิดหน้าและเริ่มแปลงได้เลย
🌐
รองรับโครงสร้างซ้อนกัน
รองรับ YAML mapping ที่ซ้อนกันลึก, sequence, ประเภทผสม และ string หลายบรรทัด ผลลัพธ์จะคงลำดับชั้นไว้ด้วยการย่อหน้า XML ที่ถูกต้อง

กรณีการใช้งานการแปลง YAML เป็น XML

การพัฒนา frontend
แปลงข้อมูล YAML จำลองเป็นรูปแบบ XML สำหรับทดสอบ XML parser, XSLT transformation หรือ component ที่รับ XML response จาก API
การผสานรวม backend
แปลงการกำหนดค่า YAML เป็น XML เมื่อผสานรวมกับ Java service รุ่นเก่าที่ใช้ Spring XML config, Maven POM file หรือ SOAP endpoint
DevOps และ CI/CD
แปลง Kubernetes หรือ Ansible YAML manifest เป็น XML สำหรับเครื่องมือที่ต้องการ XML เป็นอินพุต เช่น การกำหนดค่า Jenkins pipeline หรือระบบ monitoring บางอย่าง
QA และการทดสอบ
สร้าง XML test fixture จากนิยาม YAML YAML ดูแลรักษาได้ง่ายกว่าในฐานะข้อมูลทดสอบ และการแปลงเป็น XML ตอนทดสอบทำให้ fixture อ่านได้ง่าย
วิศวกรรมข้อมูล
แปลงการกำหนดค่า ETL หรือนิยาม schema แบบ YAML เป็น XML สำหรับ pipeline ที่ใช้ XML พบได้บ่อยในงานด้านสาธารณสุข (HL7), การเงิน (FpML) และระบบข้อมูลภาครัฐ
การเรียนรู้และสร้างต้นแบบ
นักศึกษาและผู้เริ่มต้นสามารถวาง 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 mappinguser:\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>
Nullvalue: null<value/>
Multiline stringbio: |\n Line one\n Line two<bio>Line one\nLine two</bio>

YAML กับ XML: ความแตกต่างของรูปแบบ

YAML และ XML แก้ปัญหาเดียวกัน — การแสดงข้อมูลแบบมีโครงสร้าง — ด้วยข้อดีข้อเสียที่แตกต่างกัน ไม่มีรูปแบบใดดีกว่าอีกแบบโดยสมบูรณ์ การเลือกขึ้นอยู่กับว่าใครหรืออะไรเป็นผู้ใช้ข้อมูล

YAML
ใช้ whitespace เป็นตัวแบ่ง ไม่มีแท็กปิด รองรับประเภทพื้นฐาน (bool, int, float, null) Comment ใช้ # กระชับสำหรับการกำหนดค่าและแก้ไขด้วยมือ Parse โดย library อย่าง PyYAML, js-yaml และ gopkg.in/yaml
XML
ใช้แท็กพร้อมคู่เปิด/ปิดชัดเจน ค่าทั้งหมดเป็นข้อความโดยค่าเริ่มต้น ประเภทต้องการ schema (XSD) รองรับ attribute, namespace, mixed content และ processing instruction Parse ได้โดย standard library ของทุกภาษาหลัก
คุณสมบัติYAMLXML
Syntaxใช้การย่อหน้าใช้แท็ก (&lt;tag&gt;...&lt;/tag&gt;)
ประเภทข้อมูลพื้นฐาน (string, int, bool, null, float)ข้อความเท่านั้น (schema เพิ่มประเภท)
Comment# inline comments<!-- block comments -->
Attributeไม่รองรับโดยธรรมชาติรองรับ (&lt;tag attr="val"&gt;)
Namespaceไม่รองรับรองรับ (xmlns:prefix)
ขนาดไฟล์เล็กกว่า (ไม่มีแท็กปิด)ใหญ่กว่า (แท็กละเอียด)

ตัวอย่างโค้ด

วิธีแปลง YAML เป็น XML โดยใช้โปรแกรมในภาษาและสภาพแวดล้อมต่าง ๆ:

JavaScript (Node.js)
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>
Python
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>
Go
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>
}
CLI (yq + xq)
# 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>

คำถามที่พบบ่อย

YAML sequence สามารถแสดงใน XML ได้อย่างไร?
ได้ แต่ XML ไม่มีประเภท list โดยธรรมชาติ YAML sequence มักถูกแปลงเป็น XML element ที่ซ้ำกันโดยใช้ชื่อแท็กเดียวกัน ตัวอย่างเช่น YAML list ภายใต้ key "items" จะกลายเป็น child element &lt;item&gt; หลายรายการ ตัวแปลงบางตัวจะห่อด้วย element &lt;items&gt; parent เพื่อความชัดเจน
จะเกิดอะไรขึ้นกับ YAML comment ระหว่างการแปลง?
YAML comment (บรรทัดที่ขึ้นต้นด้วย #) จะถูกละทิ้งระหว่างการแปลง YAML parser ส่วนใหญ่จะตัด comment ออกเมื่อสร้างโครงสร้างข้อมูล จึงไม่มีให้ใช้ในผลลัพธ์ XML หากต้องการเก็บ comment คุณจะต้องใช้ YAML parser ที่รักษา comment ไว้ เช่น ruamel.yaml ใน Python
YAML anchor และ alias จัดการอย่างไร?
YAML anchor (&name) และ alias (*name) จะถูก resolve ก่อนการแปลง Parser จะขยาย alias เป็นค่าเต็ม ดังนั้น XML ที่ได้จะมีข้อมูลครบถ้วนโดยไม่มีการอ้างอิง anchor ซึ่งหมายความว่าผลลัพธ์ XML อาจมีขนาดใหญ่กว่า YAML อินพุตหาก anchor ถูกใช้เพื่อหลีกเลี่ยงการซ้ำ
การแปลงสามารถย้อนกลับได้ (XML กลับเป็น YAML) หรือไม่?
ได้บางส่วน คุณสามารถแปลง XML เป็น YAML ได้ แต่ผลลัพธ์อาจไม่ตรงกับ YAML เดิมทุกประการ XML attribute ไม่มีสิ่งเทียบเท่าใน YAML และมักถูกแสดงเป็น key พิเศษ (เช่น @attribute) ข้อมูลประเภทก็หายไปด้วย เนื่องจาก XML ถือว่าทุกอย่างเป็นข้อความ ดังนั้นตัวเลขและ boolean ใน YAML เดิมจะกลายเป็น string หลังการแปลงกลับ
จะจัดการ XML attribute เมื่อแปลงจาก YAML ได้อย่างไร?
YAML ไม่มีแนวคิดของ attribute โดยธรรมชาติ Convention ที่พบบ่อยคือการเพิ่มคำนำหน้า @ ให้ key เพื่อระบุว่าควรกลายเป็น XML attribute แทนที่จะเป็น child element ตัวอย่างเช่น "@id: 42" ภายใต้ mapping จะสร้าง &lt;element id="42"&gt; Convention นี้ใช้โดย library อย่าง xml-js และ xmltodict
ขนาดไฟล์ YAML สูงสุดที่เครื่องมือนี้รองรับคือเท่าไร?
ตัวแปลงทำงานในเบราว์เซอร์ของคุณ ดังนั้นขีดจำกัดขึ้นอยู่กับหน่วยความจำที่มีในอุปกรณ์ของคุณ ไฟล์ขนาดไม่กี่ megabyte สามารถแปลงได้โดยไม่มีปัญหาบนฮาร์ดแวร์สมัยใหม่ สำหรับไฟล์ขนาดใหญ่มาก (50 MB ขึ้นไป) ควรใช้ command-line tool อย่าง yq หรือ Python script ที่ใช้ PyYAML และ lxml ซึ่งจัดการ streaming และหน่วยความจำได้มีประสิทธิภาพมากกว่า
ทำไม YAML ของฉันถึงสร้างผลลัพธ์ XML ที่ไม่ถูกต้อง?
สาเหตุที่พบบ่อยที่สุดคือ YAML key ที่ไม่ใช่ชื่อ XML element ที่ถูกต้อง ชื่อ XML element ไม่สามารถขึ้นต้นด้วยตัวเลข มีช่องว่าง หรือใช้อักขระพิเศษส่วนใหญ่ได้ Key อย่าง "2nd-item" หรือ "my key" จะสร้าง XML ที่ไม่ถูกต้อง ให้เปลี่ยนชื่อ key ที่มีปัญหา หรือใช้ตัวแปลงที่ sanitize ชื่อโดยอัตโนมัติ (เช่น แทนที่ช่องว่างด้วย underscore และเพิ่ม underscore นำหน้าชื่อที่ขึ้นต้นด้วยตัวเลข)

เครื่องมือที่เกี่ยวข้อง