Scala’dan XML’e Dönüştürücü
Scala case class’larını veya nesnelerini yapıştır. Geriye temiz XML al.
Bu araç ne yapıyor
Hiç bir Scala case class’ına uyan bir XML payload’ına ihtiyaç duyduysan — bir Akka HTTP fixture’ı, Play Framework config’i, eski bir SOAP entegrasyonu ya da bir test için — muhtemelen istediğinden fazla XML’i elle yazdın. Scala’yı buraya yapıştır, iyi biçimlendirilmiş XML’i hemen geri al. Tek bir case class, doldurulmuş bir val ya da iç içe tipler içeren bütün bir dosya — hepsi her alanı korunarak geçer.
Dönüştürücü, Scala’nın XML’e düştüğünde gerçekte nasıl göründüğünü anlıyor. Sonunda sonek olan BigDecimal literalleri düz sayısal metin olarak çıkar, None tutan Option[String] alanları sessizce atılmak yerine boş öğelere eşlenir, List[T] ve Seq[T], her öğe için bir çocuğu (eleman tipinin adıyla) olan konteyner öğelere dönüşür ve Map[K,V], <Entry><Key/><Value/></Entry> çiftlerine dönüşür. Bu, bir modeli round-trip yaptığında scala-xml ya da jackson-module-scala’nın çıkaracağıyla eşleşiyor.
İç içe case class’lar iç içe öğelere açılır, companion object sabitleri yok sayılır ve sealed trait hiyerarşileri somut alt tip adını öğe etiketi olarak korur. Birden fazla sınıfı aynı anda yapıştırabilirsin — dönüştürücü ilişkileri korur, yani Order’ın içinde bir List[OrderItem] ve bir ShippingAddress varsa üçü birlikte geri gelir. Neyin veri neyin davranış sayıldığını tazelemek için resmi case class turuna bir göz at.
Nasıl kullanılır
Üç adım. Beş satırlık bir case class da yapıştırsan, bütün bir model dosyası da yapıştırsan akış aynı.
Scala’nı yapıştır (veya örneği yükle)
Kodu olduğu gibi soldaki editöre bırak. Tek bir case class, doldurulmuş bir val örneği, birden fazla sınıf ya da sealed trait hiyerarşileri — parser hepsiyle barışık. Önce gerçekçi bir örnek görmek istersen Örnek yükle’ye bas.
Import’ları çıkarmana, package bildirimini silmene ya da Scala sözdizimini temizlemene gerek yok. Kodu IntelliJ ya da Metals’taki haliyle bırak. Sadece yapıştır.
Dönüştür’e bas
Yeşil Dönüştür butonuna tıkla. Araç case class’ları parse eder, doldurulmuş örneği dolaşır ve XML’i tek geçişte kurar. Bu sırada kısa bir yükleme göstergesi çalışır.
XML’i kopyala
Sağ panel, standarda uygun her parser’ın kabul edeceği girintili, iyi biçimlendirilmiş XML ile dolar. Doğrudan Akka HTTP test’ine, Play XML body’sine, SBT kaynak dosyasına ya da ihtiyacın olan yere kopyala.
Bu gerçekten ne zaman işe yarar
Akka HTTP ve Play fixture’ları
Akka HTTP ya da Play’de gelen bir XML isteği için bir case class’ın var ve bir test ya da curl komutu için gerçekçi bir body lazım. Sınıfı yapıştır, XML’i al, spec’ine bırak.
Eski sistemler için XML config
30 alanlı bir config case class’ı, hâlâ XML isteyen eski platformlar için — Mule, WebLogic, IBM MQ ya da şirket içi araçlar — düzenlenmeye hazır bir XML şablonuna dönüşür.
Kodla örtüşen dokümantasyon
README, ScalaDoc ya da Confluence sayfası için XML örneklerini doğrudan gerçek case class’larından üret; böylece dokümanlar modelden asla uzaklaşmaz.
SOAP ve scala-xml için test verisi
Unit testlerindeki doldurulmuş örnekleri entegrasyon testleri, WireMock stub’ları ya da hâlâ SOAP konuşan sistemler için XML seed dosyalarına çevir.
Sık sorulan sorular
Birden fazla case class’ı aynı anda yapıştırabilir miyim?
Evet — bütün bir dosyayı yapıştır. Her top-level case class, iç içe tipleri genişletilmiş ve companion object yardımcıları yok sayılmış olarak çıkar. Order’ın içinde List[OrderItem] varsa, ikisi de çıktıda doğru iç içe yapıyla yer alır.
Option, None ve varsayılan değerler nasıl ele alınıyor?
Some("x") tutan bir Option[String], içinde metin olan normal bir öğeye dönüşür. None, XML’in şekli tutarlı kalsın diye boş bir öğe olur — sessizce hiçbir şey atılmaz. Case class alanlarındaki varsayılan değerler, örnekte o alan eksikken kullanılır.
Peki BigDecimal, Instant, UUID ve şu acayip sayısal tipler ne oluyor?
BigDecimal son ekini atar ve düz sayısal metin olarak çıkar. java.time.Instant, LocalDate ve LocalDateTime ISO-8601 string’leri olur. UUID standart 8-4-4-4-12 onaltılık biçimini korur. İlkel wrapper’lar (Int, Long, Double, Boolean) düz metne dönüşür — jackson-module-scala’nın varsayılan olarak verdiği şekille aynı.
List, Seq, Set ve Map hepsi aynı şekilde mi çalışıyor?
Neredeyse. List[T], Seq[T], Vector[T] ve Set[T], her öğe için eleman tipinin adıyla adlandırılmış bir çocuğu olan konteyner öğelere dönüşür — yani Items: List[OrderItem], <Items><OrderItem/><OrderItem/></Items> olur. Map[K,V], <Entry><Key/><Value/></Entry> konteyneri olur.
Kodum saklanıyor mu?
Kodun dönüştürme için backend’e gönderilir ve kalıcı olarak tutulmaz — payload’ı loglamıyoruz. Scala gerçekten hassassa, her online araçta olduğu gibi yapıştırmadan önce bir göz at.
Scala’da implicit dönüşümler, type class’lar ya da makrolar varsa ne olur?
Implicit’ler ve makro ile üretilen kod tek başına XML alanı üretmez — biz case class’ın bildirilmiş üyeleri üzerinden çalışıyoruz. Yani bir implicit val format ya da @JsonCodec notasyonu fiilen yok sayılır ve ham alan biçimi geçer. Kodda sözdizimi hataları varsa önce barizlerini düzelt.
İşine yarayabilecek diğer araçlar
Scala’dan XML’e sadece bulmacanın bir parçası. Şu araçlar onunla iyi eşleşir: