Minificador de XML
Minifique XML removendo espaços em branco e comentários
Entrada XML
XML Minificado
O que é Minificação de XML?
A minificação de XML é o processo de remover todos os caracteres desnecessários de um documento XML sem alterar seu significado. Um minificador de XML elimina espaços em branco entre as tags, remove comentários, suprime quebras de linha e colapsa a indentação para produzir uma saída compacta em uma única linha. O resultado é uma string XML que os parsers leem de forma idêntica à versão formatada original, produzindo o mesmo modelo de dados.
A especificação XML 1.0 (Recomendação W3C, Quinta Edição) define as regras de tratamento de espaço em branco na seção 2.10. O espaço em branco entre tags sem valor semântico é chamado de "espaço em branco insignificante". Processadores XML têm permissão de descartá-lo. O espaço em branco dentro do conteúdo textual, no entanto, é significativo por padrão, a menos que o elemento pai declare xml:space="default". Um minificador correto distingue esses dois casos e remove apenas o que é seguro remover.
A minificação difere da compressão. Gzip ou Brotli reduzem o tamanho na camada de transporte e exigem descompressão antes da análise. A minificação reduz o tamanho bruto do documento em si, de modo que o XML permanece válido e legível por qualquer parser sem etapa de descompressão. Na prática, minificar antes de comprimir produz os melhores resultados: você elimina os caracteres redundantes primeiro e, em seguida, o algoritmo de compressão trabalha sobre uma entrada mais enxuta.
<?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>
Por que Usar um Minificador de XML?
O XML formatado com indentação e comentários é ideal para desenvolvimento e revisão de código. Para armazenamento, transmissão e consumo por máquinas, essa formatação extra adiciona bytes sem nenhum benefício. Um minificador de XML elimina essa diferença.
Casos de Uso do Minificador de XML
O que a Minificação de XML Remove
Nem tudo em um documento XML pode ser removido com segurança. Esta tabela de referência mostra cada tipo de conteúdo removível e se descartá-lo é sempre seguro ou condicional ao seu caso de uso.
| Item | Exemplo | Segurança |
|---|---|---|
| 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 |
Minificação vs Gzip vs Formatos Binários
Minificação, compressão e codificação binária visam camadas diferentes do problema de tamanho. A minificação mantém a saída como XML válido e legível. A compressão (gzip, Brotli) reduz ainda mais, mas exige uma etapa de descompressão antes do parse. Os formatos binários vão mais longe, mas ambos os lados da conexão precisam de um codificador/decodificador compatível — prático principalmente para sistemas embarcados ou serviços corporativos com uso intenso de WSDL.
Exemplos de Código
Minificar XML programaticamente segue o mesmo padrão em todas as linguagens: analise o documento em uma árvore, remova opcionalmente os nós de comentário e serialize sem indentação.
// 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"