Soldaki alana Ruby yapıştırın ve "Dönüştür"’e basın — XML’e çeviririzRuby kodunu yapıştırın

Bu araç ne yapar

Daha önce bir Ruby sınıfına uyacak bir XML yükünü elle hazırlamak zorunda kaldıysanız — belki bir Rails to_xml fixture’ı, eski bir SOAP çağrısı veya bir Nokogiri Builder şablonu için — boilerplate’in ne kadar hızlı biriktiğini biliyorsunuzdur. Ruby’yi buraya yapıştırın, araç size tek seferde iyi biçimlendirilmiş XML versin. Bir attr_accessor sınıfı, bir Struct.new, bir bütün model dosyası veya derin iç içe nesneler — sonuç aynı: her alanı korunmuş eksiksiz bir XML belgesi.

Sadece string değiştirme değil. Dönüştürücü, Ruby değerlerinin gerçekte nasıl serileştiğini anlar: BigDecimal("49.99") düz bir sayısal string olarak çıkar (bilimsel gösterim yok), Time ve DateTime ISO-8601 string olarak render edilir, Symbol değerleri baştaki iki nokta üst üste işaretini kaybeder, nil atılmak yerine boş bir öğe olur ve diziler girişlerin her biri için bir çocuğu olan kapsayıcı öğelere dönüşür — Nokogiri::XML::Builder ve Rails to_xml’nin genellikle ürettiğiyle aynı.

Sınıf yapısına da saygı gösterilir. Her üst düzey sınıf, sınıfın adıyla (snake_case olarak) bir kök öğeye dönüşür, attr_accessor sembolleri çocuk öğelere, iç içe nesneler satır içinde açılır ve OrderItem dizileri, her giriş için bir <order_item> çocuğu olan bir <items> sarmalayıcısına dönüşür. Hash’ler anahtar/değer çocuk öğelere dönüşür. Kalıtımla gelen öznitelikler de yansıtılır. Bir Rails modeli veya düz bir PORO yapıştırırsanız, sonuç render xml: ya da REXML::Document.new (bakınız REXML) ile elde edeceğinize benzer, ama tüm o töreni yaşamadan.

Nasıl kullanılır

Üç adım. İster tek bir Struct yapıştırın, ister koca bir lib klasörü — akış aynı.

1

Ruby’nizi yapıştırın (veya örneği deneyin)

Ruby’nizi olduğu gibi sol editöre bırakın. Bir attr_accessor sınıfı, bir Struct.new kısayolu, birden çok sınıf veya doldurulmuş bir örnek — hepsi olur. Önce gerçekçi bir Order örneğine göz atmak için Örnek Yükle’ye tıklayın.

require satırlarını kaldırmanıza, modülleri soymanıza veya sözdizimini sadeleştirmenize gerek yok. Kodu editörünüzde göründüğü gibi bırakın. Sadece yapıştırın.

2

Dönüştür’e basın

Yeşil Dönüştür düğmesine tıklayın. Araç Ruby’yi okur, her sınıfı ve özniteliği korur ve XML’i tek seferde kurar. Çalışırken kısa bir parıltı görünür.

3

XML’i kopyalayın

Sağdaki panel, standartlara uyan herhangi bir parser’ın kabul edeceği girintili ve iyi biçimlendirilmiş XML ile dolar. Bir SOAP isteğine, bir RSpec fixture dosyasına, bir Rails entegrasyon testine veya API dokümanlarınıza bırakın.

Ne zaman gerçekten işe yarar

Nokogiri veya Builder fixture’ları hazırlamak

Bir Ruby sınıfınız var ve Nokogiri::XML::Builder ya da ERB şablonu için bir XML taslağına ihtiyacınız var. Sınıfı yapıştırın, XML’i alın, Builder bloğunuza yapıştırın — tamamdır.

Rails to_xml seed verileri

20 öznitelikli bir ActiveRecord modeli veya PORO, entegrasyon testleriniz ya da hâlâ XML tüketen bir dış sistem için düzenlemeye hazır bir XML seed dosyasına dönüşür.

Eski SOAP entegrasyonları

Eski bir SOAP/XML-RPC servisiyle konuşan bir Ruby istemcisi, Ruby sınıfına uyacak bir istek gövdesine ihtiyaç duyar. Modeli yapıştırın, XML envelope’ın şeklini alın, <a href="https://www.ruby-doc.org/" target="_blank" rel="noopener">Savon</a> şablonlarıyla boğuşmayı bırakın.

Döküman ve kodu aynı çizgide tutmak

README, API referansı veya XSD tabanlı dokümantasyon için XML yanıt örneklerini doğrudan gerçek Ruby modellerinden üretin; böylece dokümanlar koddan asla sapmaz.

Sık sorulan sorular

Aynı anda birkaç sınıfı yapıştırabilir miyim?

Evet — koca bir lib dosyasını yapıştırabilirsiniz. Her üst düzey sınıf, iç içe sınıfları açılmış ve üst sınıf öznitelikleri dahil edilmiş halde çıkar. Mixin’ler, kendi attr_accessor’larıyla katkı sağlıyormuş gibi ele alınır. Hiçbir şey sessizce düşürülmez.

Struct.new kısayolu çalışır mı?

Çalışır. Order = Struct.new(:order_id, :customer_name, :total_amount), eşleşen attr_accessor’lara sahip bir sınıfla aynı şekilde ele alınır. Keyword tarzı struct’lar (Struct.new(:a, keyword_init: true)) da çalışır — sonuç her durumda aynı XML olur.

BigDecimal, Time, Symbol ve nil nasıl ele alınır?

BigDecimal("49.99") düz string 49.99 olur (bilimsel gösterim yok, sonda bd işareti yok). Time, DateTime ve Date, ISO-8601 string olarak render edilir. Symbol değerleri iki nokta üst üste işaretini kaybeder ve düz metne döner. nil, atılmak yerine boş bir öğe (<field/>) olur, böylece XML şekli tutarlı kalır.

Peki diziler, hash’ler ve iç içe nesneler?

Diziler kapsayıcı öğelere dönüşür — items = [OrderItem.new, OrderItem.new] şuna dönüşür: <items><order_item/><order_item/></items>; her giriş için bir çocuk, öğe sınıfının adını taşır. Hash’ler <entry><key/><value/></entry> çiftlerine dönüşür. İç içe nesneler, Rails to_xml’nin yaptığı gibi çocuk öğeler olarak satır içinde açılır.

Kodum saklanıyor mu?

Kodunuz dönüştürme için arka uca gönderilir ve kalıcı olarak saklanmaz — yükü loglamayız. Çevrimiçi araçlarda her zaman olduğu gibi, Ruby gerçekten hassas literaller (API anahtarları, müşteri PII’si) içeriyorsa yapıştırmadan önce temizleyin.

Kod metaprogramlama veya define_method kullanıyorsa?

Yalnızca çalışma zamanında var olan her şey (define_method ile eklenen metotlar, method_missing ile atanan öznitelikler, hesaplanan özniteliklere sahip karışıma alınmış modüller) yalnızca statik koddan çıkarılamaz. Araç, bildirilmiş attr_accessor, attr_reader, Struct alanlarını ve açık atamaları okur. Bir alan yalnızca metaprogramlama yoluyla ortaya çıkıyorsa, dönüştürücünün görebilmesi için onu bir attr_accessor olarak listeleyin.

İşinize yarayabilecek diğer araçlar

Ruby’den XML’e bulmacanın sadece bir parçasıdır. Bunlar onunla iyi gider: