Konwerter Scala na XML
Wklej case class lub obiekty Scali. Odbierz czysty XML.
Co robi to narzędzie
Jeśli kiedykolwiek potrzebowałeś payloadu XML pasującego do case class w Scali — do fixture'a w Akka HTTP, configu Play Framework, starej integracji SOAP albo testu — prawdopodobnie napisałeś ręcznie więcej XML-a, niż chciałbyś. Wklej Scalę tutaj i od razu dostajesz dobrze uformowany XML. Pojedyncza case class, wypełniony val albo cały plik z zagnieżdżonymi typami — wszystko przechodzi z każdym polem zachowanym.
Konwerter rozumie, jak Scala naprawdę wygląda, kiedy trafia na XML. Literały BigDecimal z sufiksem na końcu wychodzą jako zwykły tekst liczbowy, pola Option[String] mapowane są na puste elementy, kiedy mają None, zamiast być po cichu wyrzucane, List[T] i Seq[T] stają się elementami-kontenerami z jednym dzieckiem na element (nazwanym po typie elementu), a Map[K,V] zmienia się w pary <Entry><Key/><Value/></Entry>. To pasuje do tego, co wypluwa scala-xml albo jackson-module-scala przy round-tripie modelu.
Zagnieżdżone case class rozwijają się w zagnieżdżone elementy, stałe companion objectu są ignorowane, a hierarchie sealed trait zachowują nazwę konkretnego podtypu jako tag elementu. Możesz wkleić kilka klas naraz — konwerter zachowuje relacje, więc jeśli twój Order zawiera List[OrderItem] i ShippingAddress, wszystkie trzy wracają razem. Zajrzyj do oficjalnego case class tour dla przypomnienia, co jest traktowane jako dane, a co jako zachowanie.
Jak go używać
Trzy kroki. Ten sam flow, czy wklejasz case class na pięć linii, czy cały plik modelu.
Wklej Scalę (lub wczytaj przykład)
Rzuć kod do lewego edytora tak jak jest. Pojedyncza case class, wypełniona instancja val, wiele klas albo hierarchie sealed trait — parserowi to wszystko pasuje. Kliknij Wczytaj przykład, jeśli chcesz najpierw zobaczyć realistyczny case.
Nie musisz usuwać importów, wyrzucać deklaracji package ani czyścić składni Scali. Zostaw kod tak, jak wygląda w IntelliJ albo Metals. Po prostu wklej.
Kliknij Konwertuj
Kliknij zielony przycisk Konwertuj. Narzędzie parsuje case class, przechodzi przez wypełnioną instancję i buduje XML w jednym przebiegu. W tle chodzi krótki wskaźnik ładowania.
Skopiuj XML
Prawy panel wypełnia się wciętym, dobrze uformowanym XML-em, który zaakceptuje każdy parser zgodny ze standardem. Skopiuj go prosto do testu Akka HTTP, body XML w Play, pliku zasobów SBT albo gdziekolwiek tego potrzebujesz.
Kiedy to naprawdę się przydaje
Fixture'y Akka HTTP i Play
Masz case class na przychodzące żądanie XML w Akka HTTP albo Play i potrzebujesz realistycznego body do testu albo komendy curl. Wklej klasę, weź XML, wrzuć do speca.
Config XML dla systemów legacy
Case class configu z 30 polami zmienia się w gotowy do edycji szablon XML dla starszych platform, które dalej chcą XML-a — Mule, WebLogic, IBM MQ albo wewnętrzne narzędzia.
Dokumentacja zgodna z kodem
Generuj przykłady XML do README, ScalaDoc albo strony na Confluence prosto z prawdziwych case class, żeby doki nigdy nie rozjechały się z modelem.
Dane testowe dla SOAP i scala-xml
Zamień wypełnione instancje z twoich unit testów w pliki XML seed dla testów integracyjnych, stubów WireMock albo systemów, które dalej mówią po SOAP-owemu.
Częste pytania
Czy mogę wkleić kilka case class naraz?
Tak — wklej cały plik. Każda case class top-level wychodzi z rozwiniętymi zagnieżdżonymi typami i zignorowanymi helperami z companion objectu. Jeśli twój Order zawiera List[OrderItem], oba pojawią się w wyjściu z właściwym zagnieżdżeniem.
Jak to obsługuje Option, None i wartości domyślne?
Option[String] trzymający Some("x") zostaje normalnym elementem z tekstem w środku. None staje się pustym elementem, żeby kształt XML-a pozostał spójny — nic nie znika po cichu. Wartości domyślne pól case class są używane, gdy w instancji brakuje danego pola.
A co z BigDecimal, Instant, UUID i tymi dziwnymi typami numerycznymi?
BigDecimal traci sufiks i wychodzi jako zwykły tekst liczbowy. java.time.Instant, LocalDate i LocalDateTime stają się stringami ISO-8601. UUID zachowuje standardowy format hex 8-4-4-4-12. Prymitywne wrappery (Int, Long, Double, Boolean) stają się zwykłym tekstem — taki sam kształt, jaki jackson-module-scala wypluwa domyślnie.
Czy List, Seq, Set i Map działają tak samo?
Prawie. List[T], Seq[T], Vector[T] i Set[T] wszystkie stają się elementami-kontenerami z jednym dzieckiem na element nazwanym po typie elementu — więc Items: List[OrderItem] staje się <Items><OrderItem/><OrderItem/></Items>. Map[K,V] staje się kontenerem <Entry><Key/><Value/></Entry>.
Czy mój kod jest zapisywany?
Twój kod trafia do backendu do konwersji i nie jest utrwalany — nie logujemy payloadu. Jeśli Scala jest naprawdę wrażliwa, rzuć okiem przed wklejeniem, jak przy każdym narzędziu online.
A jeśli Scala ma implicit conversions, type classy albo makra?
Implicity i kod generowany przez makra same z siebie nie produkują pól XML — pracujemy na zadeklarowanych członkach case class. Czyli implicit val format albo anotacja @JsonCodec jest w praktyce ignorowana i przechodzi surowy kształt pola. Jeśli kod ma błędy składniowe, najpierw popraw te oczywiste.
Inne narzędzia, które mogą się przydać
Scala na XML to tylko kawałek układanki. Te narzędzia dobrze się z nim uzupełniają: