Konwerter Rust do XML
Wklej struct Rust albo literał struct. Odbierz czysty XML.
Co robi to narzędzie
Jeśli kiedykolwiek musiałeś ręcznie pisać XML odwzorowujący struct w Rust — do klienta SOAP w serwisie integracyjnym, pliku konfiguracyjnego systemu lub fixture'u testowego — wiesz, ile to kopiowania i wklejania. Wklej tu Rusta, a w jednym przejściu otrzymasz poprawnie uformowany XML. Pojedynczy struct, plik z kilkoma strukturami i enumami, albo wypełniony literał let order = Order { ... }; — efekt ten sam: kompletny dokument XML z każdym polem zachowanym.
To nie jest głupie zastępowanie stringów. Konwerter wie, jak Rust faktycznie serializuje przez serde — mniej więcej tak, jak zrobiłyby to serde-xml-rs albo quick-xml. f64 i f32 wychodzą jako zwykły tekst liczbowy, wartości String są XML-escape'owane, Option<T> z None staje się pustym elementem (albo jest pomijany, gdy ustawiono #[serde(skip_serializing_if = "Option::is_none")]), a Vec<T> trzyma się spójnej formy kontenera — każdy Vec zamienia się w element opakowujący z jednym dzieckiem na pozycję, nazwanym po typie elementu.
Atrybuty serde są respektowane. #[serde(rename = "x")] na polu zmienia nazwę elementu w wyjściu, #[serde(rename = "x")] na struct zmienia nazwę otaczającego roota, #[serde(skip)] wyrzuca pole, a #[serde(flatten)] wyciąga zagnieżdżony struct o jeden poziom wyżej. Enumy są emitowane zgodnie ze standardowymi regułami tagowania serde — domyślnie externally tagged, adjacently lub internally tagged, gdy ustawisz #[serde(tag = "...")]. Jeśli chcesz głębszej wersji, The Rust Book to solidny punkt startu do zrozumienia ownershipa i systemu typów leżącego pod spodem.
Jak z tego korzystać
Trzy kroki. Działa tak samo, czy wklejasz pięciolinijkowy struct, czy cały moduł.
Wklej swojego Rusta (albo wypróbuj przykład)
Rzuć Rusta do edytora po lewej jak leci. Struct, enum, wypełniony literał struct, albo plik z wieloma typami — wszystko jest w porządku. Kliknij Załaduj przykład, jeśli chcesz najpierw zobaczyć realistyczny przypadek.
Nie musisz usuwać instrukcji use, wycinać makr derive ani czyścić adnotacji lifetime. Zostaw kod tak, jak zostawił go rustfmt. Po prostu wklej.
Kliknij Konwertuj
Kliknij zielony przycisk Konwertuj. Narzędzie czyta Rusta, zachowuje każdy struct i każde pole, i buduje XML w jednym przebiegu. Przez chwilę zobaczysz krótki wskaźnik ładowania.
Skopiuj XML
Prawy panel wypełni się wciętym, poprawnie uformowanym XML-em, który przyjmie każdy zgodny ze standardem parser XML. Skopiuj go wprost do swojego żądania SOAP, pliku konfiguracyjnego albo fixture'u testu.
Kiedy to faktycznie się przydaje
Integracja SOAP na poziomie systemowym
Serwisy w Ruście często stoją obok legacy'owych systemów, które wciąż mówią SOAP-em. Wklej struct żądania, wyciągnij ciało XML, przetestuj w SoapUI przed podpięciem klienta HTTP — szybsze niż pisanie envelope'u ręcznie. Skombinuj z cratem z <a href="https://crates.io/" target="_blank" rel="noopener">crates.io</a> typu <code>reqwest</code> do transportu.
Pliki konfiguracyjne dla serwisów i daemonów
Struct ustawień z 30+ polami staje się gotowym do edycji szablonem XML. Żadnego ręcznie pisanego boilerplate'u, żadnych pominiętych pól, gdy struct rośnie.
Wsiew fixture'ów testowych
Zamień wypełnionego <code>let order = Order { ... };</code> z unit testu w plik XML seedujący testy integracyjne, mock serwery albo systemy legacy, których nie jesteś właścicielem.
Utrzymanie dokumentacji w synchronizacji
Generuj przykłady XML do README, dokumentacji crate'u lub dokumentacji schematu opartej o XSD bezpośrednio z prawdziwych structów, żeby dokumentacja trzymała się kodu zamiast od niego odpływać.
Najczęstsze pytania
Mogę wkleić wiele structów naraz?
Tak — wklej cały moduł. Każdy struct lub enum najwyższego poziomu przechodzi z rozwiniętymi typami zagnieżdżonymi i wypełnionymi wartościami domyślnymi. Nic nie jest po cichu porzucane.
Czy respektuje #[serde(rename)] i #[serde(skip)]?
Tak. #[serde(rename = "x")] na polu zmienia nazwę elementu XML, #[serde(rename = "x")] na struct zmienia nazwę otaczającego roota, #[serde(skip)] wyrzuca pole całkowicie, a #[serde(flatten)] wyciąga zagnieżdżony struct o jeden poziom wyżej. #[serde(rename_all = "PascalCase")] jest stosowany do każdego pola w struct. To zgodne z tym, co serde faktycznie robi w runtime.
Jak traktowane są Option<T> i skip_serializing_if?
Wartość None domyślnie staje się pustym elementem — żeby kształt był spójny, a XSD dalej walidowało. Jeśli pole ma #[serde(skip_serializing_if = "Option::is_none")], wartości None są całkowicie odrzucane. Some(x) zawsze serializuje się jako samo x.
A co z enumami, Vec i HashMap?
Enumy domyślnie są externally-tagged (<VariantName>...</VariantName>); dodaj #[serde(tag = "type")], żeby przełączyć na internally-tagged. Vec<T> staje się elementem kontenerem z jednym dzieckiem na pozycję, nazwanym po typie — Vec<OrderItem> items wychodzi jako <items><OrderItem/><OrderItem/></items>. HashMap<K,V> staje się kontenerem <Entry><Key/><Value/></Entry>.
Czy mój kod jest przechowywany?
Twój kod jest wysyłany do backendu dla konwersji i nie jest utrzymywany — nie logujemy payloadu. Jak zawsze z narzędziami online, jeśli kod jest naprawdę wrażliwy, rzuć na niego okiem przed wklejeniem.
A co, jeśli Rust ma lifetime'y, traity lub bloki unsafe?
Adnotacje lifetime są wycinane na potrzeby XML — nie wpływają na wartość w runtime. Definicje traitów opisują kształt, nie treść, więc nie generują XML bezpośrednio; robią to implementujące je structy. Bloki unsafe są ignorowane, bo to konstrukcje czasu wykonania. Jeśli kod ma błędy składniowe, napraw najpierw te oczywiste — parser jest tolerancyjny, ale nie jest jasnowidzem.
Inne narzędzia, które mogą się przydać
Rust do XML to jeden element układanki. Te dobrze się z nim komponują: