Formatar XML
O Formatador de XML reidenta um documento XML no seu navegador usando um tokenizador de passada única, então comentários, seções CDATA, subconjuntos DOCTYPE e valores de atributo que contêm colchetes angulares sobrevivem intactos. Ele relata tags mal emparelhadas ou não fechadas com linha e coluna, em vez de remodelar a árvore em silêncio.
Como funciona o Formatar XML?
A maioria dos formatadores de XML é uma série de expressões regulares: tirar os comentários, depois dividir nas tags, depois reidentar. Essa ordem não pode ser tornada correta, porque as passadas dependem umas das outras em círculo. Decidir se <!-- abre um comentário exige saber se você está dentro de uma seção CDATA. Decidir onde uma seção CDATA começa exige saber que você não está dentro de um comentário. Decidir se > encerra uma tag exige saber se você está dentro de um valor de atributo. Escolha a ordem que escolher, uma das três estará errada, e a falha é corrupção silenciosa, não um erro.
Por isso este formatador varre o documento exatamente uma vez, produzindo um fluxo de tokens — declaração, instrução de processamento, DOCTYPE, comentário, CDATA, tag de abertura, tag de fechamento, tag autofechável, texto — e tudo o que vem depois é apenas um fold sobre esses tokens. O tokenizador é sem perdas por construção: cada byte da entrada cai em exatamente um token, e há um teste afirmando que concatená-los reproduz o documento original byte a byte.
É esse desenho que faz os casos espinhosos funcionarem sem precisar de tratamento especial. Um DOCTYPE com subconjunto interno pode conter > dentro de si, então a varredura acompanha a profundidade de colchetes em vez de pegar o primeiro sinal de fechamento. Um valor de atributo pode conter >, então a varredura de tags acompanha as aspas. Um < solto que não é o início de uma tag — XML inválido, ubíquo em arquivos escritos à mão — atravessa como texto, em vez de abortar uma formatação que o autor vê que deveria dar certo.
A indentação mantém uma exceção deliberada: um elemento cujo único filho é texto fica em uma linha só, então você obtém <name>Ada</name> em vez de três linhas para duas palavras. Explodir toda folha é a principal razão de o XML formatado por máquina ser mais difícil de ler do que o escrito à mão.
Quando a árvore não fecha direito, o formatador para e diz onde. Um </c> destoante onde se esperava </b> é relatado com linha e coluna; um documento que termina no meio da árvore nomeia os elementos ainda abertos. A alternativa — fechar as tags por você em silêncio — produz um documento que parece correto e não é o que você tinha, que é o pior desfecho possível.
Entrada minificada
<r><a id="1"><b>x</b></a><!-- c --><d/></r>
Saída formatada
<r>
<a id="1">
<b>x</b>
</a>
<!-- c -->
<d />
</r>Quais opções e casos-limite o Formatar XML suporta?
| Parâmetro | Tipo | Padrão | Comportamento e casos-limite |
|---|---|---|---|
| Recuo | 2 | 4 | tab | 2 espaços | Aplicado por nível de aninhamento. Tabs são a escolha certa quando o arquivo será lido em editores com preferências diferentes, já que cada leitor controla a largura visual. |
| Recolher espaços | booleano | true | Normaliza sequências de espaços e quebras de linha dentro de nós de texto. Desative em documentos cujo conteúdo de texto depende dos espaços em branco, como código-fonte embutido fora de uma seção CDATA. |
| Remover comentários | booleano | false | Remove <!-- … --> por completo. Os comentários são mantidos por padrão porque, em arquivos de configuração, muitas vezes são a única documentação que existe. |
| Quebrar atributos | inteiro | 0 (nunca) | Acima desse número, cada atributo vai para sua própria linha. Útil para SVG e XSLT, em que um único elemento pode carregar uma dúzia de atributos e uma linha sem quebra some da tela. |
| CDATA | preservado | — | Reproduzido literalmente, incluindo espaços internos e qualquer caractere que pareça marcação. A essência de uma seção CDATA é justamente que seu conteúdo não é interpretado. |
| DOCTYPE | preservado | — | Mantido intacto, incluindo um subconjunto interno que contenha caracteres >. Procurar até o primeiro > trunca a declaração e transforma o resto em texto. |
| Namespaces | preservados | — | Prefixos e declarações xmlns passam sem alteração. Isto é um formatador, não um validador: não confere se um prefixo está declarado. |
| Entrada malformada | erro | — | Uma tag de fechamento sem par, um comentário ou CDATA não terminado, ou um documento que acaba no meio da árvore são relatados com posição. Nada é corrigido automaticamente, porque um documento reparado em silêncio não é mais aquele que você tinha. |
Perguntas frequentes
Formatar vai mudar o que o meu XML significa?
Pode, de um jeito específico: espaço em branco dentro do conteúdo de texto é dado em XML, e comprimi-lo muda esse dado. É por isso que Collapse whitespace é um interruptor, e não algo sempre ativo — desligue-o para documentos em que o texto é sensível a espaços em branco. Todo o resto é preservado exatamente, incluindo conteúdo de CDATA, comentários, valores de atributo e o DOCTYPE.
Por que ele recusa o meu documento em vez de consertá-lo?
Porque adivinhar qual tag você quis fechar não é algo que um formatador possa fazer com segurança. Diante de <a><b></a>, fechar o <b> por você produz um documento que parece correto e tem uma árvore diferente da que você escreveu. O erro nomeia a tag e a posição para que você decida, o que leva segundos e não pode sair errado.
Ele lida com SVG, XSLT, RSS, SOAP e layouts Android?
Sim — todos são XML, e nada aqui depende de esquema. SVG e XSLT em particular se beneficiam da opção de quebra de atributos em várias linhas, já que um único elemento com uma dúzia de atributos é comum e, sem a quebra, ele vai muito além da borda da tela.
E quanto ao HTML?
Apenas HTML com forma de XHTML. O HTML de verdade tem elementos void que nunca fecham (<br>, <img>), tags de fechamento opcionais (<li>, <td>) e elementos de texto puro como <script>, cujo conteúdo não é marcação. Este tokenizador prende o documento às regras do XML, então vai relatar um <br> não fechado como erro. Isso está correto para XML e errado para HTML.
Existe um limite de tamanho?
8 MB. A formatação roda na thread principal, então acima desse teto a ferramenta recusa em vez de travar a aba. Tanto a tokenização quanto a formatação são iterativas, e não recursivas, então um documento profundamente aninhado — há um teste com cinco mil níveis — devolve um resultado em vez de estourar a pilha de chamadas.
Meu documento é enviado?
Não. Ele é tokenizado e reidentado por JavaScript na aba que você já tem aberta. Abra o painel Network e cole um: nada que o contenha sai. Arquivos de configuração XML rotineiramente contêm strings de conexão, nomes de host internos e credenciais — exatamente o material que não deveria passar por um servidor desconhecido para ser reformatado.