XML Minifier
Minifikasi XML dengan menghapus spasi dan komentar
Input XML
XML yang Diminifikasi
Apa itu Minifikasi XML?
Minifikasi XML adalah proses menghapus semua karakter yang tidak diperlukan dari dokumen XML tanpa mengubah maknanya. Sebuah XML minifier menghapus spasi di antara tag, menghapus komentar, menghilangkan jeda baris, dan meratakan indentasi untuk menghasilkan output yang ringkas dalam satu baris. Hasilnya adalah string XML yang dibaca oleh parser secara identik dengan versi berformat aslinya, menghasilkan model data yang sama.
Spesifikasi XML 1.0 (Rekomendasi W3C, Edisi Kelima) mendefinisikan aturan penanganan spasi di bagian 2.10. Spasi di antara tag yang tidak memiliki nilai semantik disebut "spasi tidak signifikan." Prosesor XML diperbolehkan untuk membuangnya. Namun, spasi di dalam konten teks bersifat signifikan secara default kecuali elemen induk mendeklarasikan xml:space="default". Sebuah XML minifier yang benar membedakan kedua kasus ini dan hanya menghapus apa yang aman untuk dihapus.
Minifikasi berbeda dari kompresi. Gzip atau Brotli mengurangi ukuran di lapisan transport dan memerlukan dekompresi sebelum parsing. Minifikasi mengurangi ukuran dokumen mentah itu sendiri, sehingga XML tetap valid dan dapat dibaca oleh parser mana pun tanpa langkah dekompresi. Dalam praktiknya, minifikasi sebelum kompresi menghasilkan hasil terbaik: Anda menghilangkan karakter redundan terlebih dahulu, kemudian algoritma kompresi bekerja pada input yang lebih padat.
<?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>
Mengapa Menggunakan XML Minifier?
XML berformat dengan indentasi dan komentar sangat ideal untuk pengembangan dan tinjauan kode. Untuk penyimpanan, transmisi, dan konsumsi oleh mesin, format tambahan tersebut hanya menambah byte tanpa manfaat. Sebuah XML minifier menutup kesenjangan itu.
Kasus Penggunaan XML Minifier
Apa yang Dihapus oleh Minifikasi XML
Tidak semua yang ada dalam dokumen XML dapat dihapus dengan aman. Tabel referensi ini menunjukkan setiap jenis konten yang dapat dihapus dan apakah membuangnya selalu aman atau bergantung pada kasus penggunaan Anda.
| Item | Contoh | Keamanan |
|---|---|---|
| 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 |
Minifikasi vs Gzip vs Format Biner
Minifikasi, kompresi, dan pengodean biner masing-masing menargetkan lapisan masalah ukuran yang berbeda. Minifikasi menjaga output sebagai XML yang valid dan dapat dibaca manusia. Kompresi (gzip, Brotli) mengecilkan lebih jauh tetapi memerlukan langkah dekompresi sebelum parsing. Format biner mengecilkan paling jauh, tetapi kedua ujung koneksi memerlukan encoder/decoder yang kompatibel — praktis terutama untuk sistem tertanam atau layanan enterprise berbasis WSDL.
Contoh Kode
Minifikasi XML secara terprogram mengikuti pola yang sama di setiap bahasa: urai dokumen ke dalam pohon, secara opsional hapus node komentar, lalu serialisasi tanpa indentasi.
// 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"