Incolla F# a sinistra e clicca "Converti" — lo trasformiamo in XMLIncolla il codice F#

Cosa fa questo tool

Se scrivi F# e lavori vicino a file di configurazione .NET XML, contratti WCF o endpoint SOAP, conosci già il dolore: i tuoi record sono puliti ed espressivi, ma scrivere a mano l'XML corrispondente è una faticaccia. Incolla l'F# qui e ottieni XML ben formato in una sola passata — un singolo record, un let binding popolato, o un intero modulo con record annidati.

Il convertitore conosce le peculiarità di F# che ti interessano davvero. Un option<string> con Some "x" diventa un elemento normale; None diventa un elemento vuoto invece di sparire, così la forma dell'XML resta prevedibile. I letterali decimal (249.99m) perdono il suffisso. list, seq e array diventano elementi contenitore con un figlio per item — in linea con ciò che System.Xml.Serialization emette sotto il cofano quando fai un round-trip tramite .NET.

Le union discriminate vengono gestite con buon senso — il nome del caso atterra come tag dell'elemento e il payload diventa elementi figli. I record annidati si espandono inline, i campi tuple escono come elementi fratelli, e Map<K,V> diventa coppie <Entry><Key/><Value/></Entry>. Per personalizzazioni guidate da attributi ([<XmlElement>], [<XmlAttribute>]), dai un'occhiata ai docs F# sull'interop .NET — il convertitore li rispetta quando ci sono.

Come si usa

Tre passaggi. Funziona uguale sia che incolli un record in una riga sia un intero modulo.

1

Incolla il tuo F# (o prova l'esempio)

Butta l'F# così com'è nell'editor di sinistra. Un record type, un let binding popolato, più record, o una union discriminata — tutto va bene. Clicca Carica esempio prima, per un caso realistico.

Non serve togliere gli open né ripulire la sintassi F#. Lascia il codice come appare in Rider o VS Code. Incolla e basta.

2

Clicca Converti

Clicca il pulsante verde Converti. Il tool fa il parse dei record, percorre il valore popolato e costruisce l'XML in una passata. Durante l'esecuzione compare un piccolo indicatore di caricamento.

3

Copia l'XML

Il pannello a destra si riempie di XML indentato e ben formato, che qualsiasi parser conforme agli standard accetterà. Incollalo direttamente nel tuo app.config, in una fixture SOAP, in un test di round-trip con XmlSerializer, o nei tuoi docs.

Quando serve davvero

File di configurazione XML .NET

Un record F# che modella una sezione di app.config / web.config diventa un template XML pronto da modificare — niente più angle brackets scritti a mano.

Fixture WCF e SOAP

Hai un record F# che rispecchia un data contract WCF. Incollalo, prendi il body in forma SOAP, buttalo in SoapUI o Postman.

Interop Fable con endpoint XML legacy

Usi Fable per parlare con un'API XML più vecchia? Incolla il record F# condiviso e ottieni il body XML che il tuo backend si aspetta, con i campi option gestiti correttamente.

Dati di test per XmlSerializer

Genera dati XML seed che fanno round-trip pulito con <code>XmlSerializer&lt;T&gt;</code> senza sorprese — utile per test di integrazione, mock server e suite di regressione.

Domande frequenti

Posso incollare più record insieme?

Sì — incolla un intero modulo. Ogni record type arriva con i record annidati espansi e le definizioni di tipo concatenate con and gestite. I casi di union discriminata mantengono il nome del caso come tag dell'elemento.

Come gestisce option, None e i default?

Un option<string> con Some "x" diventa un elemento normale che contiene il testo. None diventa un elemento vuoto, così la forma resta stabile — non perderai campi tra record popolati e non popolati. voption si comporta allo stesso modo.

E con decimal, DateTime, Guid e i tipi rognosi?

I decimal (249.99m) perdono il suffisso e diventano testo numerico pulito. DateTime, DateTimeOffset e TimeSpan diventano stringhe ISO-8601. Guid resta nel formato canonico hex 8-4-4-4-12. byte[] diventa testo base64 — in linea col comportamento di XmlSerializer.

Le union discriminate funzionano?

Sì. Una DU tipo type Status = Active | Suspended of reason: string emette <Active/> per il caso nullario e <Suspended><reason>...</reason></Suspended> per il caso con payload. Il nome del caso diventa il tag dell'elemento — di solito è quello che vuoi per un XML che si allinea a uno schema.

Il mio codice viene salvato?

Il tuo codice viene mandato al backend per la conversione e non viene persistito — non logghiamo il payload. Se l'F# è sensibile (contratti interni, API key nei letterali), rivedilo prima di incollare.

E se l'F# usa computation expression o active pattern?

Quelli non producono campi XML — sono costrutti di controllo di flusso, non dati. Guardiamo le definizioni dei record type e l'istanza popolata, quindi un async { ... } o un match a banana-clip viene ignorato. Sistema prima gli errori di sintassi evidenti, così il parser ha qualcosa di pulito da masticare.

Altri tool che possono servirti

F# to XML è un pezzo del puzzle. Questi si accompagnano bene: