# Formatador de XML — organize, esprema ou converta em JSON

XML organizado para ler ou espremido para publicar, e convertido em JSON nos dois sentidos. Nada disso é colado no servidor de outra pessoa.

> Formate, indente e comprima XML, e converta XML para JSON ou JSON para XML. O analisador roda no seu navegador e nada é enviado, então um feed, uma nota fiscal ou um arquivo de configuração nunca sai do seu computador.

Esta é uma ferramenta interativa de navegador em https://abox.tools/pt/formatar-xml/. Os arquivos são processados no dispositivo que executa esse navegador. Compartilhamento deliberado e funções opcionais de rede são explicados na página. A seguir está sua explicação escrita; abra o endereço para usá-la.

## Seus arquivos XML e JSON são **processados no navegador**. Sem envio para processamento.

Formatar e converter são aritmética sobre um texto, feita aqui, nesta página. O analisador é escrito à mão e está em `src/shared/parse-xml.js`, e não há mais nada. Esta ferramenta não tem função de rede de espécie alguma — nada para buscar, nada para enviar — e isso pesa aqui mais do que a palavra “XML” sugere: o que chega neste formato costuma ser uma nota fiscal, um extrato bancário, um prontuário, ou uma requisição SOAP com as credenciais de alguém no cabeçalho.

- ✗ Sem envio
- ✗ Sem conta
- ✗ Sem limite de tamanho
- ✓ Funciona offline
- ✓ Código aberto

## Como formatar XML sem enviar o arquivo

1. **Escolha o trabalho.** Duas abas, uma caixa: *Formatar* organiza o XML ou esprema; *Converter* transforma em JSON, ou o JSON de volta em XML. O XML que você acabou de organizar é o XML que você converte, sem colar duas vezes.
2. **Cole, ou arraste o arquivo.** Qualquer coisa que você consiga selecionar e copiar serve, e um arquivo `.xml`, `.svg`, `.rss` ou `.xsd` arrastado para o seletor é lido pelo seu próprio navegador e colocado na caixa — não existe etapa de envio para pular.
3. **Escolha a indentação, ou esprema.** Dois espaços, quatro, ou uma tabulação. Espremer é o mesmo documento sem nenhum dos espaços que só estavam ali para leitura, e o resultado diz quantos bytes isso economizou.
4. **Leia o erro onde o erro está.** Um analisador que falha aqui diz *qual tag* nunca foi fechada e em que linha e coluna, em vez de “erro na linha 1”, que é o que um navegador diz de um documento que leu de uma vez só. Clique em *Ir para o erro* para voltar a essa posição no texto. Ao digitar, o foco fica onde está até você decidir movê-lo.
5. **Leve o resultado.** Copie, ou baixe como arquivo, com o nome do formato em que ele saiu.

## A versão longa

[Como formatar e conferir XML](https://abox.tools/pt/guides/format-and-check-xml/): Formate, minifique e confira XML localmente. Siga erros e entenda a conversão de atributos, texto e arrays antes de passar para JSON.

## Também na caixa

- [Comparador de textos](https://abox.tools/pt/comparar-textos/): Dois textos entram, cada diferença sai marcada, linha a linha e palavra por palavra. Nada é colado no servidor de ninguém.
- [Codificador e decodificador Base64](https://abox.tools/pt/codificar-base64/): Base64, codificação percentual, entidades HTML, hexadecimal e escapes com barra invertida, nos dois sentidos. Nada é colado no servidor de ninguém.
- [Compartilhar texto e arquivos](https://abox.tools/pt/compartilhar-texto/): O compartilhamento vive nesta aba aberta. Os leitores o recebem criptografado, direto do seu navegador, e fechar a aba o encerra - nenhum servidor guarda nada.
- [Gerador de QR Code e código de barras](https://abox.tools/pt/gerar-qr-code/): Digite, e vira um código. Nada é enviado para fazer um.

## Perguntas

### Meu XML é enviado para algum lugar?

Não. O analisador e o impressor desta página são funções que rodam no seu próprio navegador, no seu próprio hardware. Esta ferramenta não tem função de rede de espécie alguma — nunca busca nada e nunca envia nada — e a `Content-Security-Policy` da página lista todos os endereços que ela pode contatar, e nenhum deles é nosso. Isso importa mais para XML do que a fama do formato sugere: o que chega nele costuma ser uma nota fiscal, um extrato bancário, um prontuário, ou uma requisição SOAP com credenciais no cabeçalho.

### Ele resolve entidades externas?

Não, e não há nada para desligar. Resolver entidades externas é o jeito de convencer um analisador de XML a ler arquivos do computador que o executa — o ataque que costuma ser escrito XXE — e `src/shared/parse-xml.js` é um leitor escrito à mão sem resolução de entidades nenhuma. O seu texto também nunca é entregue ao `DOMParser` do próprio navegador. Um `DOCTYPE` passa adiante sem nunca ser executado.

### O que se perde ao converter XML para JSON?

A ordem do conteúdo misto, os comentários, e a diferença entre um atributo e um elemento filho — essa última suavizada em vez de apagada, porque um atributo vira um membro cujo nome começa com `@`. O texto próprio de um elemento vira `#text` quando precisa ficar ao lado de outra coisa, e filhos repetidos viram um array. Todo valor continua sendo texto: XML não tem tipos, e decidir que `8080` era um número seria inventar informação.

### O que se perde ao converter JSON para XML?

A diferença entre um objeto vazio, um array vazio e um texto vazio, que viram todos os três um elemento vazio, e o tipo de cada valor, porque XML não tem tipos. Um array vira um elemento repetido, que é a única forma que se lê de volta, e uma chave que um nome de elemento não aguenta tem os caracteres complicados substituídos em vez de sair um documento que nenhum analisador vai ler.

### Ele formata um SVG, um feed RSS ou um arquivo POM?

Formata. Os três são XML, e isto lê XML em vez de algum dialeto específico. Um SVG organizado assim fica mais fácil de editar à mão; um feed RSS ou Atom normalmente é publicado espremido e fica ilegível até alguma coisa abrir. O jeito como fica disposto não muda nada do que o documento significa.

### Reindentar o XML muda o que ele significa?

Para um documento cujos elementos contêm outros elementos, não. Onde pode importar é no texto: o espaço em branco dentro de um elemento que contém palavras faz parte desse texto, então um elemento que só contém texto é deixado numa linha em vez de ser aberto. As seções `CDATA` são copiadas exatamente como estavam.

### Por que não usar o analisador de XML do próprio navegador?

Por causa do que ele diz quando o documento está quebrado. O `DOMParser` devolve um documento de erro cuja redação é diferente em cada navegador e muitas vezes se resume a “erro na linha 1”. Um leitor escrito à mão consegue dizer qual tag nunca foi fechada, e onde ela foi aberta, que é justamente o que você precisava saber. Não resolver entidades externas é o outro motivo.

### De que tamanho pode ser o arquivo?

Não há limite nenhum posto aqui, porque não há servidor pagando por um. O teto de verdade é o seu próprio computador: alguns megabytes de XML vão bem, e num documento muito longo a página espera uma pausa na sua digitação antes de reformatar, em vez de disputar o teclado com você.

### É grátis, e preciso de conta?

É grátis, e não tem conta, nem login, nem período de teste, nem limite de quanto você cola. O site exibe publicidade, e é ela que paga a conta; os anúncios não recebem nada sobre o seu texto.

### Funciona offline?

Funciona. Carregue a página uma vez, desligue a internet e ela continua funcionando. Esse é também o jeito mais simples de provar que nada é enviado: uma ferramenta que mandasse o seu XML embora para formatar pararia no instante em que você desconectasse.

## Como dá para conferir a promessa de privacidade

- **O processamento acontece neste navegador.** A ferramenta processa entradas e resultados no navegador. Seu código não os envia para processamento. Content-Security-Policy limita recursos e destinos, mas hosts permitidos podem receber solicitações: ela não inspeciona o conteúdo nem prova sozinha que nada é enviado. Compare código e solicitações da operação ou conclua a operação local desconectado.
- **Nada aqui busca coisa alguma.** Não há nenhum `fetch`, nenhum `XMLHttpRequest` e nenhum `sendBeacon` em lugar algum de `src/`. O analisador e o impressor são funções desta página que recebem um texto e devolvem um texto.
- **Nenhuma entidade externa é resolvida, nunca.** Um `DOCTYPE` com uma entidade externa dentro é o jeito de convencer um analisador de XML a ler um arquivo do computador que está analisando, e é o buraco mais antigo do formato. `src/shared/parse-xml.js` é um leitor escrito à mão que não tem resolução de entidades nenhuma — não desligada, ausente — e esta página nunca entrega o seu texto ao `DOMParser` do próprio navegador.
- **Todo valor que sai do XML é texto.** `<port>8080</port>` não diz nada sobre aquilo ser um número, então o JSON diz `"8080"`. Decidir por você seria inventar uma informação que depois viaja como se estivesse no arquivo.
- **O que o Google carrega, e o que não chega até ele.** Os scripts de publicidade e de medição vêm do Google, e o botão de doação vem do Buy Me a Coffee. Nenhum deles recebe um caractere do seu texto. Toda linha que lê, analisa ou escreve é servida desta origem e está listada no repositório.
- **Funciona offline.** Desligue a rede e a ferramenta continua igual, porque nunca houve uma etapa de rede nela. Essa é a prova mais simples de todas.

**Confira você mesmo.** Nada do que está acima precisa ser aceito na fé. Esta página é gerada a partir dos modelos e da configuração do repositório por um script de compilação que você pode ler e rodar por conta própria, e o resultado vai para a branch `dist`. Ou seja, dá para comparar o que é servido com o que uma compilação das fontes produz: https://github.com/A-Box-of-Tools/website

Os primeiros arquivos que valem a leitura são `config/site.toml` para a Content-Security-Policy, `src/shared/parse-xml.js` para o analisador que diz qual tag nunca foi fechada, e `src/convert.js` para entender por que todo valor sai do XML como texto em vez de ser adivinhado.
