Pega F# a la izquierda y pulsa "Convertir" — lo transformamos en XMLPega código F#

Qué hace esta herramienta

Si escribes F# y trabajas cerca de ficheros de configuración .NET XML, contratos WCF o un endpoint SOAP, ya conoces el dolor: tus records son limpios y expresivos, pero escribir a mano el XML que les corresponde es un suplicio. Pega el F# aquí y recibe XML bien formado en una sola pasada — un solo record, un let binding con valores o un módulo entero con records anidados.

El conversor conoce las peculiaridades de F# que de verdad te importan. Un option<string> con Some "x" se convierte en un elemento normal; None se convierte en un elemento vacío en vez de desaparecer, así que la forma del XML queda predecible. Los literales decimal (249.99m) pierden el sufijo. list, seq y arrays se convierten en elementos contenedor con un hijo por item — como emite System.Xml.Serialization por debajo cuando haces round-trip en .NET.

Las uniones discriminadas se manejan con sentido común — el nombre del caso queda como etiqueta del elemento y el payload se convierte en elementos hijos. Los records anidados se expanden inline, los campos de tupla salen como elementos hermanos, y Map<K,V> se convierte en pares <Entry><Key/><Value/></Entry>. Para personalización dirigida por atributos ([<XmlElement>], [<XmlAttribute>]), echa un vistazo a la documentación de F# sobre interoperabilidad con .NET — el conversor los respeta cuando están presentes.

Cómo usarlo

Tres pasos. Funciona igual si pegas un record de una línea o un módulo entero.

1

Pega tu F# (o prueba el ejemplo)

Suelta el F# tal cual en el editor de la izquierda. Un record, un let binding con valores, varios records, o una unión discriminada — todo vale. Pulsa Cargar ejemplo para ver un caso realista.

No hace falta quitar los open ni limpiar la sintaxis F#. Deja el código como aparece en Rider o VS Code. Pega y listo.

2

Pulsa Convertir

Haz clic en el botón verde Convertir. La herramienta parsea los records, recorre el valor poblado y construye el XML en una sola pasada. Aparece un indicador de carga breve mientras trabaja.

3

Copia el XML

El panel derecho se llena con XML indentado y bien formado que cualquier parser estándar aceptará. Cópialo directo a tu app.config, a un fixture SOAP, a un test de round-trip con XmlSerializer, o a tu documentación.

Cuándo viene bien de verdad

Ficheros de configuración XML de .NET

Un record F# que modela una sección de app.config / web.config se convierte en una plantilla XML lista para editar — sin escribir angle brackets a mano.

Fixtures WCF y SOAP

Tienes un record F# que refleja un contrato de datos WCF. Pégalo, obtén el body con forma SOAP, mételo en SoapUI o Postman.

Interop Fable con endpoints XML antiguos

¿Usas Fable para hablar con una API XML antigua? Pega el record F# compartido y obtén el body XML que espera tu backend, con los campos option tratados correctamente.

Datos de test para XmlSerializer

Genera datos XML que hagan round-trip limpio con <code>XmlSerializer&lt;T&gt;</code> sin sorpresas — útil para tests de integración, servidores mock y suites de regresión.

Preguntas habituales

¿Puedo pegar varios records a la vez?

Sí — pega un módulo entero. Cada record aparece con los records anidados expandidos y las definiciones de tipo encadenadas con and bien gestionadas. Los casos de unión discriminada conservan el nombre del caso como etiqueta del elemento.

¿Cómo se manejan option, None y los valores por defecto?

Un option<string> con Some "x" se convierte en un elemento normal con el texto dentro. None se convierte en un elemento vacío, así la forma queda estable — no perderás campos entre records poblados y records sin poblar. voption se comporta igual.

¿Y con decimal, DateTime, Guid y los tipos puñeteros?

Los decimals (249.99m) pierden el sufijo y quedan como texto numérico plano. DateTime, DateTimeOffset y TimeSpan se convierten en strings ISO-8601. Guid se queda en el formato canónico hex 8-4-4-4-12. byte[] se convierte en texto base64 — igual que el comportamiento de XmlSerializer.

¿Las uniones discriminadas funcionan?

Sí. Una DU como type Status = Active | Suspended of reason: string emite <Active/> para el caso sin argumentos y <Suspended><reason>...</reason></Suspended> para el caso con payload. El nombre del caso queda como etiqueta — normalmente lo que quieres para un XML que cuadra con un schema.

¿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. Si el F# es sensible (contratos internos, claves API en literales), revísalo antes de pegar.

¿Y si el F# usa computation expressions o active patterns?

Esos no producen campos XML — son construcciones de flujo de control, no datos. Miramos las definiciones de tipo record y la instancia poblada, así que un async { ... } o un match con banana-clip se ignora. Arregla los errores de sintaxis obvios primero para que el parser tenga algo limpio que masticar.

Otras herramientas que te pueden venir bien

F# a XML es una pieza del puzzle. Estas combinan bien con ella: