Konwerter Ruby na XML
Wklej klasy albo obiekty Ruby. Dostań czysty XML.
Co robi to narzędzie
Jeśli kiedyś musiałeś ręcznie sklecić payload XML, żeby pasował do klasy Ruby — może dla fixtury to_xml w Railsach, starego callu SOAP albo szablonu Nokogiri Builder — wiesz, jak szybko urasta boilerplate. Wklej tu Ruby, a narzędzie odda ci dobrze sformułowany XML w jednym przebiegu. Jedna klasa z attr_accessor, Struct.new, cały plik z modelami albo głęboko zagnieżdżone obiekty — wynik ten sam: kompletny dokument XML z zachowanym każdym polem.
To nie zwykłe podmienianie stringów. Konwerter rozumie, jak wartości Ruby naprawdę się serializują: BigDecimal("49.99") wychodzi jako zwykły numeryczny string (bez notacji naukowej), Time i DateTime są renderowane jako stringi ISO-8601, wartości Symbol tracą wiodący dwukropek, nil staje się pustym elementem zamiast znikać, a tablice stają się elementami-kontenerami z jednym dzieckiem na każdy wpis — dokładnie to, co zwykle produkują Nokogiri::XML::Builder i Railsowy to_xml.
Struktura klas też jest respektowana. Każda klasa z najwyższego poziomu staje się elementem głównym nazwanym po klasie (w snake_case), symbole z attr_accessor stają się elementami-dziećmi, zagnieżdżone obiekty są rozwijane inline, a tablice OrderItem zamieniają się w opakowanie <items> z jednym dzieckiem <order_item> na wpis. Hashe stają się elementami-dziećmi klucz/wartość. Odziedziczone atrybuty też przechodzą. Jeśli wkleisz model Rails albo zwykłe PORO, wynik wygląda jak to, co dałoby ci render xml: albo REXML::Document.new (zobacz REXML) — tylko bez ceregieli.
Jak tego użyć
Trzy kroki. Ten sam flow, czy wklejasz jeden Struct, czy cały folder lib.
Wklej swój Ruby (albo spróbuj przykład)
Wrzuć swój Ruby jak leci do lewego edytora. Klasa z attr_accessor, skrót Struct.new, kilka klas albo wypełniona instancja — wszystko gra. Kliknij Wczytaj przykład, żeby najpierw zobaczyć realistyczny przykład Order.
Nie musisz usuwać linii require, wycinać modułów ani upraszczać składni. Zostaw kod tak, jak wygląda w twoim edytorze. Po prostu wklej.
Kliknij Konwertuj
Kliknij zielony przycisk Konwertuj. Narzędzie czyta Ruby, zachowuje każdą klasę i atrybut, i buduje XML w jednym przebiegu. W trakcie pracy widać krótki połysk.
Skopiuj XML
Prawy panel zapełnia się wciętym, dobrze sformułowanym XML-em, który przyjmie każdy parser zgodny ze standardem. Wrzuć go do requestu SOAP, pliku fixtury RSpec, testu integracyjnego Railsów albo swojej dokumentacji API.
Kiedy to się naprawdę przydaje
Budowanie fixture'ów Nokogiri lub Builder
Masz klasę Ruby i potrzebujesz szablonu XML dla Nokogiri::XML::Builder albo szablonu ERB. Wklej klasę, weź XML, wrzuć go do swojego bloku Builder — gotowe.
Dane seed Rails to_xml
Model ActiveRecord albo PORO z 20 atrybutami zamienia się w gotowy do edycji plik seed XML — pod testy integracyjne albo zewnętrzny system, który nadal chrupie XML.
Starsze integracje SOAP
Klient Ruby gadający ze starym serwisem SOAP/XML-RPC potrzebuje ciała requestu, które pasuje do klasy Ruby. Wklej model, weź kształt envelope'a XML i przestań walczyć z szablonami <a href="https://www.ruby-doc.org/" target="_blank" rel="noopener">Savon</a>.
Trzymanie dokumentacji i kodu w zgodzie
Generuj przykłady odpowiedzi XML do README, referencji API albo dokumentacji opartej o XSD prosto z prawdziwych modeli Ruby — wtedy dokumentacja nigdy nie odjeżdża od kodu.
Częste pytania
Czy mogę wkleić kilka klas naraz?
Tak — wklej cały plik lib. Każda klasa z najwyższego poziomu wychodzi z rozwiniętymi klasami zagnieżdżonymi i wciągniętymi atrybutami superklasy. Mixiny są traktowane jak dostarczyciele swoich attr_accessor. Nic nie znika po cichu.
Czy skrót Struct.new działa?
Tak. Order = Struct.new(:order_id, :customer_name, :total_amount) jest traktowany jak klasa z odpowiednimi attr_accessor. Structy w stylu keyword (Struct.new(:a, keyword_init: true)) też działają — wynikowy XML jest w obu przypadkach identyczny.
Jak są obsługiwane BigDecimal, Time, Symbol i nil?
BigDecimal("49.99") staje się zwykłym stringiem 49.99 (bez notacji naukowej, bez końcówki bd). Time, DateTime i Date są renderowane jako stringi ISO-8601. Wartości Symbol tracą dwukropek i stają się zwykłym tekstem. nil zamienia się w pusty element (<field/>), zamiast po prostu znikać — dzięki temu kształt XML jest spójny.
A tablice, hashe i zagnieżdżone obiekty?
Tablice stają się elementami-kontenerami — items = [OrderItem.new, OrderItem.new] zamienia się w <items><order_item/><order_item/></items>, jedno dziecko na wpis, nazwane po klasie elementu. Hashe stają się parami <entry><key/><value/></entry>. Zagnieżdżone obiekty są rozwijane inline jako elementy-dzieci, dokładnie tak, jak robi to Railsowy to_xml.
Czy mój kod jest przechowywany?
Twój kod leci do backendu do konwersji i nie jest nigdzie zapisywany — nie logujemy payloadu. Jak zwykle przy narzędziach online: jeśli w Ruby siedzą naprawdę wrażliwe literały (klucze API, dane klientów), wytnij je przed wklejeniem.
A co, jeśli kod używa metaprogramowania albo define_method?
Wszystko, co istnieje tylko w runtime'ie (metody dodane przez define_method, atrybuty ustawiane przez method_missing, wmieszane moduły z wyliczanymi atrybutami) nie da się wywnioskować z samego statycznego kodu. Narzędzie czyta zadeklarowane attr_accessor, attr_reader, pola Struct i jawne przypisania. Jeśli pole pojawia się tylko przez metaprogramowanie, wypisz je jako attr_accessor, żeby konwerter je zobaczył.
Inne narzędzia, które mogą się przydać
Ruby na XML to jeden kawałek układanki. Te dobrze z nim działają: