Conversor de C a XML
Pega structs o typedefs de C. Recibe XML limpio.
Qué hace esta herramienta
C no trae un serializador XML de fábrica. Si quieres un documento XML que refleje un typedef struct, normalmente tiras de libxml2, Expat, o lo escribes a mano carácter por carácter. Pega aquí tu C y te ahorras esa primera ronda de teclado — la herramienta genera XML bien formado que encaja con los campos, los tipos anidados y los arrays que hayas definido.
Lee C de verdad, no un subconjunto de juguete. Un typedef struct { char orderId[16]; double totalAmount; OrderItem items[2]; } Order; junto con un inicializador designado de C99/C11 (Order o = { .orderId = "ORD-4821", ... };) se convierte en un árbol completo <Order>...</Order> con cada miembro como elemento hijo. Los arrays de char de tamaño fijo se tratan como cadenas (no como arrays de bytes), los tipos numéricos conservan su forma literal, y bool de <stdbool.h> sale como true / false en el resultado.
Los arrays y los structs anidados salen como los escribirías a mano. Un OrderItem items[2] se convierte en <items><OrderItem/><OrderItem/></items>, con cada elemento expandido. Los typedef anidados se resuelven hasta su layout real, así que un alias MoneyAmount para double sigue emitiendo un valor numérico, no una referencia colgando. Los punteros sin inicializador se convierten en elementos vacíos en vez de desaparecer en silencio — útil si usas la salida como plantilla de esquema para un servicio compilado con GCC que todavía habla XML con consumidores antiguos.
Cómo usarlo
Tres pasos. Vale igual si pegas un único typedef o una cabecera entera más un inicializador.
Pega tu C (o prueba el ejemplo)
Suelta cualquier C en el editor de la izquierda — un typedef struct, un struct plano, un inicializador designado o una mezcla. Las directivas #include, los comentarios y las macros #define no estorban; déjalas.
¿Prefieres un ejemplo limpio? Pulsa Cargar ejemplo para un typedef Order realista con OrderItem y Address anidados, inicializado con la sintaxis de inicializadores designados de C99.
Pulsa Convertir
Pincha el botón verde Convertir. La herramienta recorre tus structs, resuelve los typedefs, expande los tipos anidados y los arrays, y escribe el XML de una pasada. Un pequeño indicador de carga aparece mientras trabaja.
Copia el XML
El panel de la derecha se llena de XML indentado y bien formado. Cópialo a un fixture de libxml2, a un archivo de configuración que tu firmware lea al arrancar, a un test de callback de Expat o a tu documentación.
Cuándo viene bien de verdad
Plantillas de configuración para firmware embebido
Los bootloaders y los dispositivos industriales suelen leer configuración XML de la flash o de una SD. Pega el struct C que describe esa configuración y obtienes una plantilla XML editable que encaja byte a byte con el layout.
Fixtures de test para libxml2 / Expat
Escribir XML de ejemplo a mano para cada test del parser cansa. Genera los fixtures a partir de los typedefs reales que tu parser hidrata — los fixtures y los tipos se mantienen en sincronía.
Hablar con sistemas XML heredados
Servicios en C de telco, defensa y sanidad siguen intercambiando XML con sistemas de partners. Cuando toca poner un nuevo struct en la red, esta herramienta te enseña la forma exacta antes de que escribas el serializador.
Documentación y ejemplos de esquema
Los README y las secciones de referencia de API que muestran un "mensaje típico" son más fáciles de mantener al día cuando el ejemplo se genera del header real. Sin desvíos entre lo que lee el código y lo que promete la documentación.
Preguntas frecuentes
¿Puedo pegar una cabecera entera con varios typedefs?
Sí. Pega el header completo — cada typedef struct se captura, los tipos anidados se expanden en línea, y los tipos declarados hacia adelante se resuelven cuando su definición aparece más tarde en el pegado. Los #include, #define y comentarios se ignoran a efectos de layout.
¿Entiende los inicializadores designados de C99 / C11?
Sí. Order o = { .orderId = "ORD-4821", .items = { ... } }; se parsea por nombre de campo, así que los nombres de los elementos XML coinciden con lo que escribiste. Los inicializadores agregados posicionales también funcionan cuando la definición del struct está en el mismo pegado — la herramienta alinea las posiciones con el orden declarado de los miembros. Consulta la sección 6.7.9 del estándar C11.
¿Cómo trata los arrays de char, los enums y las unions?
Los arrays de char de tamaño fijo se representan como cadenas (es la convención en prácticamente cualquier codebase C real), no como listas de enteros. Los valores de enum se emiten con el nombre del enumerador, no el número, para que la salida se lea bien. Los miembros de una union se emiten como la última variante asignada si el inicializador designado lo deja claro, o como elemento vacío con un comentario si la variante activa es ambigua.
¿Por qué no usar libxml2 o Expat directamente?
Esas librerías son sólidas para serializar en tiempo de ejecución, pero escribir el primer fixture o la primera plantilla de configuración a mano sigue llevando tiempo. Esta herramienta te quita ese trabajo. Cuando tengas la forma del XML correcta, enchúfalo en libxml2 o Expat para el camino de producción.
¿Guardan mi código?
Tu código va al backend para convertirlo y no se persiste — no registramos el payload. Como siempre, si la fuente es sensible (protocolo propietario, firmware crítico para seguridad, etc.), revísala antes de pegarla.
¿Y si el C tiene punteros, punteros a función o tipos opacos?
Los punteros a objeto con inicializador se siguen hasta el objeto apuntado. Los punteros sin inicializar, los punteros a función y los tipos opacos (struct Foo* sin definición visible) se emiten como elementos vacíos en vez de tumbar toda la conversión. Es lo mismo que harías a mano al escribir un XML para un struct cuyo objetivo de puntero no forma parte del payload serializado.
Otras herramientas que te pueden hacer falta
C a XML es una pieza del puzle. Estas herramientas encajan bien con ella: