C till XML Converter
Klistra in C-structs eller typedefs. Få tillbaka ren XML.
Vad verktyget gör
C har ingen inbyggd XML-serializer. Vill du ha ett XML-dokument som speglar en typedef struct tar du vanligtvis till libxml2, Expat, eller så skriver du det för hand tecken för tecken. Klistra in din C här och hoppa över första skrivrundan — verktyget ger well-formed XML som matchar fälten, de nästlade typerna och arrayerna du definierat.
Det läser riktig C, inte någon leksaksdelmängd. En typedef struct { char orderId[16]; double totalAmount; OrderItem items[2]; } Order; tillsammans med en C99/C11 designated initializer (Order o = { .orderId = "ORD-4821", ... };) blir ett komplett <Order>...</Order>-träd med varje member som barnelement. Fasta char-arrayer hanteras som strängar (inte byte-arrayer), numeriska typer behåller sin literal-form och bool från <stdbool.h> blir true / false i utdata.
Arrayer och nästlade structs kommer ut som du skulle skriva dem för hand. Ett OrderItem items[2] blir <items><OrderItem/><OrderItem/></items> med varje element utfällt. Nästlade typedef-er löses upp till sin underliggande layout, så ett MoneyAmount-alias för double ger fortfarande ett numeriskt värde, inte en hängande referens. Pekare utan initializer blir tomma element istället för att tyst försvinna — bra om du använder utdatan som schemamall för en GCC-byggd tjänst som fortfarande pratar XML med äldre konsumenter.
Så använder du det
Tre steg. Funkar oavsett om du klistrar in en enda typedef eller en hel header plus en initializer.
Klistra in din C (eller testa exemplet)
Släng in valfri C i vänstra editorn — en typedef struct, en vanlig struct, en designated initializer eller en blandning. #include-direktiv, kommentarer och #define-makron är okej; låt dem vara kvar.
Vill du ha ett snyggt exempel? Klicka på Ladda exempel för en realistisk Order-typedef med nästlad OrderItem och Address, initialiserad med C99 designated-initializer-syntax.
Tryck på Konvertera
Klicka på den gröna Konvertera-knappen. Verktyget vandrar genom dina structs, löser upp typedefs, expanderar nästlade typer och arrayer och skriver XML:en i ett svep. En kort laddningsindikator snurrar under tiden.
Kopiera XML:en
Högra panelen fylls med well-formed, indenterad XML. Kopiera in det i en libxml2-testfixtur, en konfigfil din firmware läser vid boot, ett Expat-callbacktest eller din dokumentation.
När det faktiskt hjälper
Embedded- / firmware-konfigmallar
Bootloaders och industriell utrustning läser ofta XML-konfig från flash eller SD-kort. Klistra in den C-struct som beskriver konfigen och få en redigerbar XML-mall som matchar layouten byte för byte.
Testfixturer för libxml2 / Expat
Att skriva exempel-XML för hand till varje parsertest tröttnar man på. Generera fixturerna från de riktiga typedefs som parsern fyller på — fixturer och typer hålls i synk.
Prata med gamla XML-system
C-tjänster inom telekom, försvar och sjukvård växlar fortfarande XML med partnersystem. När en ny struct ska ut på tråden visar verktyget exakt form innan du skriver serializern.
Dokumentation och schemaexempel
README- och API-referensavsnitt som visar ett "typiskt meddelande" är lättare att hålla aktuella när exemplet genereras från den riktiga headern. Ingen drift mellan det koden läser och det dokumentationen påstår.
Vanliga frågor
Kan jag klistra in en hel header med flera typedefs?
Ja. Klistra in hela headern — varje typedef struct fångas upp, nästlade typer expanderas inline och framåtdeklarerade typer löses när deras definition dyker upp senare i inklistringen. För layouten ignoreras #include, #define och kommentarer.
Förstår det C99- / C11-designated initializers?
Ja. Order o = { .orderId = "ORD-4821", .items = { ... } }; parsas efter fältnamn, så XML-elementens namn matchar det du skrev. Positionella aggregatinitializer funkar också när struct-definitionen är i samma inklistring — verktyget matchar positionerna mot den deklarerade memberordningen. Se avsnitt 6.7.9 i C11-standarden.
Hur behandlar det char-arrayer, enums och unions?
Fasta char-arrayer renderas som strängar (konventionen i nästan alla riktiga C-kodbaser), inte som listor av heltal. enum-värden skrivs ut som enumeratornamnet, inte siffran, så utdatan förblir läsbar. union-members skrivs som den senast tilldelade varianten om den designated initializern gör det tydligt, eller som ett tomt element med en kommentar om den aktiva varianten är tvetydig.
Varför inte bara använda libxml2 eller Expat?
De biblioteken är robusta för serialisering i runtime, men att skriva första fixturen eller första konfigmallen för hand tar fortfarande tid. Den tiden sparar det här verktyget åt dig. När XML-formen är rätt kopplar du in libxml2 eller Expat för produktionsvägen.
Sparas min kod?
Din kod skickas till backenden för konverteringen och sparas inte — vi loggar inte payloaden. Som alltid: är källan känslig (proprietärt protokoll, säkerhetskritisk firmware osv.) så titta igenom den innan du klistrar in.
Vad händer om C:n har pekare, funktionspekare eller opaka typer?
Objektpekare med initializer följs till det de pekar på. Oinitialiserade pekare, funktionspekare och opaka typer (struct Foo* utan synlig definition) skrivs som tomma element istället för att välta hela konverteringen. Det är samma sätt du själv skulle skriva ett XML-dokument för en struct vars pekarmål inte ingår i den serialiserade payloaden.
Andra verktyg du kan behöva
C till XML är bara en pusselbit. De här passar bra ihop med det: