Konwerter Python do XML
Wrzuć klasę, dict albo dataclassa Pythona. Dostaniesz czysty XML.
Co robi to narzędzie
Jeśli kiedykolwiek musiałeś sklecić ręcznie XML-ową reprezentację klasy Pythona — pod endpoint SOAP, plik konfiga, legacy integrację albo test fixture — znasz ten scenariusz: walczysz godzinę z xml.etree.ElementTree, a potem orientujesz się, że zapomniałeś o zagnieżdżonym polu. Wrzuć Pythona tutaj i dostaniesz poprawny XML w jednym przebiegu. Zwykły dict, dataclass, model Pydantic albo coś głęboko zagnieżdżonego — wynik ten sam.
To nie jest głupie podmienianie stringów. Konwerter rozumie, jak wartości Pythona naprawdę mapują się na XML: Decimal("49.99") schodzi do zwykłego tekstu liczbowego, datetime i date wychodzą jako stringi ISO-8601, UUID staje się standardowym hexem 8-4-4-4-12, pola Optional[...] z wartością None zamieniają się w puste elementy zamiast wypadać, a list[T] albo List[T] stają się elementami kontenerowymi z jednym dzieckiem na pozycję, nazwanym zgodnie z typem elementu — dokładnie ten sam kształt, który wypluwają biblioteki takie jak xmltodict czy lxml.
Type hinty też są respektowane. Nazwy pól @dataclass stają się nazwami elementów. Field(alias="x") na modelu Pydantic zmienia nazwę elementu. field(metadata={"xml": "attribute"}) na dataclassie wypycha wartość do atrybutu zamiast dziecka. Pola prywatne zaczynające się od _ są pomijane. Jeśli wrzucisz kilka klas, każda ląduje w outpucie z rozwiniętymi typami zagnieżdżonymi i dołączonymi atrybutami dziedziczonymi. Nic nie znika po cichu — jeśli pole tam jest, wyjdzie w XML-u.
Jak tego używać
Trzy kroki. Działa tak samo, czy wrzucasz pięciolinijkowego dicta, czy całego models.py.
Wrzuć swojego Pythona (albo spróbuj przykładu)
Wklej Pythona do lewego edytora tak jak jest. Literał dict, dataclass, Pydantic BaseModel, zagnieżdżone klasy albo przypisanie instancji — wszystko jedno. Kliknij Load Sample, jeśli chcesz najpierw zobaczyć realistyczny przykład Order / OrderItem / Address.
Zostaw importy, dekoratory i type hinty w spokoju. Nie musisz ich usuwać — parser czyta adnotacje typing i używa ich do wyboru typów wyjściowych.
Kliknij Convert
Kliknij zielony przycisk Convert. Narzędzie czyta Pythona, zachowuje każdą klasę i atrybut, i wypluwa XML-a w jednym przebiegu. Przez chwilę lata wskaźnik ładowania.
Skopiuj XML
Prawy panel zapełnia się wciętym, dobrze sformowanym XML-em, który zaakceptuje każdy zgodny ze standardem parser XML. Wklej go prosto do requestu SOAP, pliku konfiga, fixture’u testowego albo do dokumentacji.
Kiedy to naprawdę ratuje życie
Fixture’y integracji SOAP / legacy
Masz model requestu w Pydanticu i potrzebujesz XML-owego body do wysłania do legacy SOAP-a. Wrzucasz model, bierzesz XML, wklejasz do test runnera — gotowe.
Zamiana dataclassów w konfig
Settings dataclass z 30 polami zamienia się w gotowy do edycji szablon XML dla dowolnego store’a konfiguracji opartego na XML — bez ręcznego rusztowania, bez literówek.
Utrzymywanie docsów XSD w zgodzie
Generuj przykłady XML do README, referencji API albo dokumentacji schematu XSD prosto z rzeczywistych modeli w kodzie, żeby przykłady nie odklejały się od rzeczywistości.
Zasilanie testów integracyjnych
Zamień literały instancji z fixture’ów pytesta w pliki seed XML dla systemów, które nadal mówią XML-em — legacy API, mock serwery albo pipeline’y XSLT.
Częste pytania
Czy działa z dataclassami, Pydanticiem i zwykłymi dictami?
Tak, z wszystkimi trzema. Nazwy pól @dataclass i Pydantic BaseModel są używane jako nazwy elementów. Zwykłe literały dict też działają — klucze stają się nazwami elementów, a wartości są emitowane według typu. Zagnieżdżone modele albo dicty rozwijają się jako zagnieżdżone elementy.
Jak obsługiwane są Decimal, datetime i UUID?
Decimal("49.99") staje się 49.99 jako tekst elementu. datetime, date i time wychodzą jako stringi ISO-8601. UUID staje się standardowym stringiem hex 8-4-4-4-12. Podklasy Enum emitują swoje .value. sety zamieniają się w element kontenerowy tak samo jak listy.
A Optional[...] i wartości None?
Pola z wartością None są zapisywane jako puste elementy (<field/>), zamiast znikać — kształt outputu pozostaje spójny, co ma znaczenie, jeśli XSD w dół strumienia wymaga, żeby element był obecny.
Czy mogę zmieniać nazwy elementów albo wypychać pola do atrybutów?
Tak. W modelach Pydantic Field(alias="x") zmienia nazwę elementu. W dataclassach field(metadata={"xml": "attribute"}) przesuwa pole do atrybutu rodzica, a metadata={"xml": "name", ...} zmienia jego nazwę. Pola prywatne z podkreślnikiem na początku (_cache, _tmp) są domyślnie pomijane.
Czy mogę wrzucić kilka klas naraz?
Tak — wrzuć cały models.py. Każda klasa najwyższego poziomu wychodzi z rozwiniętymi typami zagnieżdżonymi i odziedziczonymi polami z klas bazowych. Jeśli dodasz też przypisanie instancji, to właśnie ta instancja jest serializowana; jeśli nie, używana jest pierwsza klasa z domyślnymi wartościami, które da się rozwiązać.
Czy mój kod jest gdzieś zapisywany?
Kod leci do backendu tylko po to, żeby go skonwertować, i nie jest trwale zapisywany — nie logujemy payloadu. Jak z każdym narzędziem online, jeśli to, co wklejasz, jest naprawdę wrażliwe, rzuć na nie okiem najpierw.
Inne narzędzia, które mogą Ci się przydać
Python do XML to jeden kawałek układanki. Oto narzędzia, które dobrze z tym współgrają: