XML Küçültücü
Boşlukları ve yorumları kaldırarak XML'yi küçültün
XML Girdisi
Küçültülmüş XML
XML Küçültme Nedir?
XML küçültme, bir XML belgesinin anlamını değiştirmeden gereksiz tüm karakterleri kaldırma işlemidir. Bir XML küçültücü, etiketler arasındaki boşlukları siler, yorumları kaldırır, satır sonlarını ortadan kaldırır ve girintileri daraltarak sıkışık, tek satırlık bir çıktı üretir. Sonuç, ayrıştırıcıların orijinal biçimli sürümle aynı şekilde okuduğu ve aynı veri modelini oluşturduğu bir XML dizesidir.
XML 1.0 spesifikasyonu (W3C Recommendation, Fifth Edition), boşluk işleme kurallarını 2.10. bölümde tanımlar. Etiketler arasında anlamsal değeri olmayan boşluklara "önemsiz boşluk" denir. XML işlemcilerinin bunları atmasına izin verilir. Metin içeriği içindeki boşluklar ise, üst öğe xml:space="default" bildirmediği sürece varsayılan olarak anlamlıdır. Doğru bir XML küçültücü bu iki durumu birbirinden ayırt eder ve yalnızca güvenli şekilde kaldırılabilecek olanları siler.
Küçültme, sıkıştırmadan farklıdır. Gzip veya Brotli, aktarım katmanında boyutu küçültür ve ayrıştırmadan önce sıkıştırmayı açma gerektirir. Küçültme ise ham belge boyutunu kendisini azaltır; bu nedenle XML geçerliliğini korur ve herhangi bir ayrıştırıcı tarafından bir sıkıştırma açma adımı gerekmeksizin okunabilir. Uygulamada, sıkıştırmadan önce küçültmek en iyi sonucu verir: önce gereksiz karakterler kaldırılır, ardından sıkıştırma algoritması daha sıkışık bir girdide çalışır.
<?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>
Neden XML Küçültücü Kullanmalısınız?
Girintili ve yorumlu biçimlendirilmiş XML, geliştirme ve kod incelemesi için idealdir. Depolama, iletim ve makine tüketimi için ise bu ekstra biçimlendirme hiçbir fayda sağlamadan bayt ekler. Bir XML küçültücü bu açığı kapatır.
XML Küçültücü Kullanım Senaryoları
XML Küçültmenin Kaldırdıkları
Bir XML belgesindeki her şey güvenli şekilde kaldırılamaz. Bu başvuru tablosu, kaldırılabilecek her içerik türünü ve atmanın her zaman mı yoksa kullanım durumunuza koşullu mu güvenli olduğunu gösterir.
| Öğe | Örnek | Güvenlik |
|---|---|---|
| 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 |
Küçültme, Gzip ve İkili Formatlar Karşılaştırması
Küçültme, sıkıştırma ve ikili kodlama, boyut sorununu farklı katmanlarda ele alır. Küçültme, çıktıyı geçerli, insan tarafından okunabilir XML olarak tutar. Sıkıştırma (gzip, Brotli) daha fazla küçültür ancak ayrıştırmadan önce bir sıkıştırma açma adımı gerektirir. İkili formatlar en ileriye gider; ancak bağlantının her iki ucunun da uyumlu bir kodlayıcı/çözücüye ihtiyacı vardır — ağırlıklı olarak gömülü sistemler veya WSDL'ye dayalı kurumsal hizmetler için pratiktir.
Kod Örnekleri
XML'yi programatik olarak küçültmek her dilde aynı örüntüyü izler: belgeyi bir ağaca ayrıştırın, isteğe bağlı olarak yorum düğümlerini kaldırın, ardından girintisiz serileştirin.
// 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"