XML Minifier
Minifikujte XML odstraněním mezer a komentářů
XML Vstup
Minifikované XML
Co je minifikace XML?
Minifikace XML je proces odstranění všech nadbytečných znaků z XML dokumentu beze změny jeho významu. XML minifier odstraňuje mezery mezi značkami, komentáře, zalomení řádků a odsazení, aby vznikl kompaktní výstup na jediném řádku. Výsledkem je XML řetězec, který parsery čtou identicky jako původní naformátovanou verzi a produkují stejný datový model.
Specifikace XML 1.0 (doporučení W3C, páté vydání) definuje pravidla pro zpracování mezer v sekci 2.10. Mezery mezi značkami, které nemají sémantickou hodnotu, se označují jako "nevýznamné mezery". XML procesory je smějí vypustit. Mezery uvnitř textového obsahu jsou však ve výchozím nastavení významné, pokud nadřazený prvek nedeklaruje xml:space="default". Správný XML minifier rozlišuje tyto dva případy a odstraňuje pouze to, co je bezpečné odstranit.
Minifikace se liší od komprese. Gzip nebo Brotli zmenšují velikost na transportní vrstvě a vyžadují dekomprimaci před parsováním. Minifikace zmenšuje velikost samotného dokumentu, takže XML zůstává platné a čitelné jakýmkoli parserem bez kroku dekomprimace. V praxi minifikace před kompresí přináší nejlepší výsledky: nejprve odstraníte nadbytečné znaky a kompresní algoritmus pak pracuje s kratším vstupem.
<?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>
Proč použít XML minifier?
Naformátované XML s odsazením a komentáři je ideální pro vývoj a revizi kódu. Pro ukládání, přenos a strojové zpracování toto formátování přidává bajty bez jakéhokoli přínosu. XML minifier tento rozdíl překlenuje.
Případy použití XML minifieru
Co minifikace XML odstraňuje
Ne vše v XML dokumentu lze bezpečně odstranit. Tato referenční tabulka zobrazuje každý typ odstranitelného obsahu a zda je jeho vypuštění vždy bezpečné nebo závisí na konkrétním případu použití.
| Položka | Příklad | Bezpečnost |
|---|---|---|
| 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 |
Minifikace vs Gzip vs binární formáty
Minifikace, komprese a binární kódování se zaměřují na různé vrstvy problému s velikostí. Minifikace zachovává výstup jako platné, člověkem čitelné XML. Komprese (gzip, Brotli) dále zmenšuje, ale před parsováním vyžaduje krok dekomprimace. Binární formáty jdou nejdál, ale obě strany připojení potřebují kompatibilní kodér/dekodér — praktické zejména pro vestavěné systémy nebo podnikové služby náročné na WSDL.
Ukázky kódu
Minifikace XML programově sleduje stejný vzor v každém jazyce: dokument se zpracuje do stromu, volitelně se odstraní uzly komentářů a poté se serializuje bez odsazení.
// 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"