Cole F# à esquerda e clica em "Converter" — transformamos em XMLCole o código F#

O que esta ferramenta faz

Se você escreve F# e trabalha perto de arquivos de config .NET XML, contratos WCF ou endpoints SOAP, já conhece a dor: seus records são limpos e expressivos, mas escrever o XML equivalente na mão é uma maratona. Cole o F# aqui e receba XML bem formado numa passada só — um record, um let binding preenchido, ou um módulo inteiro com records aninhados.

O conversor conhece as peculiaridades de F# com que você realmente se importa. Um option<string> com Some "x" vira um elemento normal; None vira um elemento vazio em vez de ser descartado, então o formato do XML fica previsível. Literais decimal (249.99m) perdem o sufixo. list, seq e arrays viram elementos contêiner com um filho por item — batendo com o que o System.Xml.Serialization emite por baixo quando você faz round-trip em .NET.

Uniões discriminadas são tratadas com bom senso — o nome do caso vira a tag do elemento e o payload vira elementos filhos. Records aninhados se expandem inline, campos de tupla saem como elementos irmãos, e Map<K,V> vira pares <Entry><Key/><Value/></Entry>. Para customização via atributos ([<XmlElement>], [<XmlAttribute>]), dá uma olhada nos docs de F# sobre interop com .NET — o conversor respeita quando estão presentes.

Como usar

Três passos. Funciona igual colando um record de uma linha ou um módulo inteiro.

1

Cole seu F# (ou experimente o exemplo)

Solta o F# do jeito que está no editor da esquerda. Um record type, um let binding preenchido, vários records, ou uma união discriminada — tudo bem. Clica em Carregar exemplo para um caso realista primeiro.

Não precisa remover os open ou arrumar a sintaxe F#. Deixa o código do jeito que aparece no Rider ou VS Code. Cole e pronto.

2

Clica em Converter

Clica no botão verde Converter. A ferramenta faz o parse dos records, percorre o valor preenchido e monta o XML numa passada. Um indicador de carregamento curto aparece enquanto trabalha.

3

Copia o XML

O painel da direita enche de XML indentado e bem formado que qualquer parser padrão aceita. Cola direto no seu app.config, numa fixture SOAP, num teste de round-trip XmlSerializer, ou nos seus docs.

Quando isso realmente ajuda

Arquivos de config XML .NET

Um record F# que modela uma seção de app.config / web.config vira um template XML pronto para editar — sem escrever angle brackets na mão.

Fixtures WCF e SOAP

Você tem um record F# que espelha um data contract WCF. Cola, pega o body no formato SOAP, joga no SoapUI ou Postman.

Interop Fable com endpoints XML legados

Usando Fable para falar com uma API XML antiga? Cola o record F# compartilhado e pega o body XML que seu backend espera, com os campos option tratados certinho.

Dados de teste para XmlSerializer

Gere dados XML que fazem round-trip limpo com <code>XmlSerializer&lt;T&gt;</code> sem surpresas — ajuda em testes de integração, mock servers e suites de regressão.

Perguntas comuns

Posso colar vários records de uma vez?

Sim — cole um módulo inteiro. Cada record passa com os records aninhados expandidos e as definições de tipo encadeadas com and tratadas. Os casos de união discriminada mantêm o nome do caso como tag do elemento.

Como ele trata option, None e valores padrão?

Um option<string> com Some "x" vira um elemento normal com o texto dentro. None vira um elemento vazio para o formato ficar estável — você não perde campos entre records preenchidos e não preenchidos. voption se comporta igual.

E decimal, DateTime, Guid e os tipos chatinhos?

Decimals (249.99m) perdem o sufixo e viram texto numérico puro. DateTime, DateTimeOffset e TimeSpan viram strings ISO-8601. Guid fica no formato hex canônico 8-4-4-4-12. byte[] vira texto base64 — combina com o comportamento do XmlSerializer.

Uniões discriminadas funcionam?

Sim. Uma DU tipo type Status = Active | Suspended of reason: string emite <Active/> para o caso sem argumentos e <Suspended><reason>...</reason></Suspended> para o caso com payload. O nome do caso vira a tag do elemento — normalmente é o que você quer para um XML que bate com um schema.

Meu código é armazenado?

Seu código é enviado ao backend para a conversão e não é persistido — não logamos o payload. Se o F# é sensível (contratos internos, chaves de API em literais), revisa antes de colar.

E se o F# usa computation expressions ou active patterns?

Esses não produzem campos XML — são construções de controle de fluxo, não dados. A gente olha as definições de tipo record e a instância preenchida, então um async { ... } ou pattern match banana-clip é ignorado. Arrume os erros de sintaxe óbvios primeiro para o parser ter algo limpo para mastigar.

Outras ferramentas que podem ajudar

F# para XML é uma peça do quebra-cabeça. Estas combinam bem: