XML মিনিফায়ার
হোয়াইটস্পেস ও কমেন্ট সরিয়ে XML মিনিফাই করুন
XML ইনপুট
মিনিফাই করা XML
XML মিনিফিকেশন কী?
XML মিনিফিকেশন হলো একটি XML ডকুমেন্টের অর্থ পরিবর্তন না করে সমস্ত অপ্রয়োজনীয় বর্ণ সরিয়ে ফেলার প্রক্রিয়া। একটি XML মিনিফায়ার ট্যাগগুলোর মধ্যে হোয়াইটস্পেস সরায়, কমেন্ট বাদ দেয়, লাইন ব্রেক বাদ দেয় এবং ইন্ডেন্টেশন ভেঙে সংক্ষিপ্ত, একক-লাইনের আউটপুট তৈরি করে। ফলাফলটি এমন একটি XML স্ট্রিং যা পার্সার মূল ফরম্যাট করা সংস্করণের মতোই পার্স করে এবং একই ডেটা মডেল তৈরি করে।
XML 1.0 স্পেসিফিকেশন (W3C Recommendation, পঞ্চম সংস্করণ) ধারা ২.১০-এ হোয়াইটস্পেস পরিচালনার নিয়ম সংজ্ঞায়িত করে। ট্যাগগুলোর মধ্যে যে হোয়াইটস্পেসের কোনো শব্দার্থিক মূল্য নেই তাকে বলা হয় "অগুরুত্বপূর্ণ হোয়াইটস্পেস।" XML প্রসেসরগুলো এটি বাদ দিতে পারে। তবে টেক্সট কন্টেন্টের ভেতরে হোয়াইটস্পেস ডিফল্টভাবে গুরুত্বপূর্ণ, যদি না প্যারেন্ট এলিমেন্ট xml:space="default" ঘোষণা করে। একটি সঠিক XML মিনিফায়ার এই দুটি ক্ষেত্র আলাদা করে এবং শুধুমাত্র যা নিরাপদে সরানো যায় তাই সরায়।
মিনিফিকেশন কম্প্রেশন থেকে আলাদা। Gzip বা Brotli ট্রান্সপোর্ট স্তরে আকার কমায় এবং পার্স করার আগে ডিকম্প্রেশন প্রয়োজন। মিনিফিকেশন কাঁচা ডকুমেন্টের আকার নিজেই কমায়, ফলে XML যেকোনো পার্সার ডিকম্প্রেশন ধাপ ছাড়াই বৈধ ও পাঠযোগ্য থাকে। ব্যবহারিকভাবে, কম্প্রেস করার আগে মিনিফাই করলে সর্বোত্তম ফলাফল পাওয়া যায়: প্রথমে অপ্রয়োজনীয় বর্ণ বাদ দিন, তারপর কম্প্রেশন অ্যালগরিদম আরও সংক্ষিপ্ত ইনপুটে কাজ করে।
<?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 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 মিনিফায়ার কেন ব্যবহার করবেন?
ইন্ডেন্টেশন ও কমেন্ট সহ ফরম্যাট করা XML ডেভেলপমেন্ট ও কোড রিভিউর জন্য আদর্শ। সংরক্ষণ, ট্রান্সমিশন ও মেশিন প্রক্রিয়াকরণের জন্য সেই অতিরিক্ত ফরম্যাটিং কোনো সুবিধা ছাড়াই বাইট যোগ করে। একটি XML মিনিফায়ার সেই ব্যবধান দূর করে।
XML মিনিফায়ারের ব্যবহারের ক্ষেত্র
XML মিনিফিকেশন কী সরায়
একটি XML ডকুমেন্টের সবকিছু নিরাপদে সরানো যায় না। এই রেফারেন্স টেবিলটি প্রতিটি ধরনের অপসারণযোগ্য কন্টেন্ট দেখায় এবং এটি বাদ দেওয়া সর্বদা নিরাপদ কিনা বা আপনার ব্যবহারের ক্ষেত্রের উপর নির্ভরশীল কিনা তা নির্দেশ করে।
| আইটেম | উদাহরণ | নিরাপত্তা |
|---|---|---|
| Indentation | Spaces/tabs before tags | Always safe to remove |
| Line breaks | \n and \r\n between tags | Always 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 whitespace | Spaces after closing tags | Always safe to remove |
| Text node whitespace | Spaces inside text content | Remove only between tags, not within |
মিনিফিকেশন বনাম Gzip বনাম বাইনারি ফরম্যাট
মিনিফিকেশন, কম্প্রেশন ও বাইনারি এনকোডিং প্রতিটি আকার সমস্যার আলাদা স্তরকে লক্ষ্য করে। মিনিফিকেশন আউটপুটকে বৈধ, মানুষ-পাঠযোগ্য XML হিসেবে রাখে। কম্প্রেশন (gzip, Brotli) আরও সংকুচিত করে কিন্তু পার্স করার আগে ডিকম্প্রেশন ধাপ প্রয়োজন। বাইনারি ফরম্যাট সবচেয়ে বেশি কমায়, তবে সংযোগের উভয় প্রান্তে একটি সামঞ্জস্যপূর্ণ এনকোডার/ডিকোডার প্রয়োজন — মূলত এমবেডেড সিস্টেম বা WSDL-ভারী এন্টারপ্রাইজ সার্ভিসের জন্য ব্যবহারিক।
কোড উদাহরণ
প্রোগ্রামাটিক্যালি XML মিনিফাই করা প্রতিটি ভাষায় একই প্যাটার্ন অনুসরণ করে: ডকুমেন্টটি একটি ট্রিতে পার্স করুন, ঐচ্ছিকভাবে কমেন্ট নোড সরান, তারপর ইন্ডেন্টেশন ছাড়া সিরিয়ালাইজ করুন।
// 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>"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'))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>"# 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"