Links Elixir einfügen und auf "Konvertieren" klicken — wir machen XML darausElixir-Code einfügen

Was dieses Tool macht

Du verbindest eine Elixir-App mit einem alten SOAP-Endpoint oder baust eine Fixture für einen XML-RPC-Integrationstest, und du hast den Struct, aber nicht den Envelope. XmlBuilder.element/3-Aufrufe für jedes Feld per Hand zu schreiben wird schnell öde. Elixir hier einfügen — ein einzelnes %Order{}-Literal, ein defmodule mit einem defstruct oder eine ganze Datei mit mehreren Modulen — und du bekommst wohlgeformtes XML in einem Rutsch. Dieselbe Form, die XmlBuilder bauen würde, ohne Zeremoniell.

Der Konverter kennt die Elixir-Semantik. Atome verlieren den führenden Doppelpunkt — :is_paid als Map-Key wird zum Elementnamen is_paid, und true / false bleiben Text. Decimal.new("249.99") verliert den Wrapper und wird zu 249.99. DateTime, NaiveDateTime und Date kommen als ISO-8601-Strings raus. Verschachtelte Structs (ein %Order{} mit einem shipping_address: %Address{}-Feld) werden an Ort und Stelle expandiert, und nil-Werte werden zu leeren Elementen statt weggelassen. Keyword-Listen wie [sku: "SKU-101", qty: 2] werden genauso behandelt wie die entsprechende Map.

Listen werden zu Container-Elementen mit einem Kind pro Item, benannt nach dem Struct-Typ: ein items: [%OrderItem{}, %OrderItem{}]-Feld wird zu <items><OrderItem/><OrderItem/></items>. Das passt dazu, wie SweetXml XML zurück in Elixir liest und was die darunterliegende xmerl-Bibliothek erwartet. Tupel bekommen einen <tuple>-Wrapper mit positionierten Kindern. Wenn du mehrere defmodule-Blöcke einfügst, landet jedes defstruct in der Ausgabe. Einfach so einfügen, wie es in deiner .ex- oder .exs-Datei steht — kein Aufräumen nötig.

So wird es benutzt

Drei Schritte. Funktioniert gleich, egal ob du einen Struct oder eine ganze Phoenix-Context-Datei einfügst.

1

Elixir einfügen (oder das Beispiel probieren)

Dein Elixir in den linken Editor werfen, so wie es ist. Ein defstruct, ein %Struct{}-Literal, eine schlichte Map, eine Keyword-Liste oder verschachtelte Structs — alles okay. Klicke auf Beispiel laden für ein realistisches Order / OrderItem / Address-Beispiel.

Du musst weder @moduledoc entfernen, @derive-Annotationen rausnehmen noch Pipes und Kommentare aufräumen. Den Elixir-Code so einfügen, wie er in deinem Editor aussieht.

2

Konvertieren drücken

Den grünen Konvertieren-Button anklicken. Das Tool liest das Elixir, behält alle Felder, bewahrt verschachtelte Structs und baut das XML in einem Rutsch. Eine kurze Ladeanzeige läuft während der Arbeit.

3

XML kopieren

Das rechte Panel füllt sich mit eingerücktem, wohlgeformtem XML. Kopiere es direkt in einen SOAP-Request-Body, einen XML-RPC-Call, eine Test-Fixture oder die Seed-Datei deiner Integrationssuite.

Wann es wirklich nützlich ist

Phoenix-Apps, die mit SOAP-Diensten reden

Dein Phoenix-Context gibt dir einen hübschen <code>%Order{}</code>. Der nachgelagerte Anbieter spricht nur SOAP. Struct einfügen, XML-Envelope-Body rausholen, in den Request packen — kein Hand-Stricken von <code>XmlBuilder</code>-Bäumen.

XML-RPC-Integrationen

Alte WordPress-Plugins, Legacy-CMS-Systeme, Finanz-Feeds — alle sprechen noch XML-RPC. Elixir-Struct in die <code>&lt;param&gt;&lt;value&gt;&lt;struct&gt;</code>-Form bringen, die die Spec erwartet, bereit zum Durchpipen durch <code>HTTPoison</code>.

Legacy-Enterprise-Integrationen

Bank-Dateien, EDI-Feeds, HL7-artige Healthcare-Payloads. Wenn ein Partner auf XML besteht, das Elixir-Modell einfügen, das du schon hast, und ein passendes XML-Template rausholen — schneller als mit <code>xmerl</code> von Grund auf zu kämpfen.

Fixtures für SweetXml-Round-Trips

Schreibst du einen Test, der XML mit SweetXml liest und mit einem Struct vergleicht? Struct einfügen, XML rausholen, als Fixture speichern. Der Round-Trip bleibt konsistent.

Häufige Fragen

Kann ich mehrere defmodule / defstruct Blöcke auf einmal einfügen?

Ja. Eine ganze Datei einfügen. Jedes defstruct kommt mit seinen Feldern intakt durch, und verschachtelte Struct-Referenzen werden expandiert. Wenn du unten ein %Struct{}-Literal mit echten Werten mitschickst, verwendet die Ausgabe diese Werte — sonst gibt sie die Form mit leeren Elementen aus.

Wie werden Atome behandelt?

Atome, die als Map-/Struct-Keys benutzt werden, werden zu Elementnamen (der führende Doppelpunkt fällt weg — :is_paid wird zu is_paid). Atom-Werte, die Booleans sind (true, false, nil), werden zum entsprechenden Text. Andere Atome werden als Text ohne Doppelpunkt ausgegeben (:pending wird zu pending). Wenn du die originale Atom-Syntax brauchst, nach dem Parsen mit String.to_atom/1 nachbearbeiten.

Was ist mit Decimal, DateTime, Date, NaiveDateTime?

Decimal.new("249.99") verliert den Wrapper und wird zu 249.99. DateTime, NaiveDateTime und Date kommen als ISO-8601-Strings raus. Time wird zu HH:MM:SS. nil-Werte werden zu leeren Elementen statt weggelassen zu werden — so bleibt die Form für Round-Trips mit SweetXml konsistent.

Wie werden Listen, Tupel und Keyword-Listen übersetzt?

Listen von Structs werden zu Container-Elementen mit einem Kind pro Item, benannt nach dem Struct: items: [%OrderItem{}, ...] wird zu <items><OrderItem/><OrderItem/></items>. Listen von Skalaren werden zu <item>-Kindern im Container. Tupel bekommen einen <tuple>-Wrapper mit positionierten Kindern <_0/>, <_1/>. Keyword-Listen werden wie Maps behandelt — jeder Key wird zu einem Kind-Element.

Was, wenn mein Struct @derive für Jason / Poison nutzt?

Die @derive-Annotation ist ein Compile-Time-Hinweis für JSON-Bibliotheken und beeinflusst die XML-Ausgabe nicht. Alle Struct-Felder werden standardmäßig ausgegeben. Wenn du ein Feld weglassen willst, nimm es vor dem Einfügen aus der defstruct-Liste raus oder wickle den Wert in etwas, das der Konverter als "überspringen" erkennen kann.

Wird mein Code gespeichert?

Dein Code wird zur Konvertierung ans Backend geschickt und nicht persistiert — wir loggen den Payload nicht. Wie immer bei Online-Tools: wenn der Code wirklich sensibel ist, schau drüber, bevor du ihn einfügst.

Andere Tools, die du brauchen könntest

Elixir zu XML ist ein Puzzleteil. Diese Tools passen gut dazu: