Elixir naar XML Converter
Plak Elixir-structs of -maps. Krijg schone XML terug.
Wat deze tool doet
Je bent een Elixir-app aan het koppelen aan een oude SOAP-endpoint, of je bouwt een fixture voor een XML-RPC-integratietest, en je hebt de struct maar niet de envelope. XmlBuilder.element/3-aanroepen voor elk veld met de hand schrijven wordt snel saai. Plak de Elixir hier — een enkele %Order{}-literal, een defmodule met een defstruct, of een heel bestand met meerdere modules — en je krijgt welgevormde XML terug in één keer. Dezelfde vorm die XmlBuilder zou bouwen, zonder het ceremonieel.
De converter kent de semantiek van Elixir. Atoms verliezen de leidende dubbele punt — :is_paid als map-key wordt de elementnaam is_paid, en true / false blijven als tekst staan. Decimal.new("249.99") verliest de wrapper en wordt 249.99. DateTime, NaiveDateTime en Date komen eruit als ISO-8601-strings. Geneste structs (een %Order{} met een shipping_address: %Address{}-veld) worden ter plekke uitgevouwen, en nil-waarden worden lege elementen in plaats van weggegooid te worden. Keyword lists als [sku: "SKU-101", qty: 2] worden hetzelfde behandeld als de equivalente map.
Lijsten worden container-elementen met één kind per item, genoemd naar het struct-type: een veld items: [%OrderItem{}, %OrderItem{}] wordt <items><OrderItem/><OrderItem/></items>. Dat sluit aan bij de manier waarop SweetXml XML terugleest naar Elixir en wat de onderliggende xmerl-bibliotheek verwacht. Tuples krijgen een <tuple>-wrapper met positionele kinderen. Als je meerdere defmodule-blokken plakt, belandt elke defstruct in de output. Plak het zoals het in je .ex- of .exs-bestand staat — geen opschoning nodig.
Hoe gebruik je het
Drie stappen. Werkt hetzelfde of je nu één struct plakt of een heel Phoenix-contextbestand.
Plak je Elixir (of probeer het voorbeeld)
Gooi je Elixir zoals het is in de linker editor. Een defstruct, een %Struct{}-literal, een gewone map, een keyword list of geneste structs — allemaal prima. Klik op Voorbeeld laden voor een realistisch Order / OrderItem / Address-voorbeeld.
Je hoeft @moduledoc niet weg te halen, @derive-annotaties niet te verwijderen en pipes en commentaren niet op te schonen. Plak de Elixir-code zoals hij in je editor staat.
Klik op Converteren
Klik op de groene knop Converteren. De tool leest de Elixir, behoudt elk veld, laat geneste structs in tact en bouwt de XML in één keer. Een korte laadindicator loopt terwijl het werkt.
Kopieer de XML
Het rechter paneel vult zich met ingesprongen, welgevormde XML. Kopieer het direct in een SOAP-request-body, een XML-RPC-aanroep, een testfixture of het seed-bestand van je integratiesuite.
Wanneer het echt van pas komt
Phoenix-apps die met SOAP-services praten
Je Phoenix-context geeft je een keurige <code>%Order{}</code>. De downstream-leverancier spreekt alleen SOAP. Plak de struct, krijg de XML-envelope-body, plak die in de request — geen handwerk met <code>XmlBuilder</code>-bomen.
XML-RPC-integraties
Oude WordPress-plug-ins, legacy CMS-systemen, financiële feeds — allemaal praten ze nog XML-RPC. Zet je Elixir-struct om in de <code><param><value><struct></code>-vorm die de spec verwacht, klaar om door <code>HTTPoison</code> te pipen.
Legacy enterprise-integraties
Bankbestanden, EDI-feeds, HL7-achtige healthcare-payloads. Als een partner op XML staat, plak het Elixir-model dat je al hebt en krijg een passend XML-template terug — sneller dan worstelen met <code>xmerl</code> vanaf nul.
Fixtures voor SweetXml-round-trips
Schrijf je een test die XML met SweetXml leest en met een struct vergelijkt? Plak de struct, krijg de XML, sla hem op als fixture. De round-trip blijft consistent.
Veelgestelde vragen
Kan ik meerdere defmodule / defstruct-blokken tegelijk plakken?
Ja. Plak een heel bestand. Elk defstruct komt er met zijn velden intact doorheen, en verwijzingen naar geneste structs worden uitgevouwen. Als je onderaan een %Struct{}-literal meelevert met echte waarden, gebruikt de output die waarden — anders geeft hij de vorm met lege elementen.
Hoe worden atoms behandeld?
Atoms die als map-/struct-keys gebruikt worden, worden elementnamen (de leidende dubbele punt valt weg — :is_paid wordt is_paid). Atom-waarden die booleans zijn (true, false, nil) worden de bijbehorende tekst. Andere atoms worden als tekst zonder de dubbele punt uitgegeven (:pending wordt pending). Heb je de originele atom-syntaxis nodig, verwerk dan na het parsen met String.to_atom/1.
En Decimal, DateTime, Date, NaiveDateTime?
Decimal.new("249.99") verliest de wrapper en wordt 249.99. DateTime, NaiveDateTime en Date komen eruit als ISO-8601-strings. Time wordt HH:MM:SS. nil-waarden worden lege elementen in plaats van weggegooid te worden — zo blijft de vorm consistent voor round-trips met SweetXml.
Hoe worden lijsten, tuples en keyword lists vertaald?
Lijsten van structs worden container-elementen met één kind per item, genoemd naar de struct: items: [%OrderItem{}, ...] wordt <items><OrderItem/><OrderItem/></items>. Lijsten van scalars worden <item>-kinderen binnen de container. Tuples krijgen een <tuple>-wrapper met positionele kinderen <_0/>, <_1/>. Keyword lists worden behandeld als maps — elke key wordt een kind-element.
Wat als mijn struct @derive voor Jason / Poison gebruikt?
De @derive-annotatie is een compile-time-hint voor JSON-bibliotheken en heeft geen effect op de XML-output. Alle struct-velden worden standaard uitgegeven. Wil je een veld weglaten, haal het dan vóór het plakken uit de defstruct-lijst, of wikkel de waarde in iets dat de converter als "skip" kan herkennen.
Wordt mijn code opgeslagen?
Je code wordt naar de backend gestuurd voor conversie en wordt niet bewaard — we loggen de payload niet. Zoals altijd met online tools: als de code echt gevoelig is, bekijk hem dan even voor je plakt.
Andere tools die je kunt gebruiken
Elixir naar XML is een stukje van de puzzel. Deze tools passen er goed bij: