Pega Python a la izquierda y haz clic en "Convert" — lo convertimos en XMLPega tu código Python

Qué hace esta herramienta

Si alguna vez has tenido que armar a mano un payload XML que refleje una clase de Python — para un endpoint SOAP, un archivo de configuración, una integración legacy o una fixture de test — ya conoces la rutina: peleas con xml.etree.ElementTree durante una hora y entonces te das cuenta de que olvidaste un campo anidado. Pega el Python aquí y recibe XML bien formado en una sola pasada. Un dict plano, una dataclass, un modelo Pydantic o algo profundamente anidado — mismo resultado.

No es un buscar-y-reemplazar tonto. El convertidor entiende cómo los valores de Python se mapean realmente a XML: Decimal("49.99") pasa a texto numérico plano, datetime y date salen como strings ISO-8601, UUID pasa a un string hex estándar 8-4-4-4-12, los campos Optional[...] con valor None se convierten en elementos vacíos en lugar de desaparecer, y list[T] o List[T] pasan a ser elementos contenedor con un hijo por item, nombrado por el tipo del item — la misma forma que producirían librerías como xmltodict o lxml.

Las type hints también se respetan. Los nombres de campo de @dataclass pasan a nombres de elemento. Field(alias="x") en modelos Pydantic renombra el elemento. field(metadata={"xml": "attribute"}) en una dataclass empuja el valor a un atributo en vez de a un elemento hijo. Los campos privados que empiezan por _ se descartan. Si pegas varias clases, cada una aparece en la salida con los tipos anidados expandidos y los atributos heredados incluidos. Nada se traga en silencio — si un campo está ahí, sale en el XML.

Cómo usarlo

Tres pasos. Funciona igual si pegas un dict de cinco líneas o un models.py entero.

1

Pega tu Python (o prueba el ejemplo)

Suelta tu Python tal cual en el editor de la izquierda. Un dict literal, una dataclass, un Pydantic BaseModel, clases anidadas o una asignación de instancia — todo vale. Pulsa Load Sample si quieres ver primero un ejemplo realista de Order / OrderItem / Address.

Deja los imports, decoradores y type hints donde están. No hace falta quitarlos — el parser lee las anotaciones de typing y las usa para decidir los tipos de salida.

2

Pulsa Convert

Haz clic en el botón verde Convert. La herramienta lee el Python, conserva cada clase y atributo, y emite el XML en una sola pasada. Verás un indicador de carga breve mientras trabaja.

3

Copia el XML

El panel de la derecha se llena con XML indentado y bien formado que cualquier parser XML compatible aceptará. Cópialo directo a tu request SOAP, archivo de config, fixture de test o docs.

Cuándo viene bien de verdad

Fixtures de SOAP / integraciones legacy

Tienes un modelo de request en Pydantic y necesitas un body XML para mandar a un servicio SOAP legacy. Pega el modelo, saca el XML, pégalo en tu test runner — listo.

Convertir dataclasses en configuración

Una Settings dataclass con 30 campos se convierte en una plantilla XML lista para editar para cualquier almacén de configuración basado en XML — sin andamiaje a mano ni erratas.

Mantener los docs XSD alineados

Genera ejemplos XML para tu README, la referencia de API o docs basados en XSD directamente desde los modelos reales de tu código, para que los ejemplos nunca se desfasen.

Sembrar tests de integración

Convierte literales de instancia de tus fixtures de pytest en archivos XML seed para sistemas que aún hablan XML — APIs legacy, mock servers o pipelines XSLT.

Preguntas frecuentes

¿Funciona con dataclasses, Pydantic y dicts planos?

Sí, los tres. Los nombres de campo de @dataclass y de Pydantic BaseModel se usan como nombres de elemento. Los literales de dict plano también funcionan — las claves pasan a nombres de elemento y los valores se emiten según su tipo. Los modelos o dicts anidados se expanden como elementos anidados.

¿Cómo maneja Decimal, datetime y UUID?

Decimal("49.99") pasa a 49.99 como texto del elemento. datetime, date y time salen como strings ISO-8601. UUID pasa a un string hex estándar 8-4-4-4-12. Las subclases de Enum emiten su .value. Los set se convierten en elementos contenedor igual que las listas.

¿Y los Optional[...] y los valores None?

Los campos con valor None se escriben como elementos vacíos (<field/>) en vez de descartarse — la forma de la salida se mantiene consistente, lo cual importa si un XSD downstream requiere que el elemento esté presente.

¿Puedo renombrar elementos o empujar campos a atributos?

Sí. En modelos Pydantic, Field(alias="x") renombra el elemento. En dataclasses, field(metadata={"xml": "attribute"}) empuja el campo a un atributo del padre, y metadata={"xml": "name", ...} lo renombra. Los campos privados con guion bajo al inicio (_cache, _tmp) se descartan por defecto.

¿Puedo pegar varias clases a la vez?

Sí — pega un models.py entero. Cada clase de primer nivel sale con los tipos anidados expandidos y los campos heredados de las clases base incluidos. Si también incluyes una asignación de instancia, es esa instancia la que se serializa; si no, se usa la primera clase con defaults resolubles.

¿Se guarda mi código?

El código se envía al backend solo para convertirlo y no se persiste — no logueamos el payload. Como con cualquier herramienta online, si el código es realmente sensible, léelo antes de pegarlo.

Otras herramientas que te pueden hacer falta

Python a XML es una pieza del puzzle. Estas encajan bien con ella: