Cole C do lado esquerdo e clique em "Converter" — transformamos em XMLCole código C

O que esta ferramenta faz

C não tem um serializador XML embutido. Se você quer um documento XML que espelhe um typedef struct, normalmente apela para libxml2, Expat, ou escreve o treco caractere por caractere. Cole seu C aqui e pula essa primeira rodada de digitação — a ferramenta gera XML bem formado alinhado com os campos, os tipos aninhados e os arrays que você declarou.

Ela lê C de verdade, não um subconjunto de brinquedo. Um typedef struct { char orderId[16]; double totalAmount; OrderItem items[2]; } Order; junto com um inicializador designado de C99/C11 (Order o = { .orderId = "ORD-4821", ... };) vira uma árvore <Order>...</Order> completa com cada membro como elemento filho. Arrays char de tamanho fixo são tratados como strings (não como arrays de bytes), tipos numéricos preservam sua forma literal, e bool de <stdbool.h> sai como true / false na saída.

Arrays e structs aninhados saem como você escreveria à mão. Um OrderItem items[2] vira <items><OrderItem/><OrderItem/></items>, com cada elemento expandido. typedefs aninhados são resolvidos até o layout subjacente, então um alias MoneyAmount para double ainda sai como valor numérico, não como uma referência solta. Ponteiros sem inicializador viram elementos vazios em vez de sumir em silêncio — útil quando você usa a saída como template de esquema para um serviço compilado com GCC que ainda fala XML com consumidores antigos.

Como usar

Três passos. Funciona tanto se você colar um único typedef quanto um header inteiro com um inicializador.

1

Cole seu C (ou teste o exemplo)

Joga qualquer C no editor da esquerda — um typedef struct, um struct puro, um inicializador designado, ou uma mistura. Diretivas #include, comentários e macros #define são bem-vindos; pode deixar.

Quer um exemplo limpo? Clique em Carregar exemplo para ver um typedef Order realista com OrderItem e Address aninhados, inicializado com a sintaxe de inicializador designado de C99.

2

Aperte Converter

Clica no botão verde Converter. A ferramenta percorre seus structs, resolve os typedefs, expande tipos aninhados e arrays, e escreve o XML de uma vez. Um indicador de carregamento curto aparece enquanto trabalha.

3

Copie o XML

O painel da direita fica cheio de XML bem formado e indentado. Copie para um fixture de libxml2, para um arquivo de configuração que seu firmware lê no boot, para um teste de callback do Expat ou para sua documentação.

Quando ajuda de verdade

Templates de config para firmware embarcado

Bootloaders e equipamentos industriais muitas vezes leem config XML da flash ou de um cartão SD. Cole o struct C que descreve a config e receba um template XML editável que bate byte a byte com o layout.

Fixtures de teste para libxml2 / Expat

Escrever XML de exemplo à mão para cada teste de parser cansa. Gere os fixtures a partir dos typedefs reais que seu parser hidrata — fixtures e tipos ficam em sincronia.

Falar com sistemas XML legados

Serviços em C de telecom, defesa e saúde ainda trocam XML com sistemas parceiros. Quando um struct novo precisa ir pela rede, essa ferramenta mostra a forma exata antes de você escrever o serializador.

Docs e exemplos de esquema

Seções de README e de referência de API que mostram uma "mensagem típica" ficam mais fáceis de manter corretas quando o exemplo é gerado a partir do header real. Sem divergência entre o que o código lê e o que a doc afirma.

Perguntas frequentes

Posso colar um header inteiro com vários typedefs?

Pode. Cole o header todo — cada typedef struct é capturado, tipos aninhados se expandem inline, e tipos declarados de forma antecipada são resolvidos quando a definição aparece mais adiante na colagem. #include, #define e comentários são ignorados para fins de layout.

Entende inicializadores designados de C99 / C11?

Sim. Order o = { .orderId = "ORD-4821", .items = { ... } }; é parseado por nome de campo, então os nomes dos elementos XML batem com o que você escreveu. Inicializadores agregados posicionais também funcionam quando a definição do struct está na mesma colagem — a ferramenta alinha as posições com a ordem declarada dos membros. Veja a seção 6.7.9 do padrão C11.

Como trata arrays de char, enums e unions?

Arrays char de tamanho fixo são representados como strings (a convenção em praticamente qualquer codebase C real), não como lista de inteiros. Valores de enum saem com o nome do enumerador, não o número, para manter a saída legível. Membros de union saem como a última variante atribuída se o inicializador designado deixar claro, ou como elemento vazio com um comentário quando a variante ativa é ambígua.

Por que não usar só libxml2 ou Expat?

Essas bibliotecas são sólidas para serialização em runtime, mas escrever o primeiro fixture ou o primeiro template de config à mão ainda toma tempo. Esta ferramenta economiza isso. Quando a forma do XML estiver certa, plugue no libxml2 ou no Expat para o caminho de produção.

Meu código fica guardado?

Seu código vai para o backend para conversão e não é persistido — não logamos o payload. Como sempre, se a fonte for sensível (protocolo proprietário, firmware crítico de segurança, etc.), dê uma olhada antes de colar.

E se o C tiver ponteiros, ponteiros de função ou tipos opacos?

Ponteiros de objeto com inicializador são seguidos até o alvo. Ponteiros não inicializados, ponteiros de função e tipos opacos (struct Foo* sem definição visível) saem como elementos vazios em vez de derrubar a conversão inteira. É o mesmo jeito que você escreveria um XML à mão para um struct cujo alvo de ponteiro não faz parte do payload serializado.

Outras ferramentas que podem ajudar

C para XML é só uma peça do quebra-cabeça. Estas combinam bem: