ToolDeck

فشرده‌ساز XML

فشرده‌سازی XML با حذف فاصله‌های اضافی و کامنت‌ها

یک مثال امتحان کنید

ورودی XML

XML فشرده‌شده

به‌صورت محلی اجرا می‌شود · جای‌گذاری اسرار امن است
XML فشرده‌شده اینجا نمایش داده می‌شود…

فشرده‌سازی XML چیست؟

فشرده‌سازی XML فرآیند حذف تمام کاراکترهای غیرضروری از یک سند XML بدون تغییر معنای آن است. یک فشرده‌ساز XML فاصله‌های بین تگ‌ها را حذف می‌کند، کامنت‌ها را پاک می‌کند، شکست خطوط را از بین می‌برد و تورفتگی را حذف می‌کند تا خروجی فشرده‌ای در یک خط تولید کند. نتیجه یک رشته XML است که پارسرها آن را کاملاً یکسان با نسخه فرمت‌شده اصلی می‌خوانند و همان مدل داده را تولید می‌کنند.

مشخصه XML 1.0 (توصیه W3C، ویرایش پنجم) قوانین مدیریت فاصله را در بخش ۲.۱۰ تعریف می‌کند. فاصله‌های بین تگ‌هایی که ارزش معنایی ندارند «فاصله غیرمعنایی» نامیده می‌شوند. پردازنده‌های XML می‌توانند آن‌ها را حذف کنند. اما فاصله‌های داخل محتوای متنی به صورت پیش‌فرض معنادار هستند، مگر اینکه عنصر والد xml:space="default" اعلان کند. یک فشرده‌ساز صحیح XML بین این دو حالت تمایز قائل می‌شود و تنها آنچه را که حذف آن بی‌خطر است پاک می‌کند.

مینیفای کردن با فشرده‌سازی داده (compression) تفاوت دارد. Gzip یا Brotli حجم را در لایه انتقال کاهش می‌دهند و قبل از تجزیه نیاز به رمزگشایی دارند. فشرده‌سازی XML حجم خود سند خام را کاهش می‌دهد، بنابراین XML همچنان معتبر است و بدون نیاز به رمزگشایی توسط هر پارسری قابل خواندن است. در عمل، فشرده‌سازی قبل از فشرده‌سازی بهترین نتیجه را می‌دهد: ابتدا کاراکترهای اضافی را حذف می‌کنید، سپس الگوریتم فشرده‌سازی روی ورودی کوچک‌تری کار می‌کند.

After · xml
Before · xml
<?xml version="1.0" encoding="UTF-8"?><catalog><product id="p101"><name>Widget A</name><price currency="USD">29.99</price><stock>142</stock></product><product id="p102"><name>Widget B</name><price currency="EUR">19.50</price><stock>87</stock></product></catalog>
<?xml version="1.0" encoding="UTF-8"?>
<!-- Product catalog for Q1 2026 -->
<catalog>
  <product id="p101">
    <name>Widget A</name>
    <price currency="USD">29.99</price>
    <!-- Temporarily discounted -->
    <stock>142</stock>
  </product>
  <product id="p102">
    <name>Widget B</name>
    <price currency="EUR">19.50</price>
    <stock>87</stock>
  </product>
</catalog>

چرا از یک فشرده‌ساز XML استفاده کنیم؟

XML فرمت‌شده با تورفتگی و کامنت‌ها برای توسعه و بازبینی کد ایده‌آل است. برای ذخیره‌سازی، انتقال و مصرف ماشینی، آن قالب‌بندی اضافی بایت‌هایی اضافه می‌کند که هیچ فایده‌ای ندارند. یک فشرده‌ساز XML این فاصله را از بین می‌برد.

کاهش فوری حجم انتقال
حذف فاصله‌ها و کامنت‌ها از یک فایل پیکربندی XML معمولی، حجم آن را ۲۰ تا ۴۰ درصد کاهش می‌دهد. برای پیلودهای SOAP و فیدهای بزرگ، صرفه‌جویی اغلب از ۳۰ درصد بیشتر است و هزینه‌های پهنای باند و زمان پاسخ API را کاهش می‌دهد.
🔒
اجرا در سمت کلاینت، بدون آپلود
فشرده‌ساز با استفاده از DOMParser بومی مرورگر اجرا می‌شود. هیچ داده‌ای به سرور ارسال نمی‌شود. پردازش به صورت محلی انجام می‌شود، صرف نظر از اینکه XML چه محتوایی دارد.
📦
بدون نیاز به ثبت‌نام یا نصب
XML خود را paste کنید و خروجی فشرده‌شده را دریافت کنید. بدون ایجاد حساب کاربری، بدون نصب ابزار CLI، بدون وابستگی. روی هر دستگاه با مرورگر مدرن کار می‌کند.
🔧
پشتیبانی از هر XML خوش‌فرم
از فضاهای نام، بخش‌های CDATA، دستورالعمل‌های پردازشی و ساختارهای تودرتوی عمیق پشتیبانی می‌کند. اگر ورودی XML خوش‌فرم باشد، فشرده‌ساز خروجی فشرده معتبری تولید می‌کند.

موارد استفاده از فشرده‌ساز XML

توسعه فرانت‌اند
فایل‌های SVG جاسازی‌شده در HTML یا CSS را فشرده کنید. حذف فاصله‌ها و کامنت‌ها از نشانه‌گذاری SVG، وزن صفحه را بدون تغییر در نمودار رندرشده کاهش می‌دهد. حتی یک مجموعه آیکون SVG متوسط می‌تواند چند کیلوبایت کاهش یابد.
بهینه‌سازی API بک‌اند
پاسخ‌های SOAP و پیلودهای XML-RPC را قبل از ارسال به کلاینت‌ها کوچک کنید. XML فشرده‌شده سریع‌تر تجزیه می‌شود و تأخیر شبکه را برای سرویس‌های پرترافیک کاهش می‌دهد. بیشترین بهره زمانی است که پاسخ‌ها از پیش در لایه انتقال فشرده نشده باشند.
DevOps و پایپ‌لاین‌های CI/CD
فایل‌های پیکربندی XML (pom.xml، web.xml، .csproj) را در پایپ‌لاین‌های ساخت فشرده کنید تا حجم آرتیفکت در تصاویر Docker و بسته‌های استقرار کاهش یابد. تصاویر کوچک‌تر به زمان pull کوتاه‌تر و هزینه‌های ذخیره‌سازی registry کمتر تبدیل می‌شوند.
QA و آزمایش
فیکسچرهای آزمون XML را با فشرده‌سازی قبل از مقایسه نرمال‌سازی کنید. حذف تفاوت‌های قالب‌بندی از شکست‌های آزمون کاذب ناشی از تغییرات فاصله‌ای جلوگیری می‌کند. فیکسچرهای فشرده‌شده استاندارد همچنین بررسی دیف‌های کنترل نسخه را آسان‌تر می‌کنند.
مهندسی داده
فیدهای داده XML بزرگ (RSS، Atom، XBRL) را قبل از ذخیره در پایگاه‌های داده یا صف‌های پیام فشرده کنید. پیلودهای کوچک‌تر به معنای هزینه‌های ذخیره‌سازی کمتر و توان عملیاتی صف سریع‌تر است. در مقیاس بزرگ، کاهش ۲۰ درصدی در حجم فید در هزینه‌های محاسباتی و I/O به سرعت جمع می‌شود.
یادگیری ساختار XML
دانشجویان می‌توانند XML را فشرده و سپس دوباره فرمت دهند تا بفهمند پارسرها چگونه فاصله‌های غیرمعنایی را نادیده می‌گیرند و چرا ساختار سند مستقل از قالب‌بندی بصری آن است. این تمرین قوانین انتزاعی مشخصه را ملموس و بلافاصله قابل مشاهده می‌کند.

آنچه فشرده‌سازی XML حذف می‌کند

همه چیز در یک سند XML به صورت بی‌خطر قابل حذف نیست. این جدول مرجع هر نوع محتوای قابل حذف را نشان می‌دهد و اینکه آیا حذف آن همیشه بی‌خطر است یا بسته به موارد استفاده شما شرطی است.

موردمثالایمنی
IndentationSpaces/tabs before tagsAlways safe to remove
Line breaks\n and \r\n between tagsAlways safe to remove
Comments<!-- ... -->Safe unless parsed by app
XML declaration<?xml version="1.0"?>Keep if encoding is non-UTF-8
Processing instructions<?xml-stylesheet ...?>Keep if consumed downstream
Trailing whitespaceSpaces after closing tagsAlways safe to remove
Text node whitespaceSpaces inside text contentRemove only between tags, not within

فشرده‌سازی XML در مقابل Gzip در مقابل فرمت‌های باینری

فشرده‌سازی، فشرده‌سازی داده و رمزگذاری باینری هر کدام لایه متفاوتی از مشکل حجم را هدف قرار می‌دهند. فشرده‌سازی XML خروجی را به صورت XML معتبر و قابل خواندن توسط انسان نگه می‌دارد. فشرده‌سازی (gzip، Brotli) بیشتر کوچک می‌کند اما قبل از تجزیه نیاز به رمزگشایی دارد. فرمت‌های باینری بیشترین کاهش را دارند، اما هر دو طرف اتصال به یک رمزگذار/رمزگشای سازگار نیاز دارند — عملاً فقط برای سیستم‌های تعبیه‌شده یا سرویس‌های سازمانی با WSDL سنگین مناسب است.

فشرده‌سازی XML
فاصله‌های غیرمعنایی، کامنت‌ها و شکست خطوط را حذف می‌کند. خروجی همچنان XML معتبر است و توسط هر پارسری قابل خواندن است. کاهش معمول: ۲۰ تا ۴۰ درصد. نیازی به مرحله رمزگشایی نیست.
فشرده‌سازی Gzip / Brotli
یک الگوریتم فشرده‌سازی روی جریان بایت اعمال می‌کند. کاهش معمول: ۶۰ تا ۸۰ درصد علاوه بر فشرده‌سازی XML. قبل از تجزیه XML نیاز به رمزگشایی دارد. استاندارد برای HTTP از طریق Content-Encoding.
فرمت‌های باینری (EXI، Fast Infoset)
مجموعه اطلاعات XML را در یک نمایش باینری رمزگذاری می‌کنند. کاهش معمول: ۸۰ تا ۹۵ درصد. به یک رمزگذار/رمزگشای سازگار در هر دو طرف نیاز دارند. در محیط‌های محدود مانند سیستم‌های تعبیه‌شده و سرویس‌های WSDL محور استفاده می‌شود.

نمونه‌های کد

فشرده‌سازی XML به صورت برنامه‌ای در هر زبانی از همان الگو پیروی می‌کند: سند را به یک درخت تجزیه کنید، به صورت اختیاری گره‌های کامنت را حذف کنید، سپس بدون تورفتگی سریال‌سازی کنید.

JavaScript (browser)
// Minify XML by parsing and re-serializing (strips formatting)
const raw = `<root>
  <item id="1">
    <!-- note -->
    <name>Test</name>
  </item>
</root>`

const parser = new DOMParser()
const doc = parser.parseFromString(raw, 'application/xml')

// Remove comment nodes
const walker = doc.createTreeWalker(doc, NodeFilter.SHOW_COMMENT)
const comments = []
while (walker.nextNode()) comments.push(walker.currentNode)
comments.forEach(c => c.parentNode.removeChild(c))

const minified = new XMLSerializer().serializeToString(doc)
// → "<root><item id=\"1\"><name>Test</name></item></root>"
Python
from lxml import etree

xml = """<root>
  <item id="1">
    <!-- note -->
    <name>Test</name>
  </item>
</root>"""

tree = etree.fromstring(xml.encode())

# Remove comments
for comment in tree.iter(etree.Comment):
    comment.getparent().remove(comment)

# Serialize without pretty-print (minified)
result = etree.tostring(tree, xml_declaration=False).decode()
# → '<root><item id="1"><name>Test</name></item></root>'

# With xml.etree (stdlib, no lxml needed)
import xml.etree.ElementTree as ET
root = ET.fromstring(xml)
ET.indent(root, space='')  # Python 3.9+
print(ET.tostring(root, encoding='unicode'))
Go
package main

import (
    "encoding/xml"
    "fmt"
    "strings"
)

func minifyXML(input string) (string, error) {
    decoder := xml.NewDecoder(strings.NewReader(input))
    var out strings.Builder
    encoder := xml.NewEncoder(&out)
    // No indentation = minified output
    for {
        tok, err := decoder.Token()
        if err != nil {
            break
        }
        // Skip comments
        if _, ok := tok.(xml.Comment); ok {
            continue
        }
        // Skip whitespace-only char data
        if cd, ok := tok.(xml.CharData); ok {
            if strings.TrimSpace(string(cd)) == "" {
                continue
            }
        }
        encoder.EncodeToken(tok)
    }
    encoder.Flush()
    return out.String(), nil
}
// minifyXML("<a>\n  <b>1</b>\n</a>") → "<a><b>1</b></a>"
CLI (xmllint)
# Minify XML with xmllint (part of libxml2)
xmllint --noblanks input.xml > minified.xml

# Minify from stdin
echo '<root>
  <item>hello</item>
</root>' | xmllint --noblanks -
# → <?xml version="1.0"?><root><item>hello</item></root>

# Strip comments too (combine with sed or xmlstarlet)
xmlstarlet ed -d '//comment()' input.xml | xmllint --noblanks -

# Check size reduction
echo "Before: $(wc -c < input.xml) bytes"
echo "After:  $(xmllint --noblanks input.xml | wc -c) bytes"

سؤالات متداول

آیا XML فشرده‌شده همچنان XML معتبر است؟
بله. فشرده‌سازی فقط فاصله‌های غیرمعنایی و کامنت‌ها را حذف می‌کند. سند حاصل با همان مشخصه XML 1.0 یا 1.1 که سند اصلی مطابقت دارد، مطابقت دارد. هر پارسر منطبقی از هر دو نسخه فرمت‌شده و فشرده‌شده همان مدل داده را تولید می‌کند.
XML بعد از فشرده‌سازی چقدر کوچک‌تر می‌شود؟
صرفه‌جویی بستگی به نحوه فرمت‌بندی اصلی دارد. XML با تورفتگی زیاد و کامنت‌ها معمولاً ۲۰ تا ۴۰ درصد کوچک‌تر می‌شود. یک سند از قبل فشرده ممکن است تنها ۵ تا ۱۰ درصد کاهش یابد. تعداد بایت‌های ورودی و خروجی را مقایسه کنید تا کاهش دقیق را اندازه‌گیری کنید.
آیا فشرده‌سازی می‌تواند XML من را خراب کند؟
اگر فشرده‌ساز تنها فاصله‌های بین تگ‌ها (فاصله غیرمعنایی) و کامنت‌ها را حذف کند، معناشناسی سند یکسان می‌ماند. یک استثنا بخش‌های xml:space="preserve" است که در آنها فاصله داخل گره‌های متنی معنادار است. یک فشرده‌ساز صحیح به این دستورالعمل احترام می‌گذارد و آن بخش‌ها را دست نزده رها می‌کند.
تفاوت بین فشرده‌سازی XML و فشرده‌سازی داده XML چیست؟
فشرده‌سازی XML متن XML را با حذف کاراکترهایی که هیچ داده‌ای حمل نمی‌کنند ویرایش می‌کند. فشرده‌سازی داده (gzip، Brotli) کل جریان بایت را به فرمت باینری کوچک‌تری رمزگذاری می‌کند که قبل از تجزیه باید رمزگشایی شود. فشرده‌سازی XML و فشرده‌سازی داده مکمل هم هستند: ابتدا فشرده کنید، سپس برای انتقال فشرده‌سازی داده اعمال کنید.
آیا باید XML را قبل از ذخیره در پایگاه داده فشرده کنم؟
برای حجم زیاد داده‌های XML، فشرده‌سازی قبل از ذخیره‌سازی مصرف دیسک را کاهش می‌دهد و خواندن را سرعت می‌بخشد. برای فایل‌های پیکربندی یا الگوهایی که توسعه‌دهندگان به صورت دستی ویرایش می‌کنند، نسخه فرمت‌شده را ذخیره کنید و در زمان ساخت یا هنگام انتقال فشرده کنید. معامله بین خوانایی و کارایی ذخیره‌سازی است. از فشرده‌سازی XML که قرار است حسابرسی شود، در کنترل نسخه دیف شود یا توسط تیم‌های عملیاتی به صورت دستی به‌روزرسانی شود خودداری کنید — حفظ قالب‌بندی در آن موارد بسیار بیشتر از ارزش صرفه‌جویی در ذخیره‌سازی وقت صرفه‌جویی می‌کند.
آیا xmllint از فشرده‌سازی پشتیبانی می‌کند؟
بله. اجرای xmllint --noblanks input.xml فاصله‌های غیرمعنایی را حذف می‌کند. به طور پیش‌فرض کامنت‌ها را حذف نمی‌کند. برای حذف کامنت‌ها نیز، ابتدا از طریق xmlstarlet ed -d '//comment()' پایپ کنید، یا از یک XSLT سفارشی که گره‌های کامنت را حذف می‌کند استفاده کنید.
فشرده‌سازی چه تأثیری بر عملکرد تجزیه XML دارد؟
XML فشرده‌شده سریع‌تر تجزیه می‌شود زیرا پارسر بایت‌های کمتری پردازش می‌کند و با گره‌های متنی حاوی فاصله مواجه نمی‌شود. این تفاوت در اسناد بزرگ (۱ مگابایت به بالا) و در پارسرهای جریانی بیشتر مشهود است، جایی که هر گره اضافی به سربار پیمایش اضافه می‌کند.