Conversor de F# para XML
Cole records ou valores F#. Recebe XML limpo de volta.
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.
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.
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.
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<T></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: