Pega Go a la izquierda y pulsa "Convertir" — lo pasamos a XMLPega código Go

Qué hace esta herramienta

Si alguna vez has tenido que montar un payload XML que encaje con un struct de Go — para un cliente SOAP, un feed RSS, un webhook de un SaaS legacy o un sitemap de un proveedor — ya sabes lo pesado que es. Puedes llamar tú mismo a xml.Marshal, pero eso implica montar main.go, compilar y mirar la salida a ojo. Pega el Go aquí y te sale XML bien formado en un solo paso. Un struct, un fichero con varios, o un literal que has copiado de Go by Example — da igual: un documento XML completo con todos los campos.

Replica lo que haría de verdad el paquete encoding/xml. Una tag como xml:"OrderId,attr" convierte el campo en un atributo del padre; xml:"-" lo quita; xml:",omitempty" omite el elemento cuando el valor es el valor cero; xml:"Items>OrderItem" envuelve el slice en un contenedor <Items> con un <OrderItem> por elemento; xml:",chardata" mete el valor como contenido de texto. XMLName xml.Name renombra el propio elemento. Los campos puntero con valor nil se emiten como elementos vacíos sólo cuando no hay ,omitempty — exactamente como se comporta la librería estándar.

Los escalares se tratan como lo haría Go: float64 se imprime sin notación científica cuando cabe, time.Time usa RFC 3339, los booleanos son true/false en minúsculas, y int/uint salen sin relleno. Los structs anidados pasan a ser elementos anidados. Los slices de structs pasan a ser elementos repetidos al mismo nivel. Los maps no los soporta encoding/xml de forma nativa — se aplanan como hijos repetidos <Entry><Key/><Value/></Entry> para que la forma tenga sentido. ¿Escribes Go idiomático? La guía de estilo de Effective Go es una buena referencia de los patrones que espera esta herramienta.

Cómo se usa

Tres pasos. Funciona igual si pegas un struct o un fichero de paquete entero.

1

Pega tu Go (o prueba el ejemplo)

Mete tu Go en el editor de la izquierda tal cual. Una sola declaración de struct, un fichero entero con imports y varios tipos, o un composite literal como order := Order{...} — todo vale. Pulsa Cargar ejemplo para ver primero un caso realista.

No hace falta quitar la línea package, eliminar imports ni limpiar el fichero. Pégalo tal cual sale de gofmt. Las tags de struct con backticks son lo esperado.

2

Pulsa Convertir

Haz clic en el botón verde Convertir. La herramienta lee el Go, respeta cada tag xml del struct y genera el XML de una pasada. Verás un indicador de carga breve mientras se ejecuta.

3

Copia el XML

El panel derecho se rellena con XML indentado y bien formado que cualquier parser XML conforme al estándar aceptará. Cópialo a tu sobre SOAP, fichero de configuración, fixture de test o documentación de API.

Cuándo viene bien de verdad

Montar fixtures de clientes SOAP

Estás hablando con una API SOAP empresarial legacy desde un servicio Go. Pega el struct de la request y saca el body XML listo para SoapUI, Postman o la suite de tests.

Feeds RSS y Atom

Un struct de feed con campos Channel, Item y enclosure pasa a ser una plantilla RSS o Atom funcional — útil para revisar la disposición de las tags antes de montar el handler.

Ficheros de configuración de proveedores

Algunas herramientas SaaS todavía consumen configuración en XML (piensa en sitemaps, pipelines de logging, consolas de operaciones legacy). Pega el struct de configuración de Go y vuelca el XML directamente.

Mantener la documentación honesta

Genera ejemplos XML para un README o una referencia de API a partir de los tipos reales de Go, para que los ejemplos nunca se desincronicen del código que llega a main.

Preguntas habituales

¿Puedo pegar varios structs de una?

Sí — pega el fichero entero. La raíz se detecta a partir del composite literal (p. ej. order := Order{...}) cuando está, o del primer struct que referencie a los demás. Los structs anidados y hermanos salen como elementos anidados o fragmentos separados, así que nada se pierde en silencio.

¿Respeta tags de struct como xml:"x,attr", xml:"-" y xml:",omitempty"?

Sí — y todas las variantes habituales. xml:"name" renombra el elemento, xml:"name,attr" lo emite como atributo en el padre, xml:"-" descarta el campo por completo, xml:",omitempty" salta los campos con valor cero, xml:"a>b" envuelve el slice en un contenedor <a> con un <b> por elemento, xml:",chardata" mete el valor como texto del elemento y xml:",innerxml" se vuelca como XML en bruto. Coincide con el comportamiento documentado en la referencia de encoding/xml Marshal.

¿Y el campo especial XMLName?

Un campo de tipo xml.Name llamado XMLName renombra el elemento raíz. XMLName xml.Name `xml:"Order"` produce <Order>...</Order>. Sin él, la herramienta usa el nombre del tipo del struct como raíz — el mismo defecto que xml.Marshal.

¿Cómo gestiona punteros, slices y maps?

Los campos puntero con nil emiten un elemento vacío salvo que esté ,omitempty, en cuyo caso se saltan. Los slices de structs pasan a ser elementos hermanos repetidos (o envueltos en un contenedor si la tag usa la forma a>b). Los maps no los gestiona nativamente encoding/xml, así que la herramienta los emite como una serie de hijos <Entry><Key/><Value/></Entry> — suficiente para la mayoría de casos, y lo bastante explícito como para editarlo si necesitas otra forma.

¿Se guarda mi código?

Tu código se envía al backend para convertirlo y no se persiste — no registramos el payload. El aviso habitual para herramientas online: si el código es realmente sensible, échale un vistazo antes de pegarlo.

¿Y si el struct usa tipos que encoding/xml no soporta — channels, funcs, complex?

Se emiten como elementos vacíos en lugar de fallar toda la conversión, en línea con lo que haría xml.Marshal en runtime (devuelve un error; la herramienta sigue adelante para que te lleves el resto). Si el propio Go tiene un error de sintaxis, corrige primero lo obvio — el parser es tolerante, pero no es un gc completo.

Otras herramientas que te pueden venir bien

Go a XML es una pieza del rompecabezas. Estas herramientas combinan bien con ella: