Wklej F# po lewej i kliknij "Konwertuj" — zmienimy to w XMLWklej kod F#

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ł.

1

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.

2

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.

3

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&lt;T&gt;</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ą: