Ferramenta de Formatação XML
O que é Formatação XML?
O formatador XML transforma XML compacto ou bagunçado em uma estrutura indentada e legível. XML aparece em arquivos de configuração, mensagens SOAP, sitemaps, feeds RSS, documentos de escritório, artefatos de build e muitas integrações corporativas antigas, onde uma tag de fechamento ausente ou um caractere mal escapado pode interromper o processamento. A ferramenta ajuda a enxergar elementos aninhados, atributos, nós de texto, namespaces e possíveis pontos de erro com mais rapidez do que ler uma linha comprimida. Ela é útil para depuração, documentação, comparação e ensino, mas não substitui validação por XSD, contrato de API ou formato exigido por parceiros.
Como usar
Como usar
- Cole ou insira dados XML na caixa de entrada à esquerda
- Selecione o tamanho da indentação (2 espaços, 4 espaços ou Tab)
- Clique em Format para embelezar ou Minify para remover espaços em branco
- Os resultados são exibidos à direita com destaque de sintaxe
- Clique em Copy ou Download para salvar o resultado
Notas sobre XML
- A formatação altera o espaçamento, não o significado do documento, mas o espaço em branco ainda pode ser relevante em nós de texto e documentos de conteúdo misto.
- Se a análise falhar, verifique tags não fechadas, aninhamento incorreto, atributos duplicados e caracteres sem escape, como o e comercial (&).
Casos de uso
` (um recurso SGML aceito pelo XML 1.0 §3.1) é preservada como está, então elementos vazios de HTML que circulam dentro de XHTML ou RSS devem manter a barra; usar `
` em vez disso alterará silenciosamente a página renderizada em parsers HTML5. Seções CDATA, incluindo a regra literal do terminador `]]>`, também são mantidas intactas em vez de serem convertidas em entidades `&`.
Princípio técnico
A formatação XML é fundamentada na recomendação W3C XML 1.0 (Quinta Edição). A análise ocorre por meio de `new DOMParser().parseFromString(src, 'application/xml')` (ou `text/xml`), que retorna um Document cujos nós correspondem às sete produções definidas na especificação: Element, Attr, Text, CDATASection, Comment, ProcessingInstruction e DocumentType. Ao contrário do HTML, os parsers XML são estritos: uma tag incompatível, um `&` não escapado ou um atributo duplicado aborta a análise e o DOMParser retorna um elemento `<parsererror>` cujo corpo contém a linha e a coluna. Equivalentes no lado do servidor incluem libxml2 (`xmllint --format`), `xml.etree.ElementTree` do Python, StAX/SAX do Java e `XmlReader` do .NET. O serializador percorre o DOM nó por nó: cada Element abre em sua própria linha com depth*indent espaços, os filhos recursam com depth+1, a tag de fechamento alinha com a tag de abertura e elementos vazios colapsam para a forma auto-fechante `<foo/>` que a seção §3.1 da especificação declara semanticamente equivalente a `<foo></foo>`. Cinco entidades predefinidas são sempre recodificadas em valores de texto e atributo: `&` `<` `>` `"` `'`. Seções CDATA (`<![CDATA[ ... ]]>`) são preservadas literalmente porque são a válvula de escape explícita para conteúdo que de outra forma precisaria de codificação de entidades; o terminador `]]>` não pode aparecer dentro de um bloco CDATA conforme §2.7, o que o parser impõe. Instruções de processamento como `<?xml-stylesheet?>` e a declaração XML `<?xml version="1.0" encoding="UTF-8"?>` são mantidas no prólogo do documento. A declaração DOCTYPE é preservada como uma única string. Duas sutilezas impulsionam a maior parte da complexidade do formatador. Primeiro, conteúdo misto — um elemento contendo tanto texto quanto elementos filhos, como `<p>Hello <b>world</b>!</p>` — não pode ser re-indentado sem alterar o infoset do documento, porque cada caractere de espaço em branco nesse contexto é um nó Text significativo. Os formatadores detectam conteúdo misto verificando se um Element possui algum filho Text que não seja espaço em branco e mudam para uma serialização em linha única para essa subárvore. Segundo, declarações de namespace (`xmlns`, `xmlns:prefix`) devem permanecer no elemento onde foram declaradas pela primeira vez; movê-las altera o escopo. A ordem dos atributos não é canônica conforme a especificação, então a maioria dos formatadores aplica ordenação alfabética enquanto preserva quaisquer declarações `xmlns:*` iniciais. A análise e a serialização são O(n) sobre o comprimento do documento; feeds muito grandes normalmente são processados via streaming com SAX em vez de construir um DOM na memória.
- Especificação: W3C XML 1.0 Quinta Edição (REC-xml-20081126); o DOM é construído via `DOMParser().parseFromString(src, 'application/xml')`, equivalente a libxml2 ou `xmllint --format` no lado do servidor.
- Estrito por design: tags incompatíveis, `&`/`<` não escapados, atributos duplicados ou caracteres inválidos acionam um elemento `<parsererror>`; a recuperação permissiva do HTML não se aplica.
- Cinco entidades predefinidas recodificadas em valores de texto e atributo: `&` `<` `>` `"` `'`. Referências numéricas de caracteres como ` ` são preservadas como estão.
- Auto-fechamento `<foo/>` e `<foo></foo>` são semanticamente idênticos conforme §3.1; seções CDATA são preservadas literalmente e não podem conter o terminador `]]>`.
- Conteúdo misto (texto + elementos filhos) não pode ser re-indentado sem alterar o infoset — o serializador detecta espaços em branco significativos e serializa essas subárvores em linha.
- Declarações de namespace (`xmlns`, `xmlns:prefix`) permanecem no elemento da primeira declaração; movê-las altera o escopo. A ordem dos atributos não é canônica, então uma ordenação estável (xmlns primeiro, depois alfabética) é o padrão.
- Complexidade: análise O(n) e serialização O(n) para ferramentas baseadas em DOM; documentos grandes são processados via streaming com SAX/StAX (xml.sax em Python, javax.xml.stream em Java) para evitar carregar a árvore completa na memória.
Exemplos
Elementos básicos
<!-- Entrada (uma linha) -->
<book><title>XML Guide</title><author>Jane Doe</author><year>2024</year></book>
<!-- Saída (2 espaços) -->
<book>
<title>XML Guide</title>
<author>Jane Doe</author>
<year>2024</year>
</book>Com atributos
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book id="b001" lang="en" available="true">
<title>Effective XML</title>
<price currency="USD">29.99</price>
</book>
</catalog>Estrutura aninhada com namespaces e CDATA
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns:GetUser xmlns:ns="https://example.com/api">
<ns:UserId>10086</ns:UserId>
<ns:Script>
<![CDATA[ if (a < b && b > 0) { return true; } ]]>
</ns:Script>
</ns:GetUser>
</soap:Body>
</soap:Envelope>Perguntas frequentes
O que ele faz?
Formata o XML de forma legível, indentando elementos aninhados, colocando cada elemento em sua própria linha e alinhando as tags de fechamento. Útil para inspecionar respostas SOAP, feeds RSS, arquivos de configuração e outros payloads XML que chegaram como uma linha gigante.
Ele valida contra um schema?
Não. Ele formata qualquer XML bem formado que você colar. A validação por schema (XSD, DTD, RELAX NG) precisa de uma ferramenta separada. Erros de boa formação (tags incompatíveis, fechamentos faltando) são reportados, mas a página não vai corrigi-los.
Ele preserva a ordem dos atributos?
Sim. Tecnicamente, a ordem dos atributos em XML não é significativa pela especificação, mas o formatador mantém a ordem original para evitar surpresas. Seções CDATA, comentários e instruções de processamento também são preservados.
Como os espaços em branco são tratados?
Os espaços entre elementos são normalizados (um elemento por linha com indentação). Os espaços dentro do conteúdo de texto são preservados por padrão — o conteúdo do elemento é significativo. Atributos xml:space='preserve' são respeitados onde existirem.
Posso minificar XML?
Algumas versões oferecem um modo de minificação que remove os espaços entre elementos. Tome cuidado: qualquer espaço em branco que era significativo (conteúdo de texto, regiões com xml:space='preserve') deve ser preservado. Teste o ida e volta se seu XML tiver conteúdo de texto rico.
O XML é enviado para o servidor?
Não. A análise e a formatação rodam no seu navegador usando DOMParser e XMLSerializer (nativos do navegador). Nada é transmitido.
E os namespaces XML?
Declarações de namespace (xmlns) e elementos/atributos com prefixo são formatados exatamente como foram escritos. A redeclaração do mesmo namespace em elementos aninhados é preservada (alguns validadores se importam, outros não).