F# zu XML Converter
F#-Records oder -Werte einfügen. Sauberes XML zurückbekommen.
Was dieses Tool macht
Wenn du F# schreibst und irgendwo in der Nähe von .NET-XML-Configs, WCF-Contracts oder einem SOAP-Endpoint arbeitest, kennst du den Schmerz: deine Record-Typen sind sauber und ausdrucksstark, aber das dazugehörige XML von Hand zu klopfen, ist eine Quälerei. Paste das F# hier und du bekommst in einem Durchgang wohlgeformtes XML zurück — einen einzelnen Record, ein gefülltes let-Binding oder ein ganzes Modul mit verschachtelten Records.
Der Converter kennt die F#-Eigenheiten, die dir wirklich wichtig sind. Ein option<string> mit Some "x" wird zu einem normalen Element; None wird zu einem leeren Element, statt einfach verloren zu gehen, damit die XML-Form vorhersagbar bleibt. decimal-Literale (249.99m) verlieren ihren Suffix. list, seq und Arrays werden zu Container-Elementen mit einem Child pro Item — passend zu dem, was System.Xml.Serialization unter der Haube rausschickt, wenn du über .NET round-trippst.
Discriminated Unions werden vernünftig behandelt — der Case-Name landet als Element-Tag, das Payload wird zu Child-Elements. Verschachtelte Records werden inline entfaltet, Tuple-Felder kommen als Sibling-Elements durch, und Map<K,V> wird zu <Entry><Key/><Value/></Entry>-Paaren. Für attributgetriebene Anpassung ([<XmlElement>], [<XmlAttribute>]) schau in die F#-Docs zu .NET-Interop — der Converter respektiert sie, wenn sie da sind.
So benutzt du es
Drei Schritte. Funktioniert gleich, egal ob du einen einzeiligen Record oder ein ganzes Modul paste.
F# einfügen (oder das Beispiel probieren)
Drop das F# in den linken Editor, wie es ist. Ein Record-Typ, ein gefülltes let-Binding, mehrere Records, oder eine Discriminated Union — alles okay. Klick erst auf Beispiel laden, wenn du einen realistischen Fall sehen willst.
Du musst keine open-Statements rausschmeißen und auch die F#-Syntax nicht aufräumen. Lass den Code so, wie er in Rider oder VS Code aussieht. Einfach pasten.
Auf Konvertieren klicken
Klick auf den grünen Konvertieren-Button. Das Tool parst die Records, läuft durch den gefüllten Wert und baut das XML in einem Durchgang. Während es läuft, zeigt ein kurzer Loading-Indicator das an.
Das XML kopieren
Das rechte Panel füllt sich mit eingerücktem, wohlgeformtem XML, das jeder standardkonforme Parser akzeptiert. Paste es direkt in deine app.config, eine SOAP-Fixture, einen XmlSerializer-Round-Trip-Test, oder deine Doku.
Wann das wirklich hilft
.NET-XML-Config-Dateien
Ein F#-Record, der einen Abschnitt aus app.config / web.config modelliert, wird zu einer editierbaren XML-Vorlage — kein Hand-Angle-Brackets-Schreiben mehr.
WCF- und SOAP-Fixtures
Du hast einen F#-Record, der einen WCF-Data-Contract spiegelt. Paste ihn, hol dir den SOAP-geformten Body, rein damit in SoapUI oder Postman.
Fable-Interop mit Legacy-XML-Endpoints
Sprichst du per Fable mit einer älteren XML-API? Paste den geteilten F#-Record und du bekommst den XML-Body, den dein Backend erwartet — mit korrekt behandelten Option-Feldern.
Testdaten für den XmlSerializer
Generiere XML-Seed-Daten, die ohne Überraschungen durch <code>XmlSerializer<T></code> round-trippen — praktisch für Integrationstests, Mock-Server und Regression Suites.
Häufige Fragen
Kann ich mehrere Records auf einmal pasten?
Ja — paste ein ganzes Modul. Jeder Record-Typ kommt mit ausgeklappten verschachtelten Records durch, und mit and verkettete Typdefinitionen werden mitbehandelt. Discriminated-Union-Cases behalten den Case-Namen als Element-Tag.
Wie werden option, None und Defaults behandelt?
Ein option<string> mit Some "x" wird zu einem normalen Element mit dem Text drin. None wird zu einem leeren Element, damit die Form stabil bleibt — du verlierst keine Felder zwischen gefüllten und ungefüllten Records. voption verhält sich genauso.
Was ist mit decimal, DateTime, Guid und den kniffligen Typen?
Decimals (249.99m) verlieren den Suffix und werden zu schlichtem Zahlentext. DateTime, DateTimeOffset und TimeSpan werden zu ISO-8601-Strings. Guid bleibt im kanonischen 8-4-4-4-12-Hex-Format. byte[] wird zu base64-Text — passend zum Verhalten vom XmlSerializer.
Funktionieren Discriminated Unions?
Ja. Eine DU wie type Status = Active | Suspended of reason: string emittiert <Active/> für den nullären Case und <Suspended><reason>...</reason></Suspended> für den Payload-Case. Der Case-Name landet als Element-Tag — meistens genau das, was du für XML willst, das zu einem Schema passt.
Wird mein Code gespeichert?
Dein Code wird zur Konvertierung ans Backend geschickt und nicht persistiert — wir loggen den Payload nicht. Wenn das F# sensibel ist (interne Contracts, API-Keys in Literalen), schau vor dem Pasten nochmal drüber.
Was, wenn das F# Computation Expressions oder Active Patterns nutzt?
Die produzieren keine XML-Felder — das sind Control-Flow-Konstrukte, keine Daten. Wir gucken auf die Record-Typ-Definitionen und die gefüllte Instanz, also wird ein async { ... } oder ein Banana-Clip-Pattern-Match ignoriert. Räum offensichtliche Syntaxfehler erst auf, damit der Parser was Sauberes zu kauen hat.
Weitere Tools, die du vielleicht brauchst
F# zu XML ist ein Puzzle-Teil. Diese passen gut dazu: