Konwerter Go do XML
Wklej struktury Go. Odbierz czysty XML.
Co robi to narzędzie
Jeśli kiedykolwiek musiałeś sklecić payload XML, który pasuje do struktury Go — pod klienta SOAP, feed RSS, webhooka od starego SaaS-a albo sitemapę vendora — to wiesz, jakie to upierdliwe. Możesz wywołać xml.Marshal samodzielnie, ale wtedy trzeba podpiąć main.go, skompilować i sprawdzić wynik na oko. Wklej zamiast tego Go tutaj i w jednym kroku dostajesz poprawny XML. Pojedyncza struktura, plik z kilkoma, albo literał skopiowany z Go by Example — to samo: kompletny dokument XML z zachowanym każdym polem.
Zachowuje się tak, jak pakiet encoding/xml realnie by wyprodukował. Tag xml:"OrderId,attr" robi z pola atrybut na elemencie rodzica; xml:"-" pomija; xml:",omitempty" zostawia element poza wyjściem, gdy wartość to zero value; xml:"Items>OrderItem" pakuje slice w kontener <Items> z jednym <OrderItem> na element; xml:",chardata" wstawia wartość jako zawartość tekstową. XMLName xml.Name zmienia nazwę samego elementu. Pola wskaźnikowe z nil są emitowane jako puste elementy tylko wtedy, gdy brakuje ,omitempty — dokładnie tak samo zachowuje się standardowa biblioteka.
Skalary są traktowane tak, jak zrobiłby to Go: float64 wychodzi bez notacji naukowej, gdy się mieści, time.Time używa RFC 3339, boolowe to małe true/false, a int/uint bez paddingu. Zagnieżdżone struktury stają się zagnieżdżonymi elementami. Slice struktur stają się powtarzającymi się elementami na tym samym poziomie. Mapy nie są natywnie wspierane przez encoding/xml — są spłaszczane do powtarzających się dzieci <Entry><Key/><Value/></Entry>, żeby kształt pozostał sensowny. Piszesz idiomatyczne Go? Przewodnik stylu w Effective Go to dobra referencja dla wzorców, których oczekuje to narzędzie.
Jak tego używać
Trzy kroki. Działa tak samo, niezależnie od tego, czy wklejasz jedną strukturę, czy cały plik pakietu.
Wklej swój Go (albo wypróbuj przykład)
Wrzuć swój Go do lewego edytora tak, jak jest. Pojedyncza deklaracja struktury, cały plik z importami i wieloma typami, albo composite literal typu order := Order{...} — wszystko zadziała. Kliknij Wczytaj przykład, żeby zobaczyć najpierw realistyczny przypadek.
Nie musisz usuwać linii package, wywalać importów ani porządkować pliku. Wklej tak, jak wyjdzie z gofmt. Tagi struktur w backtickach są oczekiwane.
Kliknij Konwertuj
Kliknij zielony przycisk Konwertuj. Narzędzie czyta Go, respektuje każdy tag xml struktury i buduje XML w jednym przebiegu. Podczas działania zobaczysz krótki wskaźnik ładowania.
Skopiuj XML
Prawy panel wypełnia się wciętym, poprawnie zbudowanym XML-em, który zaakceptuje każdy zgodny ze standardem parser XML. Skopiuj do swojej koperty SOAP, pliku konfiguracyjnego, fixture'a testowego albo dokumentacji API.
Kiedy to realnie pomaga
Budowa fixture'ów klienta SOAP
Z serwisu w Go rozmawiasz z korporacyjnym, legacy SOAP API. Wklej strukturę requestu, odbierz body XML gotowe do SoapUI, Postmana albo test suite'a.
Feedy RSS i Atom
Struktura feeda z polami Channel, Item i enclosure zamienia się w działający szablon RSS albo Atom — wygodne do sprawdzenia układu tagów przed podpięciem handlera.
Pliki konfiguracji vendorów
Niektóre narzędzia SaaS nadal konsumują konfigurację w XML (pomyśl o sitemapach, pipeline'ach loggingu, starych konsolach ops). Wklej strukturę konfiguracji Go, wrzuć XML bezpośrednio dalej.
Utrzymanie uczciwej dokumentacji
Generuj przykłady XML do README lub referencji API z prawdziwych typów Go — dzięki temu przykłady nigdy nie rozjadą się z kodem, który trafia na main.
Częste pytania
Czy mogę wkleić kilka struktur naraz?
Tak — wklej cały plik. Root jest wykrywany z composite literal (np. order := Order{...}), gdy jest obecny, albo z pierwszej struktury, która odwołuje się do pozostałych. Zagnieżdżone i rodzeństwo wychodzą jako zagnieżdżone elementy lub osobne fragmenty, więc nic nie gubi się po cichu.
Czy honoruje tagi struktur typu xml:"x,attr", xml:"-" i xml:",omitempty"?
Tak — i wszystkie typowe warianty. xml:"name" zmienia nazwę elementu, xml:"name,attr" emituje jako atrybut na rodzicu, xml:"-" w ogóle pomija pole, xml:",omitempty" pomija pola o wartości zero, xml:"a>b" pakuje slice w kontener <a> z jednym <b> na element, xml:",chardata" wstawia wartość jako tekst elementu, a xml:",innerxml" przechodzi jako surowy XML. Zgadza się z zachowaniem udokumentowanym w referencji encoding/xml Marshal.
A co ze specjalnym polem XMLName?
Pole typu xml.Name o nazwie XMLName zmienia nazwę elementu korzenia. XMLName xml.Name `xml:"Order"` daje <Order>...</Order>. Bez tego narzędzie używa jako korzenia nazwy typu struktury — taki sam default jak w xml.Marshal.
Jak obsługuje wskaźniki, slice'y i mapy?
Pola wskaźnikowe z nil emitują pusty element, chyba że jest ,omitempty — wtedy są pomijane. Slice struktur stają się powtarzającymi się elementami-rodzeństwem (albo są opakowane w kontener, gdy tag używa formy a>b). Mapy nie są natywnie obsługiwane przez encoding/xml, więc narzędzie emituje je jako ciąg dzieci <Entry><Key/><Value/></Entry> — wystarczy w większości przypadków i jest dostatecznie jawne, żebyś mógł je ręcznie zmienić, jeśli potrzebujesz innego kształtu.
Czy mój kod jest gdzieś zapisywany?
Twój kod jest wysyłany do backendu w celu konwersji i nie jest utrwalany — payload nie ląduje w logach. Standardowa adnotacja dla narzędzi online: jeśli kod jest naprawdę wrażliwy, rzuć na niego okiem przed wklejeniem.
Co jeśli struktura używa typów, których encoding/xml nie obsługuje — channeli, funców, complex?
Są emitowane jako puste elementy, zamiast wywalać całą konwersję — w duchu tego, co zrobiłby xml.Marshal w runtime (zwraca błąd; narzędzie idzie dalej, żebyś dostał przynajmniej resztę). Jeśli samo Go ma błąd składni, najpierw popraw te oczywiste — parser jest wyrozumiały, ale nie jest pełnym gc.
Inne narzędzia, które mogą się przydać
Go do XML to tylko kawałek układanki. Te narzędzia dobrze z tym współgrają: