Định dạng XML
Định dạng và làm đẹp XML với tô sáng cú pháp
Nhập XML
XML Được Định Dạng
Định dạng XML là gì?
Định dạng XML (còn được gọi là XML pretty-printing hay XML beautification) là quá trình thêm thụt lề và ngắt dòng nhất quán vào một tài liệu XML để cấu trúc phân cấp của nó trở nên rõ ràng. XML thô từ các API, trình tạo cấu hình hoặc bộ tuần tự hóa thường được trả về dưới dạng một dòng duy nhất không có khoảng trắng giữa các thẻ. Một công cụ định dạng XML phân tích tài liệu đó thành cây, sau đó tuần tự hóa lại với khoảng cách nhất quán.
Đặc tả XML 1.0 (Khuyến nghị W3C, phiên bản thứ năm) định nghĩa một ngữ pháp chặt chẽ trong đó mỗi thẻ mở phải có thẻ đóng tương ứng hoặc là thẻ tự đóng, thuộc tính phải được đặt trong dấu ngoặc, và năm ký tự (<, >, &, ", ') yêu cầu thoát thực thể. Một công cụ định dạng phải tuân theo các quy tắc này trong khi chỉ chèn khoảng trắng không quan trọng không làm thay đổi tập thông tin (infoset) của tài liệu.
XML được định dạng dễ đọc hơn trong quá trình xem xét mã, dễ so sánh hơn trong hệ thống kiểm soát phiên bản, và dễ gỡ lỗi hơn khi một dịch vụ trả về dữ liệu không mong đợi. Bản thân thao tác định dạng là không mất mát: nội dung logic của tài liệu vẫn giống nhau, chỉ có cách trình bày thay đổi. Các công cụ như git diff và nền tảng xem xét pull request chỉ hiển thị các dòng đã thay đổi — XML được thụt lề nhất quán đảm bảo các so sánh đó phản ánh thay đổi thực sự, không phải nhiễu từ việc định dạng lại.
<catalog><book id="bk101"><author>Gambardella, Matthew</author><title>XML Developer's Guide</title><genre>Computer</genre><price>44.95</price><publish_date>2000-10-01</publish_date></book><book id="bk102"><author>Ralls, Kim</author><title>Midnight Rain</title><genre>Fantasy</genre><price>5.95</price><publish_date>2000-12-16</publish_date></book></catalog>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
</book>
</catalog>Tại sao sử dụng công cụ định dạng XML trực tuyến?
Định dạng XML bằng tay dễ xảy ra lỗi và mất thời gian, đặc biệt đối với các tài liệu có nhiều cấp lồng nhau hoặc nhiều không gian tên lẫn lộn. Một công cụ chạy trên trình duyệt cho kết quả định dạng trong vòng chưa đầy một giây, bất kể kích thước tệp.
Các trường hợp sử dụng công cụ định dạng XML
Tham chiếu thực thể được định nghĩa sẵn trong XML
XML đặt trước năm ký tự cho cú pháp của nó. Khi các ký tự này xuất hiện dưới dạng nội dung văn bản hoặc giá trị thuộc tính, chúng phải được thay thế bằng các tham chiếu thực thể được định nghĩa sẵn. Một công cụ định dạng đúng đắn giữ nguyên các thực thể này trong quá trình định dạng.
| Ký tự | Vai trò trong XML | Thực thể |
|---|---|---|
| < | Start of tag | < |
| > | End of tag | > |
| & | Start of entity | & |
| " | Attribute delimiter | " |
| ' | Attribute delimiter | ' |
So sánh các kiểu thụt lề XML
Không có một tiêu chuẩn duy nhất nào cho việc thụt lề XML. Lựa chọn phụ thuộc vào quy ước của nhóm bạn và các công cụ trong pipeline. Dưới đây là ba kiểu phổ biến nhất.
Ví dụ mã: Định dạng XML theo chương trình
Khi bạn cần định dạng XML trong một tập lệnh hoặc quy trình build, mọi ngôn ngữ lớn đều có tùy chọn tích hợp sẵn hoặc trong thư viện chuẩn. Dưới đây là các ví dụ hoạt động được bạn có thể sao chép trực tiếp.
const raw = '<root><item>hello</item></root>'
const parser = new DOMParser()
const doc = parser.parseFromString(raw, 'application/xml')
const serializer = new XMLSerializer()
const xml = serializer.serializeToString(doc)
// Indent with XSLT (browser-native approach)
const xslt = new DOMParser().parseFromString(`
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>
</xsl:template>
</xsl:stylesheet>`, 'application/xml')
const proc = new XSLTProcessor()
proc.importStylesheet(xslt)
const formatted = proc.transformToDocument(doc)
console.log(new XMLSerializer().serializeToString(formatted))
// → <root>\n <item>hello</item>\n</root>import xml.dom.minidom raw = '<root><item>hello</item><item>world</item></root>' dom = xml.dom.minidom.parseString(raw) print(dom.toprettyxml(indent=' ')) # → <?xml version="1.0" ?> # → <root> # → <item>hello</item> # → <item>world</item> # → </root> # With lxml (handles namespaces, XSD, large files) from lxml import etree tree = etree.fromstring(raw.encode()) print(etree.tostring(tree, pretty_print=True).decode())
package main
import (
"encoding/xml"
"fmt"
"strings"
)
func formatXML(raw string) (string, error) {
decoder := xml.NewDecoder(strings.NewReader(raw))
var out strings.Builder
encoder := xml.NewEncoder(&out)
encoder.Indent("", " ")
for {
tok, err := decoder.Token()
if err != nil {
break
}
encoder.EncodeToken(tok)
}
encoder.Flush()
return out.String(), nil
}
// formatXML("<a><b>1</b></a>") → "<a>\n <b>1</b>\n</a>"# Format XML file with xmllint (part of libxml2, pre-installed on macOS/Linux) xmllint --format input.xml > formatted.xml # Format from stdin echo '<a><b>1</b></a>' | xmllint --format - # → <?xml version="1.0"?> # → <a> # → <b>1</b> # → </a> # Validate and format at the same time xmllint --format --schema schema.xsd input.xml