C til XML Converter
Lim inn C-structs eller typedefs. Få ren XML tilbake.
Hva verktøyet gjør
C har ingen innebygd XML-serializer. Vil du ha et XML-dokument som speiler en typedef struct, henter du vanligvis fram libxml2, Expat, eller skriver greiene for hånd tegn for tegn. Lim inn C-en din her og hopp over den første skriverunden — verktøyet slipper ut well-formed XML som matcher feltene, de nøstede typene og arrayene du har definert.
Det leser ekte C, ikke et leketøysdelsett. En typedef struct { char orderId[16]; double totalAmount; OrderItem items[2]; } Order; sammen med en C99/C11 designated initializer (Order o = { .orderId = "ORD-4821", ... };) blir til et komplett <Order>...</Order>-tre der hvert member er et barneelement. Faste char-arrayer behandles som strenger (ikke byte-arrayer), numeriske typer beholder literalformen sin, og bool fra <stdbool.h> blir true / false i utdataene.
Arrayer og nøstede structs kommer ut slik du ville ha skrevet dem for hånd. En OrderItem items[2] blir <items><OrderItem/><OrderItem/></items>, med hvert element brettet ut. Nøstede typedef-er løses helt ned til det underliggende layoutet, så et MoneyAmount-alias for double gir fortsatt en numerisk verdi — ikke en løs referanse. Pekere uten initializer blir tomme elementer i stedet for å forsvinne i stillhet — kjekt hvis du bruker utdataene som skjemamal for en GCC-bygd tjeneste som fortsatt snakker XML med eldre konsumenter.
Slik bruker du det
Tre steg. Funker enten du limer inn én typedef eller en hel header pluss en initializer.
Lim inn C-en din (eller prøv eksempelet)
Slipp inn hvilken som helst C i venstre editor — en typedef struct, en vanlig struct, en designated initializer eller en blanding. #include-direktiver, kommentarer og #define-makroer er helt greit; la dem stå.
Vil du heller ha et rent eksempel? Trykk på Last inn eksempel for en realistisk Order-typedef med nøstede OrderItem og Address, initialisert med C99 designated-initializer-syntaks.
Trykk på Konverter
Klikk på den grønne Konverter-knappen. Verktøyet går gjennom structs-ene dine, løser opp typedefs, bretter ut nøstede typer og arrayer og skriver XML-en i én omgang. En kort laste-indikator kjører imens.
Kopier XML-en
Høyre panel fylles med well-formed og innrykket XML. Kopier det inn i en libxml2-testfiksatur, en konfigfil som firmwaren leser ved boot, en Expat-callbacktest eller dokumentasjonen din.
Når det faktisk hjelper
Embedded- / firmware-konfigmaler
Bootloadere og industrielt utstyr leser ofte XML-konfig fra flash eller SD-kort. Lim inn C-structen som beskriver konfigurasjonen, og få en redigerbar XML-mal som matcher layoutet byte for byte.
Testfiksaturer for libxml2 / Expat
Å skrive eksempel-XML for hånd til hver eneste parsertest blir slitsomt. Generer fiksaturene fra de ekte typedefs-ene som parseren din fyller — fiksaturer og typer holdes i synk.
Snakke med gamle XML-systemer
C-tjenester i telekom, forsvar og helse utveksler fortsatt XML med partnersystemer. Når en ny struct skal ut på tråden, viser verktøyet deg nøyaktig form før du skriver serializeren.
Dokumentasjon og skjemaeksempler
README- og API-referanseseksjoner som viser en "typisk melding" er lettere å holde oppdatert når eksempelet genereres fra den ekte headeren. Ingen drift mellom det koden leser og det dokumentasjonen påstår.
Vanlige spørsmål
Kan jeg lime inn en hel header med flere typedefs?
Ja. Lim inn hele headeren — hver typedef struct fanges opp, nøstede typer brettes ut inline, og framover-deklarerte typer løses når definisjonen deres dukker opp senere i innlimingen. For layoutet ignoreres #include, #define og kommentarer.
Forstår det C99- / C11-designated initializers?
Ja. Order o = { .orderId = "ORD-4821", .items = { ... } }; parses etter feltnavn, så XML-elementnavnene stemmer med det du skrev. Posisjonelle aggregatinitializere funker også når struct-definisjonen ligger i samme innliming — verktøyet justerer posisjonene mot den deklarerte member-rekkefølgen. Se seksjon 6.7.9 i C11-standarden.
Hvordan behandler det char-arrayer, enums og unions?
Faste char-arrayer rendres som strenger (konvensjonen i så å si alle ekte C-kodebaser), ikke som lister av heltall. enum-verdier skrives ut med enumerator-navnet, ikke tallet, så utdataene forblir lesbare. union-members skrives som den sist tildelte varianten hvis den designated initializeren gjør det tydelig, eller som et tomt element med en kommentar hvis den aktive varianten er tvetydig.
Hvorfor ikke bare bruke libxml2 eller Expat?
De bibliotekene er solide for runtime-serialisering, men å skrive den første fiksaturen eller den første konfigmalen for hånd tar uansett tid. Den tiden sparer dette verktøyet deg for. Når XML-formen er riktig, kobler du libxml2 eller Expat inn på produksjonsveien.
Blir koden min lagret?
Koden din sendes til backenden for konverteringen og blir ikke lagret — vi logger ikke payloaden. Som alltid: er kilden sensitiv (proprietær protokoll, safety-critical firmware osv.), ta en titt på den før du limer inn.
Hva om C-en har pekere, funksjonspekere eller opake typer?
Objektpekere med initializer følges helt ut til det de peker på. Uinitialiserte pekere, funksjonspekere og opake typer (struct Foo* uten synlig definisjon) skrives som tomme elementer i stedet for å velte hele konverteringen. Det er akkurat slik du selv ville ha skrevet et XML-dokument for hånd for en struct der pekermålet ikke er en del av den serialiserte payloaden.
Andre verktøy du kan trenge
C til XML er bare én bit av puslespillet. Disse passer godt sammen med det: