Konwerter F# na XML
Wklej recordy albo wartości F#. Dostajesz czysty XML.
Co robi to narzędzie
Jeśli piszesz w F# i ocierasz się o konfigi .NET XML, kontrakty WCF czy endpointy SOAP, to znasz ten ból: twoje record-y są czyste i wyraziste, ale ręczne klepanie XML-a pod nie to katorga. Wklej F# tutaj i dostajesz dobrze sformułowany XML w jednym przebiegu — pojedynczy record, wypełniony let binding albo cały moduł z zagnieżdżonymi recordami.
Konwerter zna te kwirki F#, o które ci naprawdę chodzi. option<string> z Some "x" staje się zwykłym elementem; None zamiast zniknąć, zostaje pustym elementem, więc kształt XML-a pozostaje przewidywalny. Literały decimal (249.99m) tracą suffix. list, seq i tablice stają się elementami-kontenerami z jednym dzieckiem na item — zgodnie z tym, co System.Xml.Serialization wypluwa pod spodem, kiedy robisz round-trip przez .NET.
Discriminated uniony są ogarniane rozsądnie — nazwa case'a trafia jako tag elementu, a payload staje się dziećmi. Zagnieżdżone recordy rozwijają się inline, pola krotek wychodzą jako rodzeństwo, a Map<K,V> staje się parami <Entry><Key/><Value/></Entry>. Dla customizacji sterowanej atrybutami ([<XmlElement>], [<XmlAttribute>]) zajrzyj do docsów F# o interopie z .NET — konwerter respektuje je, gdy są obecne.
Jak tego użyć
Trzy kroki. Działa tak samo, czy wklejasz record w jednej linii, czy cały moduł.
Wklej swój F# (albo wypróbuj przykład)
Wrzuć F# jak leci do lewego edytora. Record type, wypełniony let binding, kilka recordów albo discriminated union — wszystko gra. Kliknij Załaduj przykład, żeby najpierw zobaczyć realistyczny przypadek.
Nie musisz wywalać open-ów ani czyścić składni F#. Zostaw kod tak, jak wygląda w Riderze albo VS Code. Po prostu wklej.
Kliknij Konwertuj
Kliknij zielony przycisk Konwertuj. Narzędzie parsuje recordy, przechodzi przez wypełnioną wartość i buduje XML w jednym przebiegu. Podczas pracy pojawia się krótki wskaźnik ładowania.
Skopiuj XML
Prawy panel zapełnia się wcięciowym, dobrze sformułowanym XML-em, który przyjmie dowolny parser zgodny ze standardem. Wklej go prosto do app.config, do fixture'a SOAP, do testu round-trip z XmlSerializer-em, albo do docsów.
Kiedy to naprawdę ratuje skórę
Pliki konfiguracyjne XML .NET
Record F#, który modeluje sekcję app.config / web.config, zamienia się w gotowy do edycji szablon XML — bez klepania angle bracketów ręcznie.
Fixture WCF i SOAP
Masz record F# odzwierciedlający WCF data contract. Wklej, weź body w formie SOAP, wrzuć do SoapUI albo Postmana.
Interop Fable z legacyowymi endpointami XML
Używasz Fable, żeby gadać ze starszym XML API? Wklej współdzielony record F# i dostań body XML, którego spodziewa się twój backend — z polami option obsłużonymi poprawnie.
Dane testowe dla XmlSerializera
Wygeneruj dane seed w XML, które bez niespodzianek robią round-trip przez <code>XmlSerializer<T></code> — przydaje się w testach integracyjnych, mock-serverach i suitach regresji.
Częste pytania
Mogę wkleić kilka recordów naraz?
Tak — wklej cały moduł. Każdy record type przechodzi z rozwiniętymi zagnieżdżonymi recordami, a definicje typów łączone przez and też są ogarniane. Case'y discriminated unionów zachowują nazwę case'a jako tag elementu.
Jak obsługuje option, None i wartości domyślne?
option<string> z Some "x" staje się zwykłym elementem zawierającym tekst. None staje się pustym elementem, więc kształt pozostaje stabilny — nie zgubisz pól między wypełnionymi a niewypełnionymi recordami. voption zachowuje się tak samo.
A decimal, DateTime, Guid i inne wredne typy?
Decimale (249.99m) tracą suffix i stają się zwykłym tekstem numerycznym. DateTime, DateTimeOffset i TimeSpan stają się stringami ISO-8601. Guid zostaje w kanonicznym hex-formacie 8-4-4-4-12. byte[] staje się tekstem base64 — zgodnie z zachowaniem XmlSerializera.
Discriminated uniony działają?
Tak. DU w stylu type Status = Active | Suspended of reason: string emituje <Active/> dla case'a bez argumentów i <Suspended><reason>...</reason></Suspended> dla case'a z payloadem. Nazwa case'a ląduje jako tag elementu — zazwyczaj właśnie tego chcesz dla XML-a, który pasuje do schematu.
Czy mój kod jest przechowywany?
Twój kod leci do backendu do konwersji i nie jest persystowany — nie logujemy payloadu. Jak F# jest wrażliwy (wewnętrzne kontrakty, klucze API w literalach), rzuć na to okiem przed wklejeniem.
Co jeśli F# używa computation expression albo active patternów?
One nie produkują pól XML — to konstrukcje sterowania przepływem, nie dane. Patrzymy na definicje record typów i wypełnioną instancję, więc async { ... } albo pattern match w stylu banana-clip jest olewany. Naprawić najpierw oczywiste błędy składni, żeby parser miał coś czystego do chrupania.
Inne narzędzia, które mogą ci się przydać
F# na XML to jeden kawałek układanki. Te dobrze z nim grają: