Rust till XML-konverterare
Klistra in Rust-structar eller en struct-literal. Få ren XML tillbaka.
Vad det här verktyget gör
Om du någonsin behövt skriva XML för hand som speglar en Rust-struct — till en SOAP-klient i en integrationstjänst, en systemkonfigurationsfil eller en testfixtur — vet du hur mycket klippa-och-klistra det blir. Klistra in Rust-koden här och få välformaterad XML tillbaka i ett svep. En enda struct, en fil med flera structar och enums, eller en ifylld let order = Order { ... };-literal — samma resultat: ett komplett XML-dokument där varje fält finns kvar.
Det här är ingen dum strängersättning. Konverteraren vet hur Rust faktiskt serialiserar via serde — ungefär som serde-xml-rs eller quick-xml skulle skicka ut det. f64 och f32 kommer ut som vanlig numerisk text, String-värden XML-escape:as, en Option<T> med None blir ett tomt element (eller hoppas över när #[serde(skip_serializing_if = "Option::is_none")] är satt), och Vec<T> följer en konsekvent container-form — varje Vec blir ett wrapper-element med ett barn per objekt, namngivet efter elementtypen.
Serde-attribut respekteras. #[serde(rename = "x")] på ett fält döper om elementet i utdatan, #[serde(rename = "x")] på structen döper om den omslutande roten, #[serde(skip)] slänger fältet, och #[serde(flatten)] drar upp en nästlad struct en nivå. Enums skickas ut med serdes standardregler för tagging — externally tagged som default, adjacently eller internally tagged om du sätter #[serde(tag = "...")]. Vill du ha fördjupningen är The Rust Book en bra startpunkt för ownership och typsystemet under huven.
Så här använder du det
Tre steg. Fungerar likadant oavsett om du klistrar in en fem-radig struct eller en hel modul.
Klistra in din Rust (eller prova exemplet)
Kasta in Rust-koden som den är i editorn till vänster. En struct, en enum, en ifylld struct-literal, eller en fil med flera typer — allt funkar. Klicka på Ladda exempel om du vill se ett realistiskt exempel först.
Du behöver inte plocka bort use-satser, skala av derive-makron eller städa lifetime-annoteringar. Låt koden stå som rustfmt lämnade den. Bara klistra in.
Tryck på Konvertera
Klicka på den gröna Konvertera-knappen. Verktyget läser Rust-koden, bevarar varje struct och fält, och bygger XML:en i ett svep. Medan det körs ser du en kort laddningsindikator.
Kopiera XML:en
Den högra panelen fylls med indenterad, välformaterad XML som en standardkompatibel XML-parser accepterar. Kopiera direkt in i din SOAP-request, konfigurationsfil eller testfixtur.
När det här faktiskt kommer till nytta
SOAP-integration på systemnivå
Rust-tjänster står ofta bredvid legacy-system som fortfarande pratar SOAP. Klistra in din request-struct, hämta XML-bodyn, testa i SoapUI innan du drar igång HTTP-klienten — snabbare än att skriva envelope:n för hand. Kombinera med en crate från <a href="https://crates.io/" target="_blank" rel="noopener">crates.io</a> som <code>reqwest</code> för transporten.
Konfigurationsfiler för tjänster och daemoner
En settings-struct med 30+ fält blir en färdig XML-mall att redigera. Ingen handskriven boilerplate, inga missade fält när structen växer.
Seed för testfixturer
Förvandla en ifylld <code>let order = Order { ... };</code> från ett unit-test till en XML-seed-fil för integrationstester, mock-servrar eller legacy-system du inte äger.
Hålla dokumentation i synk
Generera XML-exempel till en README, crate-dokumentation eller XSD-baserad schemadokumentation direkt från dina riktiga structar, så dokumentationen stämmer med koden istället för att glida isär.
Vanliga frågor
Kan jag klistra in flera structar på en gång?
Ja — klistra in en hel modul. Varje top-level struct eller enum kommer igenom med nästlade typer utvecklade och default-värden ifyllda. Inget slängs tyst.
Respekterar den #[serde(rename)] och #[serde(skip)]?
Ja. #[serde(rename = "x")] på ett fält döper om XML-elementet, #[serde(rename = "x")] på structen döper om den omslutande roten, #[serde(skip)] kastar fältet helt, och #[serde(flatten)] drar upp en nästlad struct en nivå. #[serde(rename_all = "PascalCase")] tillämpas på varje fält i structen. Det matchar vad serde faktiskt gör i runtime.
Hur hanteras Option<T> och skip_serializing_if?
Ett None-värde blir ett tomt element som default — så formen förblir konsekvent och XSD:er fortsätter validera. Har fältet #[serde(skip_serializing_if = "Option::is_none")] kastas None-värden helt. Some(x) serialiseras alltid som x självt.
Vad gäller för enums, Vec och HashMap?
Enums är som default externally-tagged (<VariantName>...</VariantName>); lägg till #[serde(tag = "type")] för att byta till internally-tagged. Vec<T> blir ett container-element med ett barn per objekt, namngivet efter typen — en Vec<OrderItem> items blir <items><OrderItem/><OrderItem/></items>. HashMap<K,V> blir en container av <Entry><Key/><Value/></Entry>.
Sparas min kod?
Din kod skickas till backenden för konverteringen och sparas inte — vi loggar inte payloaden. Som alltid med onlineverktyg: är koden verkligen känslig, titta igenom den innan du klistrar in.
Hur blir det om Rust-koden har lifetimes, traits eller unsafe-block?
Lifetime-annoteringar strippas för XML — de påverkar inte runtime-värdet. Trait-definitioner beskriver form, inte innehåll, så de producerar inte XML direkt; det gör structarna som implementerar dem. Unsafe-block ignoreras eftersom det är konstruktioner för exekvering. Har koden syntaxfel, fixa de uppenbara först — parsern är förlåtande men inte tankeläsare.
Andra verktyg du kan behöva
Rust till XML är en pusselbit. De här matchar bra: