فرمتدهنده XML
فرمتدهی و چاپ زیبای XML با برجستهسازی نحوی
ورودی XML
XML فرمتشده
فرمتدهی XML چیست؟
فرمتدهی XML (که به آن چاپ زیبای XML یا زیباسازی XML نیز میگویند) فرآیند افزودن تورفتگی یکدست و شکست خط به یک سند XML است تا ساختار سلسلهمراتبی آن نمایان شود. XML خام دریافتی از APIها، ابزارهای تولید پیکربندی یا سریالایزرها اغلب به صورت یک خط بدون فاصله بین تگها ارائه میشود. یک فرمتدهنده XML آن سند را به یک درخت تجزیه میکند و سپس با فاصلهگذاری یکنواخت دوباره تولید میکند.
مشخصه XML 1.0 (توصیه W3C، ویرایش پنجم) گرامر دقیقی تعریف میکند که در آن هر تگ باز باید تگ بستن متناظر داشته باشد یا خودبسته باشد، مقادیر ویژگیها باید داخل نقلقول باشند، و پنج کاراکتر (<، >، &، "، ') نیاز به escape با موجودیتهای از پیش تعریفشده دارند. یک فرمتدهنده باید این قوانین را رعایت کند و تنها فاصلههای غیرمعناییای اضافه کند که مجموعه اطلاعات (infoset) سند را تغییر نمیدهند.
XML فرمتشده در بازبینی کد راحتتر خوانده میشود، در سیستمهای کنترل نسخه راحتتر مقایسه میشود، و هنگامی که یک سرویس داده غیرمنتظره برمیگرداند اشکالزدایی آن آسانتر است. عملیات فرمتدهی بدون اتلاف است: محتوای منطقی سند یکسان میماند و تنها نمایش آن تغییر میکند. ابزارهایی مانند git diff و پلتفرمهای بازبینی pull request فقط خطوط تغییریافته را نشان میدهند — XML با تورفتگی یکنواخت تضمین میکند که آن تفاوتها تغییرات واقعی را منعکس کنند، نه نویز قالببندی مجدد.
<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>
چرا از یک فرمتدهنده XML آنلاین استفاده کنیم؟
فرمتدهی XML به صورت دستی مستعد خطا و کند است، بهویژه برای اسناد با تودرتویی عمیق یا فضاهای نام مختلط. یک فرمتدهنده مبتنی بر مرورگر نتیجه فرمتشده را در کمتر از یک ثانیه، صرف نظر از اندازه فایل، ارائه میدهد.
موارد استفاده از فرمتدهنده XML
مرجع موجودیتهای از پیش تعریفشده XML
XML پنج کاراکتر را برای نحو خود رزرو کرده است. هنگامی که این کاراکترها به عنوان محتوای متنی تحتاللفظی یا مقادیر ویژگی ظاهر میشوند، باید با موجودیتهای از پیش تعریفشده جایگزین شوند. یک فرمتدهنده صحیح این موجودیتها را در حین چاپ زیبا حفظ میکند.
| کاراکتر | نقش در XML | موجودیت |
|---|---|---|
| < | Start of tag | < |
| > | End of tag | > |
| & | Start of entity | & |
| " | Attribute delimiter | " |
| ' | Attribute delimiter | ' |
مقایسه سبکهای تورفتگی XML
هیچ استاندارد واحدی برای تورفتگی XML وجود ندارد. انتخاب به قراردادهای تیم شما و ابزارهای موجود در پایپلاینتان بستگی دارد. در اینجا سه سبک رایج آورده شده است.
مثالهای کد: فرمتدهی XML به صورت برنامهای
وقتی نیاز دارید XML را درون یک اسکریپت یا فرآیند ساخت فرمت دهید، هر زبان اصلی یک گزینه داخلی یا در کتابخانه استاندارد دارد. در ادامه مثالهای کاربردی آورده شده که میتوانید مستقیماً کپی کنید.
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