Conversor de Elixir a XML
Pega structs o mapas de Elixir. Obtén XML limpio de vuelta.
Qué hace esta herramienta
Estás conectando una app Elixir con un endpoint SOAP heredado, o armando un fixture para una prueba de integración XML-RPC, y ya tienes el struct pero no el envoltorio. Escribir a mano llamadas a XmlBuilder.element/3 para cada campo se vuelve tedioso enseguida. Pega el Elixir aquí — un literal %Order{}, un defmodule con un defstruct, o un archivo entero con varios módulos — y obtendrás XML bien formado de una sola pasada. La misma forma que construiría XmlBuilder, sin la ceremonia.
El conversor entiende la semántica de Elixir. Los átomos pierden los dos puntos iniciales — :is_paid como clave de mapa se convierte en el nombre de elemento is_paid, y true / false quedan como texto. Decimal.new("249.99") pierde el envoltorio y se vuelve 249.99. DateTime, NaiveDateTime y Date salen como cadenas ISO-8601. Los structs anidados (un %Order{} con un campo shipping_address: %Address{}) se expanden en su lugar, y los valores nil se convierten en elementos vacíos en lugar de descartarse. Las listas de palabras clave como [sku: "SKU-101", qty: 2] se tratan igual que el mapa equivalente.
Las listas se convierten en elementos contenedores con un hijo por ítem, nombrados según el tipo del struct: un campo items: [%OrderItem{}, %OrderItem{}] se convierte en <items><OrderItem/><OrderItem/></items>. Eso coincide con cómo SweetXml vuelve a leer XML en Elixir y con lo que espera la biblioteca xmerl por debajo. Las tuplas reciben un envoltorio <tuple> con hijos posicionales. Si pegas varios bloques defmodule, cada defstruct aparece en la salida. Pégalo tal como está en tu archivo .ex o .exs — sin necesidad de limpiarlo.
Cómo usarlo
Tres pasos. Funciona igual si pegas un solo struct o un archivo entero de contexto Phoenix.
Pega tu Elixir (o prueba el ejemplo)
Suelta tu Elixir en el editor de la izquierda tal cual. Un defstruct, un literal %Struct{}, un mapa simple, una lista de palabras clave o structs anidados — todo vale. Pulsa Cargar ejemplo para ver un caso realista de Order / OrderItem / Address.
No necesitas quitar @moduledoc, eliminar anotaciones @derive ni limpiar pipes y comentarios. Pega el código Elixir tal como se ve en tu editor.
Pulsa Convertir
Haz clic en el botón verde Convertir. La herramienta lee el Elixir, conserva cada campo, mantiene los structs anidados y construye el XML en una sola pasada. Se muestra un breve indicador de carga mientras procesa.
Copia el XML
El panel de la derecha se llena con XML bien formado e indentado. Cópialo directamente al cuerpo de una solicitud SOAP, a una llamada XML-RPC, a un fixture de prueba o al archivo de seeds de tu suite de integración.
Cuándo resulta realmente útil
Apps Phoenix que hablan con servicios SOAP
Tu contexto Phoenix te entrega un bonito <code>%Order{}</code>. El proveedor downstream solo habla SOAP. Pega el struct, obtén el cuerpo del envoltorio XML, mételo en la solicitud — sin tener que armar árboles de <code>XmlBuilder</code> a mano.
Integraciones XML-RPC
Viejos plugins de WordPress, CMS heredados, feeds financieros — todos siguen hablando XML-RPC. Convierte tu struct Elixir en la forma <code><param><value><struct></code> que espera la especificación, lista para pasar por <code>HTTPoison</code>.
Integraciones empresariales heredadas
Archivos bancarios, feeds EDI, payloads estilo HL7 del sector salud. Si un socio insiste en XML, pega el modelo Elixir que ya tienes y consigue una plantilla XML equivalente — más rápido que pelearse con <code>xmerl</code> desde cero.
Fixtures para ida y vuelta con SweetXml
¿Estás escribiendo una prueba que lee XML con SweetXml y lo compara con un struct? Pega el struct, obtén el XML, guárdalo como fixture. El ida y vuelta queda consistente.
Preguntas frecuentes
¿Puedo pegar varios bloques defmodule / defstruct a la vez?
Sí. Pega un archivo entero. Cada defstruct sale con sus campos intactos, y las referencias a structs anidados se expanden. Si incluyes un literal %Struct{} al final con valores reales, la salida usa esos valores — si no, emite la forma con elementos vacíos.
¿Cómo se manejan los átomos?
Los átomos usados como claves de mapa/struct se convierten en nombres de elemento (los dos puntos iniciales desaparecen — :is_paid pasa a is_paid). Los valores átomo que son booleanos (true, false, nil) se convierten en el texto correspondiente. Otros átomos se emiten como texto sin los dos puntos (:pending pasa a pending). Si necesitas la sintaxis original del átomo, postprocesa con String.to_atom/1 después de parsear.
¿Y qué pasa con Decimal, DateTime, Date, NaiveDateTime?
Decimal.new("249.99") pierde el envoltorio y se vuelve 249.99. DateTime, NaiveDateTime y Date salen como cadenas ISO-8601. Time pasa a HH:MM:SS. Los valores nil se convierten en elementos vacíos en lugar de descartarse — así la forma se mantiene consistente para el ida y vuelta con SweetXml.
¿Cómo se traducen listas, tuplas y listas de palabras clave?
Las listas de structs se convierten en elementos contenedores con un hijo por ítem, nombrado según el struct: items: [%OrderItem{}, ...] pasa a <items><OrderItem/><OrderItem/></items>. Las listas de escalares se convierten en hijos <item> dentro del contenedor. Las tuplas reciben un envoltorio <tuple> con hijos posicionales <_0/>, <_1/>. Las listas de palabras clave se tratan como mapas — cada clave se convierte en un elemento hijo.
¿Qué pasa si mi struct usa @derive para Jason / Poison?
La anotación @derive es una pista de compilación para bibliotecas JSON y no afecta la salida XML. Todos los campos del struct se emiten por defecto. Si quieres omitir un campo, quítalo de la lista defstruct antes de pegar, o envuelve el valor en algo que el conversor pueda reconocer como "omitir".
¿Se guarda mi código?
Tu código se envía al backend para la conversión y no se persiste — no registramos el payload. Como siempre con las herramientas online, si el código es realmente sensible, revísalo antes de pegarlo.
Otras herramientas que podrías necesitar
Elixir a XML es una pieza del puzle. Estas herramientas combinan bien con ella: