Colle ton C à gauche et clique sur "Convertir" — on te le transforme en XMLColle du code C

Ce que fait cet outil

C n’a pas de sérialiseur XML intégré. Si tu veux un document XML qui reflète un typedef struct, en général tu sors libxml2, Expat, ou tu écris le truc à la main caractère par caractère. Colle ton C ici et tu sautes ce premier round de frappe — l’outil sort du XML bien formé qui s’aligne sur les champs, les types imbriqués et les tableaux que tu as définis.

Il lit du vrai C, pas un sous-ensemble jouet. Un typedef struct { char orderId[16]; double totalAmount; OrderItem items[2]; } Order; combiné à un initialiseur désigné C99/C11 (Order o = { .orderId = "ORD-4821", ... };) devient un arbre <Order>...</Order> complet avec chaque membre en élément enfant. Les tableaux char de taille fixe sont traités comme des chaînes (pas des tableaux d’octets), les types numériques gardent leur forme littérale, et bool de <stdbool.h> ressort en true / false dans la sortie.

Les tableaux et les structs imbriqués sortent comme tu les écrirais à la main. Un OrderItem items[2] devient <items><OrderItem/><OrderItem/></items>, avec chaque élément déplié. Les typedef imbriqués sont résolus jusqu’à leur layout réel, donc un alias MoneyAmount pour double sort toujours une valeur numérique, pas une référence pendante. Les pointeurs sans initialiseur deviennent des éléments vides au lieu de disparaître en silence — pratique si tu utilises la sortie comme template de schéma pour un service compilé avec GCC qui parle encore XML à de vieux consommateurs.

Comment l’utiliser

Trois étapes. Fonctionne que tu colles un seul typedef ou un header entier avec un initialiseur.

1

Colle ton C (ou essaie l’exemple)

Balance n’importe quel C dans l’éditeur de gauche — un typedef struct, un struct nu, un initialiseur désigné, ou un mélange. Les directives #include, les commentaires et les macros #define passent sans problème ; laisse-les.

Tu préfères un exemple propre ? Clique sur Charger l’exemple pour un typedef Order réaliste avec OrderItem et Address imbriqués, initialisé en syntaxe initialiseur désigné C99.

2

Appuie sur Convertir

Clique sur le bouton vert Convertir. L’outil parcourt tes structs, résout les typedefs, déplie les types imbriqués et les tableaux, et écrit le XML en une passe. Un petit indicateur de chargement tourne pendant le travail.

3

Copie le XML

Le panneau de droite se remplit de XML bien formé et indenté. Copie-le dans un fixture de test libxml2, un fichier de config que ton firmware lit au boot, un test de callback Expat ou ta doc.

Quand ça sert vraiment

Templates de config embarqués / firmware

Les bootloaders et les équipements industriels lisent souvent leur config XML depuis la flash ou une SD. Colle le struct C qui décrit la config, récupère un template XML éditable qui colle au layout octet pour octet.

Fixtures de test libxml2 / Expat

Écrire à la main du XML d’exemple pour chaque test de parser, ça lasse. Génère les fixtures à partir des vrais typedefs que ton parser hydrate — les fixtures et les types restent synchro.

Parler avec des systèmes XML legacy

Les services C en télécoms, défense et santé échangent encore du XML avec les partenaires. Quand un nouveau struct doit passer sur le fil, cet outil te montre la forme exacte avant que tu écrives le sérialiseur.

Docs et exemples de schéma

Les README et les sections de référence API qui montrent un "message type" sont plus faciles à garder à jour quand l’exemple est généré depuis le header réel. Pas de dérive entre ce que lit le code et ce que prétend la doc.

Questions fréquentes

Je peux coller un header entier avec plusieurs typedefs ?

Oui. Colle le header complet — chaque typedef struct est capturé, les types imbriqués se déplient inline, et les types déclarés en forward sont résolus quand leur définition apparaît plus loin dans le collage. Les #include, #define et commentaires sont ignorés pour le layout.

Il comprend les initialiseurs désignés C99 / C11 ?

Oui. Order o = { .orderId = "ORD-4821", .items = { ... } }; est parsé par nom de champ, donc les noms d’éléments XML collent à ce que tu as écrit. Les initialiseurs agrégés positionnels fonctionnent aussi quand la définition du struct est dans le même collage — l’outil aligne les positions sur l’ordre des membres déclarés. Voir la section 6.7.9 du standard C11.

Comment il gère les tableaux de char, les enums et les unions ?

Les tableaux char de taille fixe sont rendus en chaînes (la convention dans quasi tous les vrais codebases C), pas en liste d’entiers. Les valeurs enum sont émises avec le nom de l’énumérateur, pas la valeur numérique, pour que la sortie reste lisible. Les membres d’union sont émis comme la dernière variante assignée si l’initialiseur désigné le dit clairement, ou comme élément vide avec un commentaire si la variante active est ambiguë.

Pourquoi pas juste libxml2 ou Expat ?

Ces libs sont solides pour la sérialisation en runtime, mais écrire le premier fixture ou le premier template de config à la main prend encore du temps. Cet outil te fait gagner ça. Une fois que tu as la bonne forme XML, branche-la dans libxml2 ou Expat pour le chemin prod.

Mon code est stocké ?

Ton code part au backend pour la conversion et n’est pas persisté — on ne loggue pas le payload. Comme toujours, si la source est sensible (protocole propriétaire, firmware critique de sécurité, etc.), relis-la avant de coller.

Et si le C contient des pointeurs, des pointeurs de fonction ou des types opaques ?

Les pointeurs d’objet avec initialiseur sont suivis jusqu’à la cible. Les pointeurs non initialisés, les pointeurs de fonction et les types opaques (struct Foo* sans définition visible) sont émis comme éléments vides plutôt que de faire planter toute la conversion. C’est pareil que ce que tu écrirais à la main pour un struct dont la cible de pointeur n’est pas dans le payload sérialisé.

Autres outils qui peuvent servir

C vers XML n’est qu’une pièce du puzzle. Ces outils vont bien avec :