Rust zu XML Konverter
Rust Structs oder ein Struct-Literal einfügen. Sauberes XML zurückbekommen.
Was dieses Tool macht
Wenn du jemals XML von Hand schreiben musstest, das ein Rust-Struct widerspiegelt — für einen SOAP-Client in einem Integrations-Service, eine System-Konfigurationsdatei oder eine Test-Fixture — weißt du, wie viel Copy-Paste das bedeutet. Füge den Rust-Code hier ein und bekomme wohlgeformtes XML in einem Rutsch zurück. Ein einzelnes Struct, eine Datei mit mehreren Structs und Enums oder ein befülltes let order = Order { ... };-Literal — gleiches Ergebnis: ein vollständiges XML-Dokument, bei dem jedes Feld erhalten bleibt.
Das ist keine stumpfe String-Ersetzung. Der Konverter weiß, wie Rust tatsächlich über serde serialisiert — ungefähr so, wie serde-xml-rs oder quick-xml es ausgeben würden. f64 und f32 kommen als schlichter numerischer Text raus, String-Werte werden XML-escaped, Option<T> mit None wird zu einem leeren Element (oder fällt ganz weg, wenn #[serde(skip_serializing_if = "Option::is_none")] gesetzt ist), und Vec<T> folgt einer konsistenten Container-Form — jeder Vec wird zu einem Wrapper-Element mit einem Kind pro Item, benannt nach dem Element-Typ.
Serde-Attribute werden berücksichtigt. #[serde(rename = "x")] an einem Feld benennt das Element in der Ausgabe um, #[serde(rename = "x")] am Struct benennt den umschließenden Root um, #[serde(skip)] wirft das Feld raus, und #[serde(flatten)] zieht ein verschachteltes Struct eine Ebene hoch. Enums werden mit den Standard-Tagging-Regeln von serde ausgegeben — standardmäßig externally tagged, adjacently oder internally tagged, wenn du #[serde(tag = "...")] setzt. Wenn du die tiefe Version willst, ist The Rust Book ein solider Ausgangspunkt für Ownership und das darunterliegende Typsystem.
Wie es funktioniert
Drei Schritte. Funktioniert gleich, ob du ein fünfzeiliges Struct oder ein komplettes Modul einfügst.
Rust einfügen (oder das Beispiel ausprobieren)
Wirf deinen Rust-Code einfach in den linken Editor. Ein Struct, ein Enum, ein befülltes Struct-Literal, oder eine Datei mit mehreren Typen — alles in Ordnung. Klick auf Beispiel laden, wenn du zuerst ein realistisches Beispiel sehen willst.
Du musst keine use-Statements entfernen, keine Derive-Makros abbauen oder Lifetime-Annotationen aufräumen. Lass den Code so, wie rustfmt ihn hinterlassen hat. Einfach einfügen.
Konvertieren klicken
Klick auf den grünen Konvertieren-Button. Das Tool liest den Rust-Code, behält jedes Struct und jedes Feld und baut das XML in einem Rutsch. Während es läuft siehst du eine kurze Ladeanzeige.
XML kopieren
Das rechte Panel füllt sich mit eingerücktem, wohlgeformtem XML, das jeder standardkonforme XML-Parser akzeptiert. Kopier es direkt in deinen SOAP-Request, deine Config-Datei oder deine Test-Fixture.
Wann das wirklich hilft
SOAP-Integration auf Systemebene
Rust-Services stehen oft neben Legacy-Systemen, die immer noch SOAP sprechen. Request-Struct einfügen, XML-Body abgreifen, in SoapUI testen bevor du den HTTP-Client verdrahtest — schneller als den Envelope von Hand zu schreiben. Kombiniere mit einem Crate aus <a href="https://crates.io/" target="_blank" rel="noopener">crates.io</a> wie <code>reqwest</code> für den Transport.
Config-Dateien für Services und Daemons
Ein Settings-Struct mit 30+ Feldern wird zu einem sofort editierbaren XML-Template. Kein handgeschriebenes Boilerplate, keine vergessenen Felder, wenn das Struct wächst.
Seed für Test-Fixtures
Verwandle ein befülltes <code>let order = Order { ... };</code> aus einem Unit-Test in eine XML-Seed-Datei für Integrationstests, Mock-Server oder Legacy-Systeme, die dir nicht gehören.
Dokumentation im Einklang halten
Generiere XML-Beispiele für ein README, Crate-Docs oder XSD-gestützte Schema-Dokumentation direkt aus deinen echten Structs, damit die Doku zum Code passt statt auseinanderzudriften.
Häufige Fragen
Kann ich mehrere Structs auf einmal einfügen?
Ja — füge ein ganzes Modul ein. Jedes Top-Level-Struct oder -Enum kommt durch, mit verschachtelten Typen ausgeklappt und Default-Werten eingetragen. Nichts wird stillschweigend verworfen.
Berücksichtigt es #[serde(rename)] und #[serde(skip)]?
Ja. #[serde(rename = "x")] an einem Feld benennt das XML-Element um, #[serde(rename = "x")] am Struct benennt den umschließenden Root um, #[serde(skip)] wirft das Feld komplett raus, und #[serde(flatten)] zieht ein verschachteltes Struct eine Ebene hoch. #[serde(rename_all = "PascalCase")] wird auf jedes Feld im Struct angewendet. Das entspricht dem, was serde zur Laufzeit tatsächlich macht.
Wie wird Option<T> und skip_serializing_if behandelt?
Ein None-Wert wird standardmäßig zu einem leeren Element — so bleibt die Form konsistent und XSDs validieren weiterhin. Hat das Feld #[serde(skip_serializing_if = "Option::is_none")], werden None-Werte komplett entfernt. Some(x) wird immer als x selbst serialisiert.
Was ist mit Enums, Vec und HashMap?
Enums sind standardmäßig externally-tagged (<VariantName>...</VariantName>); füge #[serde(tag = "type")] hinzu, um auf internally-tagged umzuschalten. Vec<T> wird zu einem Container-Element mit einem Kind pro Item, benannt nach dem Element-Typ — ein Vec<OrderItem> items wird zu <items><OrderItem/><OrderItem/></items>. HashMap<K,V> wird zu einem Container aus <Entry><Key/><Value/></Entry>.
Wird mein Code gespeichert?
Dein Code wird zur Konvertierung ans Backend geschickt und nicht persistiert — wir loggen das Payload nicht. Wie immer bei Online-Tools gilt: Wenn der Code wirklich sensibel ist, schau ihn dir vor dem Einfügen an.
Was, wenn der Rust-Code Lifetimes, Traits oder unsafe-Blöcke enthält?
Lifetime-Annotationen werden für XML-Zwecke rausgestrippt — sie wirken sich nicht auf den Laufzeitwert aus. Trait-Definitionen beschreiben Form, nicht Inhalt, also erzeugen sie nicht direkt XML; die implementierenden Structs schon. Unsafe-Blöcke werden ignoriert, weil sie Konstrukte der Ausführungszeit sind. Wenn der Code Syntaxfehler hat, behebe die offensichtlichen zuerst — der Parser ist tolerant, aber kein Hellseher.
Andere Tools, die du vielleicht brauchst
Rust zu XML ist ein Puzzlestück. Diese passen gut dazu: