Konwerter Elixir na XML
Wklej structy lub mapy Elixira. Dostań czysty XML.
Co robi to narzędzie
Podpinasz aplikację Elixir do starego endpointu SOAP albo szykujesz fixture do testu integracyjnego XML-RPC, a masz struct, ale nie kopertę. Pisanie ręcznie wywołań XmlBuilder.element/3 dla każdego pola szybko się nudzi. Wklej Elixira tutaj — pojedynczy literał %Order{}, defmodule z defstruct albo cały plik z kilkoma modułami — i dostaniesz dobrze uformowany XML za jednym zamachem. Tę samą postać, którą zbudowałby XmlBuilder, bez ceremoniału.
Konwerter rozumie semantykę Elixira. Atomy tracą dwukropek z przodu — :is_paid jako klucz mapy staje się nazwą elementu is_paid, a true / false zostają jako tekst. Decimal.new("249.99") traci wrapper i staje się 249.99. DateTime, NaiveDateTime i Date wychodzą jako ciągi ISO-8601. Zagnieżdżone struct (np. %Order{} z polem shipping_address: %Address{}) rozwijają się w miejscu, a wartości nil stają się pustymi elementami zamiast być wyrzucane. Keyword listy w stylu [sku: "SKU-101", qty: 2] traktowane są tak samo jak równoważna mapa.
Listy stają się elementami kontenerowymi z jednym dzieckiem na pozycję, nazwanymi według typu struct: pole items: [%OrderItem{}, %OrderItem{}] zamienia się w <items><OrderItem/><OrderItem/></items>. To pasuje do tego, jak SweetXml czyta XML z powrotem do Elixira i do tego, czego oczekuje biblioteka xmerl pod spodem. Krotki dostają wrapper <tuple> z dziećmi pozycyjnymi. Jeśli wkleisz kilka bloków defmodule, każdy defstruct ląduje w wyniku. Wklej to tak, jak siedzi w twoim pliku .ex lub .exs — nic nie trzeba sprzątać.
Jak tego używać
Trzy kroki. Działa tak samo, czy wkleisz jednego structa, czy cały plik kontekstu Phoenix.
Wklej swój Elixir (albo wypróbuj przykład)
Wrzuć Elixira do lewego edytora jak leci. defstruct, literał %Struct{}, zwykła mapa, keyword lista albo zagnieżdżone struct — wszystko OK. Kliknij Wczytaj przykład, żeby zobaczyć realistyczne Order / OrderItem / Address.
Nie musisz usuwać @moduledoc, czyścić adnotacji @derive ani porządkować pipe’ów i komentarzy. Wklej kod Elixira tak, jak wygląda w twoim edytorze.
Kliknij Konwertuj
Naciśnij zielony przycisk Konwertuj. Narzędzie czyta Elixira, zachowuje każde pole, utrzymuje zagnieżdżone struct i buduje XML za jednym zamachem. Przez chwilę leci krótki wskaźnik ładowania.
Skopiuj XML
Prawy panel wypełni się wcięciowanym, dobrze uformowanym XML-em. Skopiuj go prosto do ciała żądania SOAP, wywołania XML-RPC, fixture’a testowego albo pliku seed twojego zestawu integracyjnego.
Kiedy się naprawdę przydaje
Aplikacje Phoenix rozmawiające z usługami SOAP
Twój kontekst Phoenix daje ci ładnego <code>%Order{}</code>. Dostawca po drugiej stronie mówi tylko SOAP-em. Wklej structa, weź body koperty XML, wrzuć do żądania — bez ręcznego klecenia drzew <code>XmlBuilder</code>.
Integracje XML-RPC
Stare wtyczki WordPressa, legacy CMS-y, feedy finansowe — wszystkie nadal mówią XML-RPC. Przerób swojego Elixir structa na formę <code><param><value><struct></code>, której oczekuje spec, gotową do wrzucenia w <code>HTTPoison</code>.
Legacy integracje korporacyjne
Pliki bankowe, feedy EDI, payloady zdrowotne w stylu HL7. Jeśli partner upiera się przy XML-u, wklej model Elixira, który już masz, i dostań pasujący szablon XML — szybciej niż walka z <code>xmerl</code> od zera.
Fixture’y do round-tripów SweetXml
Piszesz test, który czyta XML przez SweetXml i porównuje go ze structem? Wklej structa, weź XML, zapisz jako fixture. Round-trip zostaje spójny.
Częste pytania
Czy mogę wkleić wiele bloków defmodule / defstruct naraz?
Tak. Wklej cały plik. Każdy defstruct przechodzi z polami w całości, a odwołania do zagnieżdżonych struct są rozwijane. Jeśli na dole dodasz literał %Struct{} z prawdziwymi wartościami, wynik użyje tych wartości — inaczej emituje formę z pustymi elementami.
Jak obsługiwane są atomy?
Atomy używane jako klucze map/struct stają się nazwami elementów (dwukropek z przodu znika — :is_paid staje się is_paid). Wartości atomowe będące booleanami (true, false, nil) zamieniają się w odpowiedni tekst. Inne atomy trafiają jako tekst bez dwukropka (:pending → pending). Jeśli potrzebujesz oryginalnej składni atomu, przetwórz po parsowaniu przez String.to_atom/1.
A co z Decimal, DateTime, Date, NaiveDateTime?
Decimal.new("249.99") traci wrapper i staje się 249.99. DateTime, NaiveDateTime i Date wychodzą jako ciągi ISO-8601. Time zamienia się w HH:MM:SS. Wartości nil stają się pustymi elementami zamiast być wyrzucane — dzięki temu forma zostaje spójna dla round-tripów z SweetXml.
Jak tłumaczone są listy, krotki i keyword listy?
Listy structów stają się elementami kontenerowymi z jednym dzieckiem na pozycję, nazwanymi według struct: items: [%OrderItem{}, ...] zamienia się w <items><OrderItem/><OrderItem/></items>. Listy skalarów stają się dziećmi <item> wewnątrz kontenera. Krotki dostają wrapper <tuple> z dziećmi pozycyjnymi <_0/>, <_1/>. Keyword listy traktowane są jak mapy — każdy klucz staje się dzieckiem.
Co, jeśli mój struct używa @derive dla Jason / Poison?
Adnotacja @derive to podpowiedź kompilacyjna dla bibliotek JSON i nie wpływa na wyjście XML. Wszystkie pola struct są emitowane domyślnie. Jeśli chcesz pominąć pole, usuń je z listy defstruct przed wklejeniem albo opakuj wartość w coś, co konwerter rozpozna jako "skip".
Czy mój kod jest zapisywany?
Twój kod trafia do backendu na potrzeby konwersji i nie jest utrwalany — nie logujemy payloadu. Jak zawsze przy narzędziach online: jeśli kod jest naprawdę wrażliwy, przejrzyj go przed wklejeniem.
Inne narzędzia, które mogą się przydać
Elixir na XML to jeden element układanki. Te narzędzia dobrze z nim grają: