C zu XML Converter
Füg C-Structs oder typedefs ein. Bekomm sauberes XML zurück.
Was dieses Tool tut
C hat keinen eingebauten XML-Serializer. Wenn du ein XML-Dokument willst, das einen typedef struct spiegelt, greifst du üblicherweise zu libxml2, Expat, oder tippst das Ding Zeichen für Zeichen runter. Füg dein C hier ein und du sparst dir diese erste Tipp-Runde — das Tool gibt well-formed XML aus, das zu den Feldern, verschachtelten Typen und Arrays passt, die du definiert hast.
Es liest echtes C, nicht irgendein Spielzeug-Subset. Ein typedef struct { char orderId[16]; double totalAmount; OrderItem items[2]; } Order; zusammen mit einem C99/C11 Designated Initializer (Order o = { .orderId = "ORD-4821", ... };) wird zu einem vollständigen <Order>...</Order>-Baum mit jedem Member als Kindelement. Feste char-Arrays werden als Strings behandelt (nicht als Byte-Arrays), numerische Typen behalten ihre Literalform, und bool aus <stdbool.h> kommt als true / false raus.
Arrays und verschachtelte Structs kommen so raus, wie du sie von Hand schreiben würdest. Ein OrderItem items[2] wird zu <items><OrderItem/><OrderItem/></items>, jedes Element ausgeklappt. Verschachtelte typedefs werden bis zum eigentlichen Layout aufgelöst, ein MoneyAmount-Alias für double liefert also weiter einen numerischen Wert, keine lose Referenz. Pointer ohne Initializer werden zu leeren Elementen, statt still verschluckt zu werden — praktisch, wenn du die Ausgabe als Schema-Template für einen mit GCC gebauten Service benutzt, der mit alten Consumern noch XML spricht.
So benutzt du es
Drei Schritte. Egal ob du nur einen typedef einfügst oder einen ganzen Header plus Initializer.
C einfügen (oder Beispiel testen)
Wirf beliebiges C in den linken Editor — ein typedef struct, ein schlichtes struct, einen Designated Initializer, oder eine Mischung. #include-Direktiven, Kommentare und #define-Makros sind okay; lass sie drin.
Lieber ein sauberes Beispiel? Klick auf Beispiel laden für einen realistischen Order-typedef mit verschachteltem OrderItem und Address, initialisiert mit C99 Designated-Initializer-Syntax.
Konvertieren drücken
Klick auf den grünen Konvertieren-Button. Das Tool läuft durch deine Structs, löst typedefs auf, klappt verschachtelte Typen und Arrays aus und schreibt das XML in einem Durchgang. Während dessen läuft kurz ein Ladeindikator.
XML kopieren
Das rechte Panel füllt sich mit well-formed, eingerücktem XML. Kopier es in eine libxml2-Testfixture, in eine Config-Datei, die deine Firmware beim Boot liest, in einen Expat-Callback-Test oder in deine Doku.
Wann es wirklich was bringt
Embedded- / Firmware-Config-Templates
Bootloader und Industrieanlagen lesen oft XML-Config aus Flash oder SD-Karte. Füg den C-Struct ein, der die Config beschreibt, und bekomm ein bearbeitbares XML-Template, das zum Layout byteweise passt.
libxml2- / Expat-Testfixtures
Beispiel-XML für jeden Parser-Test von Hand zu schreiben nervt. Generiere die Fixtures aus den echten typedefs, die dein Parser füllt — Fixtures und Typen bleiben synchron.
Mit Legacy-XML-Systemen reden
C-Services in Telko, Defense und Healthcare tauschen immer noch XML mit Partnersystemen. Wenn ein neuer Struct über die Leitung muss, zeigt dir das Tool die genaue Form, bevor du den Serializer schreibst.
Doku und Schema-Beispiele
README- und API-Referenz-Abschnitte, die eine "typische Nachricht" zeigen, bleiben leichter akkurat, wenn das Beispiel aus dem echten Header generiert wird. Kein Drift zwischen dem, was der Code liest, und dem, was die Doku behauptet.
Häufige Fragen
Kann ich einen ganzen Header mit mehreren typedefs einfügen?
Ja. Füg den kompletten Header ein — jeder typedef struct wird erfasst, verschachtelte Typen werden inline ausgeklappt, und forward-deklarierte Typen werden aufgelöst, sobald ihre Definition weiter unten im Einfügetext auftaucht. #include, #define und Kommentare werden fürs Layout ignoriert.
Versteht es C99- / C11-Designated-Initializers?
Ja. Order o = { .orderId = "ORD-4821", .items = { ... } }; wird nach Feldnamen geparst, also stimmen die XML-Elementnamen mit dem überein, was du geschrieben hast. Positionale Aggregate-Initializers funktionieren auch, wenn die Struct-Definition im gleichen Einfüge-Text liegt — das Tool richtet die Positionen an der deklarierten Member-Reihenfolge aus. Siehe C11-Standard Abschnitt 6.7.9.
Wie behandelt es char-Arrays, enums und unions?
Feste char-Arrays werden als Strings gerendert (die Konvention in so gut wie jeder echten C-Codebasis), nicht als Liste von Zahlen. enum-Werte werden als Enumerator-Name ausgegeben, nicht als Zahl — bleibt lesbar. union-Member werden als die zuletzt zugewiesene Variante ausgegeben, wenn der Designated Initializer das klarmacht, oder als leeres Element mit Kommentar, wenn die aktive Variante mehrdeutig ist.
Warum nicht direkt libxml2 oder Expat?
Die Libraries sind solide für die Laufzeit-Serialisierung, aber die erste Fixture oder das erste Config-Template von Hand zu schreiben kostet trotzdem Zeit. Das spart dir dieses Tool. Sobald die XML-Form steht, schnallst du libxml2 oder Expat für den Produktionspfad davor.
Wird mein Code gespeichert?
Dein Code geht zum Backend zur Konvertierung und wird nicht persistiert — wir loggen den Payload nicht. Wie immer: wenn die Quelle sensibel ist (proprietäres Protokoll, sicherheitskritische Firmware usw.), schau vorher drüber.
Was, wenn das C Pointer, Funktionspointer oder opake Typen hat?
Objekt-Pointer mit Initializer werden bis zum Ziel weiterverfolgt. Uninitialisierte Pointer, Funktionspointer und opake Typen (struct Foo* ohne sichtbare Definition) werden als leere Elemente ausgegeben, statt die ganze Konvertierung scheitern zu lassen. Das entspricht dem, wie du ein XML-Dokument für einen Struct von Hand schreiben würdest, dessen Pointerziel gar nicht Teil des serialisierten Payloads ist.
Andere Tools, die du brauchen könntest
C zu XML ist nur ein Teil des Puzzles. Diese passen dazu: