Elixir zu XML Konverter
Elixir-Structs oder -Maps einfügen. Sauberes XML zurückbekommen.
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.
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.
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.
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><param><value><struct></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: