ToolDeck

مُصغِّر XML

ضغط XML بإزالة المسافات والتعليقات

جرب مثالاً

إدخال XML

XML المضغوط

يعمل محليًا · آمن للصق الأسرار
سيظهر XML المضغوط هنا…

ما هو ضغط XML؟

ضغط XML هو عملية حذف جميع الأحرف غير الضرورية من مستند XML دون تغيير معناه. يُزيل مُصغِّر XML المسافات البيضاء بين الوسوم، ويحذف التعليقات، ويلغي فواصل الأسطر، ويطوي المسافات البادئة لينتج مخرجًا مضغوطًا في سطر واحد. والنتيجة سلسلة XML يُحلّلها أي محلل بصورة مطابقة للنسخة الأصلية المنسَّقة، منتجًا نموذج بيانات واحدًا.

تحدد مواصفة XML 1.0 (توصية W3C، الطبعة الخامسة) قواعد التعامل مع المسافات البيضاء في القسم 2.10. المسافات البيضاء بين الوسوم التي لا قيمة دلالية لها تُسمى "المسافة البيضاء غير ذات الدلالة"، ويحق لمعالجات XML تجاهلها. أما المسافة البيضاء داخل محتوى النص فهي ذات دلالة بالافتراضي ما لم يُعلن العنصر الأب xml:space="default". يُميّز المضغوط الصحيح بين الحالتين ولا يحذف إلا ما يأمن حذفه.

يختلف الضغط عن الترميز المضغوط (compression). يقلل كلٌّ من Gzip وBrotli الحجم على طبقة النقل ويستلزمان فك الضغط قبل التحليل. أما ضغط XML فيقلل حجم المستند الخام نفسه، فيبقى XML صالحًا ومقروءًا لأي محلل دون خطوة فك ضغط. عمليًا، ضغط XML أولًا ثم تطبيق Gzip يُعطي أفضل النتائج: تُزال الأحرف الزائدة أولًا، ثم تعمل خوارزمية الضغط على مدخل أكثر إحكامًا.

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 ضبط نموذجي يُقلص حجمه بنسبة 20–40٪. بالنسبة لحمولات SOAP والخلاصات الكبيرة، كثيرًا ما تتجاوز الوفورات 30٪، مما يخفض تكاليف النطاق الترددي وأوقات استجابة API.
🔒
يعمل من جانب العميل، لا رفع للبيانات
يعمل المُصغِّر في المتصفح باستخدام DOMParser المدمج. لا يُرسَل أي بيانات إلى خادم؛ تجري المعالجة محليًا بصرف النظر عن محتوى XML.
📦
لا تسجيل ولا تثبيت
الصق XML واحصل على المخرجات المضغوطة. لا إنشاء حساب، ولا أداة سطر أوامر للتثبيت، ولا اعتماديات. يعمل على أي جهاز بمتصفح حديث.
🔧
يتعامل مع أي XML سليم التركيب
يدعم مساحات الأسماء وأقسام CDATA وتعليمات المعالجة والبنى المتداخلة بعمق. إذا كان المدخل XML سليم التركيب، سيُنتج المضغوط مخرجات مضغوطة صالحة.

حالات استخدام مضغوط XML

تطوير الواجهة الأمامية
اضغط ملفات SVG المدمجة في HTML أو CSS. حذف المسافات البيضاء والتعليقات من ترميز SVG يقلل وزن الصفحة دون المساس بالرسم المعروض. حتى مجموعة أيقونات SVG متوسطة قد تفقد عدة كيلوبايتات.
تحسين واجهات برمجة التطبيقات الخلفية
قلّص ردود SOAP وحمولات XML-RPC قبل إرسالها إلى العملاء. XML المضغوط يُحلَّل بسرعة أكبر ويقلص زمن الاستجابة على الشبكة للخدمات ذات الإنتاجية العالية. تكون الفائدة أكبر حين لا تخضع الردود بالفعل للضغط على طبقة النقل.
DevOps وخطوط أنابيب CI/CD
اضغط ملفات ضبط XML (pom.xml وweb.xml و.csproj) في خطوط أنابيب البناء لتقليص حجم الحزم في صور Docker وحزم النشر. الصور الأصغر تعني أوقات سحب أسرع وفواتير تخزين أقل لسجلات الحاويات.
ضمان الجودة والاختبار
وحّد تركيبات اختبار XML بضغطها قبل المقارنة. حذف اختلافات التنسيق يمنع النتائج الإيجابية الكاذبة في الاختبارات الناجمة عن تغييرات المسافات البيضاء فقط. التركيبات المضغوطة الموحّدة تجعل فروق نظام التحكم في الإصدار أسهل للمراجعة.
هندسة البيانات
اضغط خلاصات بيانات XML الكبيرة (RSS وAtom وXBRL) قبل تخزينها في قواعد البيانات أو صفوف الرسائل. الحمولات الأصغر تعني تكاليف تخزين أقل وإنتاجية صفوف أسرع. على نطاق واسع، يتراكم تقليص 20٪ في حجم الخلاصات بسرعة في تكاليف الحوسبة والإدخال/الإخراج.
تعلم بنية 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 صالحًا مقروءًا للإنسان. يُقلص الضغط عبر HTTP (Gzip وBrotli) أكثر لكنه يستلزم خطوة فك ضغط قبل التحليل. تذهب الصيغ الثنائية إلى أبعد مدى، لكن طرفَي الاتصال يحتاجان إلى مشفّر/مفكّك متوافق — وهو أمر عملي أساسًا للأنظمة المدمجة أو الخدمات المؤسسية الثقيلة على WSDL.

ضغط XML
يحذف المسافات البيضاء غير ذات الدلالة والتعليقات وفواصل الأسطر. المخرجات لا تزال XML صالحًا يقرأه أي محلل. التقليص النموذجي: 20–40٪. لا حاجة لخطوة فك ضغط.
ضغط Gzip / Brotli
يُطبّق خوارزمية ضغط على دفق البايتات. التقليص النموذجي: 60–80٪ إضافية بعد ضغط XML. يستلزم خطوة فك ضغط قبل تحليل XML. معيار قياسي لـHTTP عبر Content-Encoding.
الصيغ الثنائية (EXI، Fast Infoset)
ترمّز XML Infoset في تمثيل ثنائي. التقليص النموذجي: 80–95٪. يستلزم مشفّرًا/مفككًا متوافقًا على كلا الطرفين. يُستخدم في البيئات ذات الموارد المحدودة كالأنظمة المدمجة والخدمات المؤسسية الثقيلة على 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 المُبادَل بعمق مع تعليقات كثيرة ينكمش عادةً بنسبة 20–40٪. المستند المضغوط أصلًا قد لا يفقد سوى 5–10٪. قارن عدد البايتات في المدخل والمخرج لقياس التقليص الدقيق.
هل يمكن أن يتسبب الضغط في كسر XML؟
إذا اقتصر المضغوط على حذف المسافات البيضاء بين الوسوم (المسافات البيضاء غير ذات الدلالة) والتعليقات، تبقى دلالات المستند كما هي. الحالة الاستثنائية هي أقسام xml:space="preserve"، حيث تكون المسافات البيضاء داخل عقد النص ذات معنى. يحترم المضغوط الصحيح هذا التوجيه ويترك تلك الأقسام دون تغيير.
ما الفرق بين ضغط XML وضغطه عبر HTTP؟
يُعدّل الضغط نص XML نفسه بحذف الأحرف التي لا تحمل بيانات. أما الضغط عبر HTTP (Gzip وBrotli) فيرمّز دفق البايتات بأكمله في صيغة ثنائية أصغر يجب فك ضغطها قبل التحليل. الضغطان متكاملان: اضغط أولًا، ثم طبّق ضغط HTTP للنقل.
هل يجب ضغط XML قبل تخزينه في قاعدة البيانات؟
بالنسبة لكميات كبيرة من بيانات XML، يقلل الضغط قبل التخزين استخدام القرص ويسرع القراءة. بالنسبة لملفات الضبط أو القوالب التي يحررها المطورون يدويًا، احتفظ بالنسخة المنسَّقة واضغط عند وقت البناء أو على الشبكة. المقايضة بين القابلية للقراءة وكفاءة التخزين. تجنب ضغط XML الذي سيُراجَع أو يُقارَن في نظام التحكم في الإصدار أو يُحدَّث يدويًا من قِبَل فرق التشغيل — الحفاظ على التنسيق في تلك الحالات يوفر وقتًا أكثر بكثير مما تستحقه وفورات التخزين.
هل تدعم xmllint الضغط؟
نعم. تشغيل xmllint --noblanks input.xml يحذف المسافات البيضاء غير ذات الدلالة. لا يحذف التعليقات بالافتراضي. لحذف التعليقات أيضًا، مرّر الإخراج عبر xmlstarlet ed -d '//comment()' أولًا، أو استخدم XSLT مخصص يحذف عقد التعليقات.
كيف يؤثر الضغط على أداء تحليل XML؟
XML المضغوط يُحلَّل بسرعة أكبر لأن المحلل يعالج عددًا أقل من البايتات ولا يواجه عقد نصية تحتوي على مسافات بيضاء فقط. يكون الفرق أكثر وضوحًا في المستندات الكبيرة (1 ميجابايت وما فوق) وفي محللات البث، حيث تُضيف كل عقدة إضافية إلى عبء الاجتياز.