Incolla C a sinistra e clicca "Converti" — lo trasformiamo in XMLIncolla codice C

Cosa fa questo strumento

C non ha un serializzatore XML integrato. Se vuoi un documento XML che rifletta un typedef struct, di solito tiri in ballo libxml2, Expat, oppure lo scrivi a mano carattere per carattere. Incolla il tuo C qui e salti quella prima fase di digitazione — lo strumento emette XML ben formato allineato con i campi, i tipi annidati e gli array che hai definito.

Legge C vero, non un sottoinsieme giocattolo. Un typedef struct { char orderId[16]; double totalAmount; OrderItem items[2]; } Order; abbinato a un inizializzatore designato C99/C11 (Order o = { .orderId = "ORD-4821", ... };) diventa un albero <Order>...</Order> completo, con ogni membro come elemento figlio. Gli array char di dimensione fissa vengono trattati come stringhe (non come array di byte), i tipi numerici mantengono la loro forma letterale e bool da <stdbool.h> esce come true / false.

Array e struct annidati escono come li scriveresti a mano. Un OrderItem items[2] diventa <items><OrderItem/><OrderItem/></items>, con ogni elemento espanso. I typedef annidati vengono risolti fino al layout sottostante, quindi un alias MoneyAmount per double emette ancora un valore numerico, non un riferimento sospeso. I puntatori senza inizializzatore diventano elementi vuoti invece di sparire in silenzio — comodo se usi l’output come template di schema per un servizio compilato con GCC che parla ancora XML con vecchi consumer.

Come si usa

Tre passi. Funziona sia se incolli un singolo typedef sia se passi un header intero con un inizializzatore.

1

Incolla il tuo C (o prova l’esempio)

Butta qualsiasi C nell’editor di sinistra — un typedef struct, uno struct semplice, un inizializzatore designato, o un mix. Direttive #include, commenti e macro #define vanno benissimo; lasciali dove sono.

Preferisci un esempio pulito? Clicca Carica esempio per un typedef Order realistico con OrderItem e Address annidati, inizializzato con la sintassi degli inizializzatori designati C99.

2

Premi Converti

Clicca il pulsante verde Converti. Lo strumento percorre i tuoi struct, risolve i typedef, espande tipi annidati e array, e scrive l’XML in una passata. Durante il lavoro appare un breve indicatore di caricamento.

3

Copia l’XML

Il pannello di destra si riempie di XML ben formato e indentato. Copialo in una fixture di test libxml2, in un file di configurazione che il tuo firmware legge al boot, in un test di callback Expat o nella tua documentazione.

Quando serve davvero

Template di config per firmware / embedded

Bootloader e dispositivi industriali leggono spesso la configurazione XML da flash o SD. Incolla lo struct C che descrive la config e ottieni un template XML modificabile che combacia byte per byte con il layout.

Fixture di test per libxml2 / Expat

Scrivere XML di esempio a mano per ogni test del parser stanca. Genera le fixture dai typedef reali che il tuo parser idrata — fixture e tipi restano allineati.

Parlare con sistemi XML legacy

Servizi C in telco, difesa e sanità scambiano ancora XML con sistemi partner. Quando un nuovo struct deve andare sul cavo, questo strumento ti mostra la forma esatta prima che tu scriva il serializzatore.

Documentazione ed esempi di schema

Le sezioni di README e API reference che mostrano un "messaggio tipico" sono più facili da tenere aggiornate se l’esempio è generato dall’header vero. Niente drift tra quello che il codice legge e quello che la doc dichiara.

Domande frequenti

Posso incollare un header intero con più typedef?

Sì. Incolla l’header completo — ogni typedef struct viene catturato, i tipi annidati si espandono inline e i tipi dichiarati in forward vengono risolti quando la loro definizione appare più avanti nell’incollato. #include, #define e commenti vengono ignorati ai fini del layout.

Capisce gli inizializzatori designati C99 / C11?

Sì. Order o = { .orderId = "ORD-4821", .items = { ... } }; viene parsato per nome di campo, così i nomi degli elementi XML combaciano con quello che hai scritto. Gli inizializzatori aggregati posizionali funzionano anche quando la definizione dello struct è nello stesso incollato — lo strumento allinea le posizioni all’ordine dichiarato dei membri. Vedi la sezione 6.7.9 dello standard C11.

Come tratta array di char, enum e union?

Gli array char di dimensione fissa vengono resi come stringhe (è la convenzione in quasi tutte le codebase C reali), non come elenchi di interi. I valori enum vengono emessi con il nome dell’enumeratore, non con il numero, così l’output resta leggibile. I membri di union vengono emessi come l’ultima variante assegnata se l’inizializzatore designato lo chiarisce, oppure come elemento vuoto con un commento se la variante attiva è ambigua.

Perché non usare direttamente libxml2 o Expat?

Quelle librerie sono solide per la serializzazione a runtime, ma scrivere la prima fixture o il primo template di config a mano richiede comunque tempo. Questo strumento te lo risparmia. Una volta che la forma dell’XML è quella giusta, attaccalo a libxml2 o Expat per la strada in produzione.

Il mio codice viene salvato?

Il tuo codice viene inviato al backend per la conversione e non viene persistito — non logghiamo il payload. Come sempre, se la fonte è sensibile (protocollo proprietario, firmware safety-critical, ecc.), dagli un’occhiata prima di incollare.

E se il C ha puntatori, puntatori a funzione o tipi opachi?

I puntatori a oggetto con inizializzatore vengono seguiti fino al puntato. Puntatori non inizializzati, puntatori a funzione e tipi opachi (struct Foo* senza definizione visibile) vengono emessi come elementi vuoti invece di far fallire tutta la conversione. È lo stesso modo in cui scriveresti a mano un documento XML per uno struct il cui target di puntatore non fa parte del payload serializzato.

Altri strumenti che potrebbero servirti

C a XML è solo un pezzo del puzzle. Questi si abbinano bene: