Wklej Go po lewej i kliknij "Konwertuj" — zamienimy to na XMLWklej kod Go

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.

1

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.

2

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.

3

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ą: