Conversor de F# a XML
Pega records o valores F#. Recibe XML limpio de vuelta.
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.
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.
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.
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<T></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: