CSV para XML
Este conversor transforma linhas CSV em elementos XML no seu navegador: um elemento raiz <records>, um elemento <record> por linha e uma tag filha por cabeçalho. Nomes de tags são sanitizados para XML válido, o texto é escapado e cabeçalhos com pontos são aninhados em elementos filhos. Nada é enviado.
CSV para XML: explicação
XML é mais rigoroso que CSV quanto aos nomes, e essa rigidez é o problema de engenharia aqui. Um cabeçalho como unit price não pode se tornar uma tag porque nomes de elementos não podem conter espaços; 2fa não pode se tornar uma tag porque nomes não podem começar com um dígito. Este conversor aplica o remédio padrão — caracteres inválidos se tornam underscores e um nome que começaria com dígito ganha um underscore inicial — para que cada cabeçalho produza uma tag que um parser XML real aceite, e o mapeamento da coluna para o elemento permanece visível em vez de mágico.
O lado do CSV é parseado de acordo com a RFC 4180: uma máquina de estados que respeita aspas duplas, vírgulas e novaslinhas dentro de campos entre aspas, detecção de delimitadores entre vírgula, ponto e vírgula, tabulação e pipe, e a mesma política de tipo restritiva que o site usa em todo lugar — valores se tornam números apenas sob a gramática de número do JSON, então 02134 mantém seu zero à esquerda. Cabeçalhos com pontos mantêm sua estrutura: address.city se torna um elemento address com um filho city, não uma tag plana com um ponto no nome.
Tudo é executado nesta aba do navegador. O CSV é parseado por um motor na página e o XML é construído a partir dos registros parseados; nada toca a rede — abra o DevTools, veja o painel de Rede ficar silencioso e a afirmação de privacidade se autoverifica.
Verificar a viagem de ida e volta é só um colar, porque o Conversor de XML para CSV lê essas mesmas convenções ao contrário, linhas de volta para fora dos elementos.
Se a escolha do formato de saída ainda estiver em aberto, o Comparação JSON vs XML explica onde a marcação se justifica e onde é sobrecarga.
Como a conversão realmente funciona
O pipeline é parsear, expandir, sanitizar, escapar — nessa ordem, e cada estágio só vê a saída do anterior. Essa ordem é por que uma vírgula dentro de uma célula entre aspas nunca perturba a estrutura do elemento: a grade é resolvida antes de qualquer XML existir, e o escritor de XML nunca toma decisões sobre sintaxe de CSV.
- Parsear: regras RFC 4180 com as permissões do mundo real — uma aspa no meio de um campo nu é levada literalmente, e linhas vazias no final são descartadas.
- Expandir: cabeçalhos são decodificados como caminhos, então address.city aninha city dentro de address, e tags[0], tags[1] se tornam elementos repetidos.
- Sanitizar: cada nome de elemento é verificado contra as regras de nome XML 1.0 — letras, dígitos, underscores, hífens, pontos e dois-pontos — e reparado onde falhar.
- Escapar: o conteúdo de texto recebe &, < e > onde a fonte tinha &, < ou >, e valores de atributo adicionalmente escapam as aspas duplas.
A política de nomes de tag, precisamente
XML 1.0 permite que um nome comece com uma letra, underscore ou dois-pontos, e permite que ele continue com dígitos, hífens e pontos; tudo o mais é inválido. O sanitizador substitui cada caractere fora desse conjunto por um underscore e prefixa um underscore quando o primeiro caractere sobrevivente seria um dígito — então unit price se torna unit_price, 2fa se torna _2fa, e uma coluna chamada discount% se torna discount_. Nomes válidos passam intocados, incluindo CamelCase e kebab-case, porque reescrever um nome que já era legal quebraria consumidores que o esperam.
| Cabeçalho CSV | Elemento emitido | Por quê |
|---|---|---|
| name | <name> | já um nome XML legal — passou sem alterações |
| unit price | <unit_price> | espaço substituído por underscore |
| 2fa | <_2fa> | nomes não podem começar com dígito |
| address.city | <address><city> | cabeçalhos com pontos são aninhados, não achatados |
O que acontece com os valores
XML não tem tipo número ou booleano separado — todo valor é texto — então células cruzam como seus caracteres exatos, sem coerção para perder ou inventar precisão. Uma célula vazia é tratada como campo ausente em vez de valor vazio, então o elemento é omitido em vez de emitir uma tag autofechada de string que ninguém consome. O escape é aplicado na saída: uma célula contendo A & B se torna A & B no documento, e qualquer parser XML lendo o resultado vê o texto original novamente.
- 02134 fica 02134; nenhum zero à esquerda é cortado, porque o valor é texto desde que deixa a grade.
- Uma célula com múltiplas linhas mantém suas quebras de linha dentro do elemento, e essas quebras são dados, não formatação.
- O elemento <record> é o mesmo para cada linha, irregular ou não — colunas que uma linha simplesmente não possui não produzem nenhum elemento.
Casos extremos e como são reportados
As recusas do conversor são a parte de seu contrato que sustenta. Um campo entre aspas não terminado interrompe o parse naquela linha com um erro nomeado, porque adivinhar onde o campo terminaria redimensionaria silenciosamente cada linha depois. Uma linha com contagem de campo diferente do cabeçalho ainda converte, mas um aviso informa que campos ausentes estão ausentes e extras foram descartados. Cabeçalhos duplicados convertem com o valor da ocorrência mais à direita vencendo, e o aviso diz isso — o comportamento de importação de planilha, tornado explícito.
- Aspa não terminada: parse abortado, linha reportada, nenhuma saída escrita.
- Linhas irregulares: convertidas com aviso nomeando as linhas afetadas.
- Cabeçalhos duplicados: convertidos com aviso; ocorrência mais à direita vence.
Perguntas frequentes
Converter CSV para XML envia meu arquivo para algum lugar?
Não. O parse do CSV e a construção do XML são executados dentro desta aba do navegador com código que foi carregado uma vez ao abrir a página. Não há endpoint de envio para chamar, e a página é servida com uma Content-Security-Policy cujo connect-src é 'self', então o navegador recusaria qualquer requisição de saída mesmo se tentada. Veja o painel de Rede no DevTools enquanto converte — ele fica vazio.
Por que minha saída está embrulhada em tags <records> e <record>?
XML precisa exatamente de um elemento raiz, e um arquivo CSV não tem nome natural para dar a ele, então o conversor usa uma forma fixa: um elemento raiz <records> com um elemento <record> por linha. Cabeçalhos se tornam as tags filhas dentro de cada registro. O wrapper é que torna a saída um documento bem formado em vez de um fragmento, e cada linha é fácil de endereçar com um XPath como /records/record.
Nomes de tag ilegais são como tratados?
Todo cabeçalho é sanitizado para as regras de nome XML 1.0: caracteres fora de letras, dígitos, underscore, hífen, ponto e dois-pontos se tornam underscores, e um nome que começaria com dígito ganha um underscore inicial. Então unit price se torna unit_price e 2fa se torna _2fa. Nomes que já eram legais passam intocados, o que importa quando um sistema downstream faz match em nomes de tag exatos.
Caracteres especiais nos valores das células são como escapados?
O conteúdo de texto escapa os três caracteres que XML requer: & se torna &, < se torna < e > se torna >>. Dentro de valores de atributo a aspa dupla é escapada como " também. O escape acontece apenas na saída, então uma célula contendo A & B faz a viagem de volta para exatamente A & B quando um parser XML lê o documento — nada é escapado duas vezes e nada é pré-desescapado.
Meus números e códigos postais manterão sua formatação?
Sim, porque valores se tornam texto XML verbatim — não há etapa de coerção numérica que pudesse reformata-los. 02134 mantém seu zero à esquerda, 44.95 mantém sua forma decimal exata, e um valor como 1e5 permanece os caracteres que você digitou em vez de ser expandido. Informação de tipo é uma preocupação de CSV ou JSON; elementos XML carregam texto, e o conversor não segunda-guessa isso.
E se meu CSV tiver linhas irregulares ou cabeçalhos duplicados?
Ambos convertem, cada um com um aviso explícito. Uma linha mais curta que o cabeçalho é completada com campos ausentes — nenhum elemento vazio é inventado — e uma linha mais longa que o cabeçalho tem seus extras descartados, com o aviso nomeando quantas linhas foram afetadas. Nomes de coluna duplicados resolvem com o da direita vencendo, da mesma forma que uma importação de planilha se comporta, e o aviso lista os nomes envolvidos.
Quais ferramentas relacionadas devo usar a seguir?
- XML para CSVConversor que roda no seu navegadorAbrir
- Regras de CSV da RFC 4180Guia em linguagem simplesAbrir
- JSON vs XMLComparação lado a ladoAbrir
- Converter CSV em JSONLê a exportação da planilha, aspas e tudoAbrir
- Converter JSON em XMLConverte com atributos e nomes que o XML aceitaAbrir
- Validar JSONAponta o erro com linha e coluna e corrige num cliqueAbrir