Convertisseur F# vers XML
Colle des records ou des valeurs F#. Récupère du XML propre.
Ce que fait cet outil
Si tu écris du F# et que tu travailles à côté de fichiers de config .NET XML, de contrats WCF ou d'un endpoint SOAP, tu connais la douleur : tes records sont propres et expressifs, mais écrire le XML correspondant à la main, c'est une corvée. Colle le F# ici et récupère du XML bien formé en une passe — un seul record, un let binding rempli, ou un module entier avec des records imbriqués.
Le convertisseur connaît les particularités F# qui comptent vraiment. Un option<string> contenant Some "x" devient un élément normal ; None devient un élément vide plutôt que d'être supprimé, donc la forme du XML reste prévisible. Les littéraux decimal (249.99m) perdent leur suffixe. list, seq et arrays deviennent des éléments conteneurs avec un enfant par item — comme System.Xml.Serialization l'émet sous le capot quand tu fais un round-trip via .NET.
Les unions discriminées sont gérées sensément — le nom du cas atterrit comme tag de l'élément et le payload devient des éléments enfants. Les records imbriqués s'étendent inline, les champs tuples sortent comme éléments frères, et Map<K,V> devient des paires <Entry><Key/><Value/></Entry>. Pour la personnalisation via attributs ([<XmlElement>], [<XmlAttribute>]), va voir la doc F# sur l'interop .NET — le convertisseur les respecte quand ils sont là.
Comment l'utiliser
Trois étapes. Même flux que tu colles un record d'une ligne ou un module entier.
Colle ton F# (ou essaie l'exemple)
Balance le F# tel quel dans l'éditeur de gauche. Un record, un let binding rempli, plusieurs records, ou une union discriminée — tout passe. Clique sur Charger un exemple pour un cas réaliste d'abord.
Pas besoin de virer les open ou de nettoyer la syntaxe F#. Laisse le code comme il apparaît dans Rider ou VS Code. Colle, point.
Clique sur Convertir
Clique sur le bouton vert Convertir. L'outil parse les records, parcourt la valeur remplie, et construit le XML en une passe. Un petit indicateur de chargement tourne pendant ce temps.
Copie le XML
Le panneau de droite se remplit de XML indenté et bien formé que n'importe quel parser standard acceptera. Colle-le direct dans ton app.config, une fixture SOAP, un test de round-trip XmlSerializer, ou ta doc.
Quand ça sert vraiment
Fichiers de config XML .NET
Un record F# qui modélise une section d'app.config / web.config se transforme en un template XML prêt à éditer — sans écrire les angle brackets à la main.
Fixtures WCF et SOAP
Tu as un record F# qui reflète un data contract WCF. Colle-le, récupère le body façon SOAP, balance-le dans SoapUI ou Postman.
Interop Fable avec des endpoints XML legacy
Tu utilises Fable pour causer à une vieille API XML ? Colle le record F# partagé et récupère le body XML que ton backend attend, avec les champs option traités correctement.
Données de test pour XmlSerializer
Génère des données XML qui font un round-trip propre via <code>XmlSerializer<T></code> sans mauvaise surprise — utile pour les tests d'intégration, les serveurs mock et les suites de régression.
Questions fréquentes
Je peux coller plusieurs records d'un coup ?
Oui — colle un module entier. Chaque record passe avec les records imbriqués dépliés et les définitions de type chaînées par and gérées. Les cas d'union discriminée conservent le nom du cas comme tag de l'élément.
Comment sont gérés option, None et les defaults ?
Un option<string> avec Some "x" devient un élément normal contenant le texte. None devient un élément vide, comme ça la forme reste stable — tu ne perdras pas de champs entre les records remplis et ceux qui ne le sont pas. voption se comporte pareil.
Et avec decimal, DateTime, Guid et les types casse-tête ?
Les decimals (249.99m) perdent leur suffixe et deviennent du texte numérique plain. DateTime, DateTimeOffset et TimeSpan deviennent des chaînes ISO-8601. Guid reste au format canonique hex 8-4-4-4-12. byte[] devient du texte base64 — cohérent avec le comportement de XmlSerializer.
Les unions discriminées marchent ?
Oui. Une DU comme type Status = Active | Suspended of reason: string émet <Active/> pour le cas nullaire et <Suspended><reason>...</reason></Suspended> pour le cas avec payload. Le nom du cas devient le tag de l'élément — c'est en général ce que tu veux pour du XML qui matche un schéma.
Mon code est-il stocké ?
Ton code est envoyé au backend pour la conversion et n'est pas persisté — on ne log pas le payload. Si le F# est sensible (contrats internes, clés API en littéraux), relis avant de coller.
Et si le F# utilise des computation expressions ou des active patterns ?
Ça ne produit pas de champs XML — ce sont des constructions de flot de contrôle, pas des données. On regarde les définitions de type record et l'instance remplie, donc un async { ... } ou un pattern match banana-clip est ignoré. Corrige les erreurs de syntaxe évidentes d'abord pour que le parser ait quelque chose de propre à mâcher.
Autres outils qui peuvent servir
F# vers XML, c'est une pièce du puzzle. Celles-ci vont bien avec :