Formatar e indentar XML

formata código XML de maneira estruturada e legível, essencial para a leitura das suas trocas de dados

Porquê formatar XML?

A formatação XML (também chamada formatação XML, indentação XML ou pretty print) consiste em reorganizar um documento XML compacto ou minificado numa estrutura indentada, legível linha a linha. Um XML bem formatado melhora a legibilidade humana, o que é indispensável quando se tem de ler uma resposta SOAP, percorrer um feed RSS ou inspecionar o conteúdo de um ficheiro de configuração.

Concretamente, formata-se XML por quatro razões principais:

  • Debug: detetar rapidamente uma tag não fechada, um atributo em falta ou uma estrutura incoerente.
  • Integração manual: copiar de forma limpa um fragmento para um ficheiro de configuração sem partir a indentação existente.
  • Code review: comparar duas versões de um documento XML num diff do Git torna-se legível quando cada tag está na sua própria linha.
  • Documentação e exemplos: um XML formatado é muito mais pedagógico numa documentação técnica ou num README.

Casos de uso típicos

O XML continua omnipresente no ecossistema de software. Eis os formatos em que os programadores mais frequentemente utilizam um formatador XML:

  • Respostas SOAP: os envelopes <soap:Envelope> devolvidos por web services SOAP chegam geralmente minificados.
  • Feeds RSS e Atom: para inspecionar ou auditar um feed de sindicação.
  • Configurações Spring, Maven (pom.xml), Ant, Ivy: ficheiros de build e dependências Java.
  • AndroidManifest.xml e outros recursos XML de um projeto Android.
  • Ficheiros SVG: um gráfico vetorial exportado a partir de um software de design vem muitas vezes comprimido numa única linha.
  • Exportações de e-commerce: feeds de produtos Google Shopping, exportações Magento, Shopify ou PrestaShop.
  • Documentos OOXML: os ficheiros .docx, .xlsx e .pptx são arquivos ZIP que contêm ficheiros XML frequentemente necessários de inspecionar.
  • Sitemaps XML: os sitemap.xml servidos aos motores de busca.

Como funciona a formatação XML

Um formatador XML não se limita a acrescentar espaços ao acaso. Efetua duas etapas:

  1. Parsing: o documento é lido e depois transformado em árvore DOM (Document Object Model). Esta etapa valida também que o XML é bem formado (tags corretamente encadeadas, atributos entre aspas, um único elemento raiz).
  2. Serialização indentada: a árvore DOM é re-emitida sob forma de texto com quebras de linha entre elementos e uma indentação proporcional à profundidade na árvore.

Esta abordagem por árvore garante que a estrutura lógica do documento se mantém estritamente idêntica: apenas os espaços não significativos entre tags são modificados. As secções CDATA, os comentários e as instruções de processamento são preservados. As transformações mais avançadas (XSLT) ou as queries (XPath) operam, aliás, sobre esta mesma árvore DOM.

Como utilizar o formatador XML

O procedimento é voluntariamente simples:

  1. Cole o seu documento XML na área de texto, ou carregue um ficheiro .xml.
  2. Valide o formulário: o documento é analisado e indentado automaticamente.
  3. O resultado formatado aparece na área de saída. Em caso de erro de parsing, uma mensagem indica a natureza e a posição aproximada do problema.
  4. Copie o resultado com o botão dedicado, ou descarregue-o para o integrar diretamente no seu projeto.

Boas práticas de indentação XML

Algumas convenções a respeitar para produzir um XML limpo e duradouro:

  • Indentação: 2 ou 4 espaços consoante a convenção da sua equipa. Mantenha-se coerente em todo o projeto.
  • Quebras de linha: um elemento por linha, o que torna os diffs do Git utilizáveis.
  • Secções CDATA: um bom formatador conserva integralmente os blocos <![CDATA[ ... ]]> sem reindentar o seu conteúdo, que é tratado como texto bruto.
  • Codificação: declare sempre a codificação na primeira linha com <?xml version="1.0" encoding="UTF-8"?>. UTF-8 é o padrão de facto.
  • Atributos: se um elemento tem muitos atributos, algumas equipas passam-nos para linha separada para legibilidade; caso contrário ficam na mesma linha que a tag de abertura.
  • Comentários: <!-- ... --> devem ser conservados tal como estão pelo formatador.

Exemplo antes / depois

Eis um exemplo concreto de um XML compacto embelezado pelo formatador.

Antes (uma única linha, ilegível):

<root><item id="1">val</item><item id="2">val2</item></root>

Depois (formatado com 2 espaços):

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <item id="1">val</item>
  <item id="2">val2</item>
</root>

A estrutura lógica é estritamente idêntica: só a disposição visual muda.

Exemplo completo

Um documento XML mais volumoso depois da formatação tem este aspeto:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <user id="12345">
    <name>John Doe</name>
    <email>johndoe@example.com</email>
    <address>
      <street>123 Main St</street>
      <city>Springfield</city>
      <state>IL</state>
      <postalCode>62704</postalCode>
      <country>USA</country>
    </address>
    <phoneNumbers>
      <phoneNumber type="home">555-1234</phoneNumber>
      <phoneNumber type="work">555-5678</phoneNumber>
    </phoneNumbers>
    <preferences>
      <newsletter>true</newsletter>
      <theme>dark</theme>
    </preferences>
    <lastLogin>2024-06-14T09:30:00Z</lastLogin>
  </user>
</root>

Perguntas frequentes

O que é um XML bem formado?

Um XML diz-se bem formado (well-formed) quando respeita as regras sintáticas básicas: um único elemento raiz, tags corretamente encadeadas e fechadas, atributos entre aspas, caracteres especiais escapados (&amp;, &lt;, &gt;). É um pré-requisito para poder fazer o parse do documento. Não confundir com um XML válido, que para além disso respeita um esquema XSD ou uma DTD.

Qual a diferença entre formatação (pretty print) e minificação XML?

O pretty print acrescenta quebras de linha e indentação para a leitura humana. A minificação faz o inverso: remove todos os espaços não significativos para reduzir o tamanho do documento, o que é útil para o trânsito de rede (respostas SOAP, API XML). Os dois documentos são semanticamente equivalentes.

Os comentários e secções CDATA são preservados durante a formatação?

Sim. Um formatador correto preserva os comentários <!-- ... -->, as secções <![CDATA[ ... ]]> e as instruções de processamento (<? ... ?>). O conteúdo de um CDATA permanece intacto sem reindentação, uma vez que é tratado como texto bruto. Verifique o resultado se os seus comentários tiverem importância documental.

Os namespaces XML (xmlns) são geridos?

Sim. As declarações de namespace (xmlns:soap="...") e os prefixos associados (<soap:Envelope>) são preservados tal como estão. O formatador não renomeia os prefixos e não desloca as declarações na árvore, o que garante que a semântica do documento se mantém idêntica. Os namespaces por defeito (sem prefixo) também são mantidos no seu nível de declaração.

Devo indentar com espaços ou tabulações?

Ambas funcionam, mas os espaços são a convenção dominante porque se apresentam de forma idêntica em todo o lado (terminais, navegadores, diff Git). 2 ou 4 espaços conforme a verbosidade do seu XML: 2 para documentos muito encadeados (SVG, configurações Spring), 4 para documentos planos. O essencial é a coerência em todo o projeto.

O formatador modifica a semântica do documento?

Não. Apenas os espaços em branco entre tags são ajustados. A estrutura DOM, os valores dos atributos e o conteúdo textual dos elementos permanecem idênticos. Uma exceção: o conteúdo textual significativo (com xml:space="preserve") deve ser conservado tal como está, verifique este aspeto se os seus dados contiverem espaços portadores de sentido.

É possível validar um XML ao mesmo tempo que se formata?

O formatador já efetua uma validação sintática (XML bem formado) uma vez que tem de fazer parse do documento. Para uma validação contra um esquema XSD ou uma DTD, é preciso uma ferramenta dedicada: a validação estrutural ultrapassa o âmbito de um simples formatador. xmllint --schema ou xerces servem para esta etapa adicional.

Exemplo de pedido

curl -X POST https://cdrn.fr/api/v1/tools/xml-formatter/execute \
  -H "Content-Type: application/json" \
  -d '{"input":"..."}'

Esquema de entrada

Campo Tipo Obrigatório Predefinição
input text

Pontos de acesso

  • GET https://cdrn.fr/api/v1/tools - lista todas as ferramentas disponíveis
  • GET https://cdrn.fr/api/v1/tools/xml-formatter - obtém o esquema desta ferramenta
  • POST https://cdrn.fr/api/v1/tools/xml-formatter/execute - executa esta ferramenta com um payload JSON