ToolDeck

XML sang YAML

Chuyển đổi XML sang định dạng YAML

Thử ví dụ

Nhập XML

Xuất YAML

Chạy cục bộ · An toàn để dán thông tin bí mật
YAML sẽ xuất hiện tại đây…

Chuyển đổi XML sang YAML là gì?

Chuyển đổi XML sang YAML là quá trình biến đổi dữ liệu từ Extensible Markup Language (XML) sang YAML Ain't Markup Language (YAML). XML dùng thẻ dấu ngoặc nhọn kèm thuộc tính để mô tả dữ liệu phân cấp, trong khi YAML biểu diễn cùng cấu trúc đó thông qua thụt lề và cặp khóa-giá trị dạng văn bản thuần. Chuyển đổi XML sang YAML trực tuyến là tác vụ phổ biến khi di chuyển cấu hình từ các hệ thống nặng XML như Java Spring, Maven hoặc .NET sang các nền tảng ưu tiên YAML như Kubernetes, Ansible, GitHub Actions và Docker Compose.

Hai định dạng khác nhau ở mô hình dữ liệu. XML mặc định coi mọi thứ là văn bản và dựa vào định nghĩa schema (XSD, DTD) để ràng buộc kiểu. YAML có kiểu dữ liệu gốc: chuỗi, số nguyên, số thực, boolean, null, dãy (mảng) và ánh xạ (đối tượng). Khi chuyển đổi, các giá trị như "true", "5432" và "3.14" có thể được hiểu là kiểu gốc YAML thay vì giữ nguyên dạng chuỗi. Một công cụ chuyển đổi cẩn thận sẽ đặt dấu ngoặc kép cho các giá trị này để bảo toàn biểu diễn văn bản gốc từ XML.

XML cũng hỗ trợ các cấu trúc không có tương đương trong YAML: thuộc tính, không gian tên, chỉ thị xử lý, phần CDATA và chú thích. Quá trình chuyển đổi phải chọn quy ước biểu diễn thuộc tính (thường là khóa có tiền tố gạch dưới như _attr) và quyết định bỏ qua hay làm phẳng phần còn lại. Hiểu các đánh đổi này trước khi chuyển đổi giúp bạn chọn công cụ phù hợp, cấu hình đúng và xác minh rằng đầu ra YAML phản ánh đúng ý nghĩa của XML gốc.

XML input
<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>
YAML output
server:
  host: db.example.com
  port: "5432"
  credentials:
    _admin: "true"
    username: deploy
    password: s3cret
  options:
    option:
      - ssl=true
      - timeout=30

Tại sao sử dụng công cụ chuyển đổi XML sang YAML trực tuyến?

Tự viết script chuyển đổi đòi hỏi phải xử lý ánh xạ thuộc tính, phát hiện mảng cho các phần tử lặp lại và các trường hợp đặc biệt về ép kiểu YAML. Một công cụ chạy trên trình duyệt xử lý tất cả những điều đó chỉ trong một bước, cho phép bạn kiểm tra đầu ra YAML và sao chép trực tiếp vào các tệp cấu hình.

Chuyển đổi tức thì
Dán XML và nhận đầu ra YAML trong vài mili giây. Không cần cài đặt thư viện, không cần bước build, không cần bảo trì script.
🔒
Xử lý ưu tiên quyền riêng tư
Quá trình chuyển đổi chạy hoàn toàn trong trình duyệt bằng JavaScript. Dữ liệu XML của bạn được giữ nguyên trên máy và không bao giờ được gửi đến máy chủ.
🔀
Xử lý thuộc tính và mảng
Thuộc tính XML được ánh xạ sang khóa có tiền tố. Các phần tử anh em lặp lại được tự động gộp vào dãy YAML, bảo toàn cấu trúc danh sách.
📋
Không cần tài khoản
Mở trang, dán XML, sao chép kết quả YAML. Không đăng ký, không cần API key, không giới hạn tốc độ hay hạn mức sử dụng.

Các trường hợp sử dụng chuyển đổi XML sang YAML

Phát triển frontend
Chuyển đổi các đoạn cấu hình XML từ các công cụ build cũ (Ant, Maven) sang YAML cho các pipeline CI hiện đại như GitHub Actions hoặc GitLab CI vốn yêu cầu tệp cấu hình YAML.
Kỹ thuật backend
Di chuyển định nghĩa bean XML của Spring sang định dạng application.yml của Spring Boot, hoặc chuyển đổi các phần app.config của .NET sang YAML để triển khai trong container.
DevOps và hạ tầng
Chuyển đổi các bộ mô tả triển khai dựa trên XML (Tomcat server.xml, IIS web.config) sang tương đương YAML cho Kubernetes manifest, Helm chart hoặc Ansible playbook.
QA và kiểm thử
Chuyển đổi các fixture kiểm thử XML hoặc cấu hình JUnit sang YAML cho các framework kiểm thử hỗ trợ nguồn dữ liệu YAML, chẳng hạn như pytest với fixture YAML hoặc Robot Framework.
Kỹ thuật dữ liệu
Chuyển đổi các bản xuất dữ liệu XML từ hệ thống doanh nghiệp (SAP, Oracle) sang YAML để nạp vào các công cụ ETL như dbt hoặc Airflow vốn sử dụng cấu hình và schema dựa trên YAML.
Học và tài liệu hóa
Sinh viên và người viết kỹ thuật có thể dán mẫu XML để thấy cách các phần tử, thuộc tính và cấu trúc lồng nhau ánh xạ sang thụt lề, dãy và ánh xạ YAML.

Tham chiếu ánh xạ XML sang YAML

XML và YAML có mô hình dữ liệu khác nhau. Bảng dưới đây cho thấy cách mỗi cấu trúc XML ánh xạ sang tương đương YAML. Thuộc tính thường được chuyển sang khóa có tiền tố gạch dưới, và các phần tử lặp lại trở thành dãy YAML. Một số cấu trúc như chú thích và chỉ thị xử lý không có biểu diễn YAML và bị loại bỏ trong quá trình chuyển đổi.

Cấu trúc XMLVí dụ XMLTương đương 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)
Namespacesxmlns:ns="uri"Prefix preserved or stripped
Boolean-like text<flag>true</flag>flag: "true" (quoted to stay string)

XML vs YAML: Sự khác biệt mô hình dữ liệu

Chuyển đổi giữa XML và YAML không phải là thay thế cú pháp đơn giản. Hai định dạng có sự khác biệt cấu trúc cơ bản ảnh hưởng đến cách dữ liệu được biểu diễn sau khi chuyển đổi.

Hệ thống kiểu dữ liệu
XML lưu trữ tất cả giá trị dưới dạng chuỗi văn bản. YAML có boolean, số nguyên, số thực và null gốc. Trong quá trình chuyển đổi, một giá trị như "true" hay "3306" có thể bị hiểu lại là boolean hoặc số nguyên YAML trừ khi công cụ đặt dấu ngoặc kép cho nó. Luôn kiểm tra các giá trị nhạy cảm về kiểu trong đầu ra.
Thuộc tính vs khóa
Phần tử XML có thể mang thuộc tính cùng với phần tử con và nội dung văn bản. YAML chỉ có ánh xạ khóa-giá trị. Thuộc tính phải được chuyển đổi thành khóa thông thường, thường với tiền tố như _ hoặc @ để phân biệt với các phần tử con.
Thứ tự và trùng lặp
XML bảo toàn thứ tự tài liệu và cho phép các phần tử anh em cùng tên thẻ. Ánh xạ YAML không có thứ tự theo đặc tả (dù hầu hết trình phân tích bảo toàn thứ tự chèn), và khóa trùng lặp bị cấm trong YAML 1.2. Các phần tử XML lặp lại phải trở thành dãy YAML.

Ví dụ mã nguồn

Dưới đây là các ví dụ hoạt động để chuyển đổi XML sang YAML trong JavaScript, Python, Go và dòng lệnh. Mỗi ví dụ xử lý các phần tử lồng nhau, thuộc tính và các thẻ anh em lặp lại.

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

Câu hỏi thường gặp

Chuyển đổi XML sang YAML có mất thông tin không?
Không hoàn toàn. Thuộc tính XML, chú thích, chỉ thị xử lý và phần CDATA không có tương đương gốc trong YAML. Thuộc tính có thể được bảo toàn dưới dạng khóa có tiền tố (_attr hoặc @attr), nhưng chú thích và chỉ thị xử lý bị loại bỏ. Nếu cần chuyển đổi hai chiều trở lại XML, hãy xác minh rằng thuộc tính và khai báo không gian tên đã được giữ lại sau quá trình chuyển đổi.
Thuộc tính XML được biểu diễn trong YAML như thế nào?
Hầu hết các công cụ chuyển đổi thêm tiền tố gạch dưới (_) hoặc ký hiệu @ vào tên thuộc tính để phân biệt với các khóa phần tử con. Ví dụ, <server port="8080"> trở thành server:\n _port: "8080". Tiền tố cụ thể phụ thuộc vào thư viện hoặc công cụ bạn sử dụng.
Điều gì xảy ra với các phần tử XML lặp lại trong quá trình chuyển đổi?
Khi cùng một thẻ phần tử xuất hiện nhiều lần dưới một phần tử cha, công cụ chuyển đổi sẽ gộp chúng thành một dãy YAML (danh sách). Ví dụ, hai phần tử anh em <item> trở thành item:\n - value1\n - value2. Một phần tử <item> đơn lẻ vẫn là giá trị vô hướng trừ khi bật chế độ force-array.
Tôi có thể chuyển YAML ngược lại sang XML không?
Được, nhưng kết quả phụ thuộc vào cách lần chuyển đổi ban đầu xử lý thuộc tính và kiểu dữ liệu. Nếu thuộc tính được bảo toàn với khóa có tiền tố, một công cụ chuyển đổi YAML sang XML có thể tái tạo lại chúng. ToolDeck có công cụ YAML sang XML cho chiều ngược lại. Lưu ý rằng các kiểu gốc YAML (boolean, số) sẽ trở thành chuỗi văn bản trong XML.
Tại sao đầu ra YAML lại đặt dấu ngoặc kép cho một số giá trị?
YAML có kiểu gốc: true/false là boolean, số thuần trở thành số nguyên hoặc số thực, và yes/no/on/off cũng là boolean trong YAML 1.1. Nếu XML của bạn chứa văn bản như "true" hoặc "3306" cần giữ nguyên là chuỗi, công cụ chuyển đổi sẽ đặt dấu ngoặc kép để ngăn trình phân tích YAML hiểu lại giá trị đó. Đây là hành vi đúng, không phải lỗi.
Làm thế nào để xử lý các tệp XML lớn?
Các công cụ trên trình duyệt hoạt động tốt với tệp đến vài megabyte. Với tệp lớn hơn (10MB trở lên), hãy dùng phương pháp streaming: phân tích XML bằng iterparse của Python hoặc sax của Node.js, xây dựng đối tượng trung gian theo từng phần rồi tuần tự hóa sang YAML. Công cụ yq cũng có thể chuyển đổi XML sang YAML trực tiếp từ dòng lệnh mà không cần nạp toàn bộ tài liệu vào bộ nhớ.
Sự khác biệt giữa chuyển đổi XML sang YAML và XML sang JSON là gì?
Cả hai đều phải đối mặt với thách thức ánh xạ thuộc tính XML và các phần tử lặp lại sang một mô hình dữ liệu khác. Sự khác biệt chính nằm ở định dạng đầu ra. JSON nghiêm ngặt (không có chú thích, kiểu tường minh, cú pháp chặt chẽ), trong khi YAML là superset của JSON bổ sung các tính năng thân thiện với con người: chú thích, chuỗi nhiều dòng, anchor và alias. Chọn JSON khi người tiêu thụ là API hoặc JavaScript runtime. Chọn YAML khi người tiêu thụ là con người chỉnh sửa tệp cấu hình.