{"id":342013,"date":"2022-12-01T15:00:10","date_gmt":"2022-12-01T15:00:10","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=342013"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=342013","title":{"rendered":"<span>\u041f\u0430\u0440\u0441\u0438\u043d\u0433 XML \u0432 Golang<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0410\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c XML \u0432 2022 \u0433\u043e\u0434\u0443 \u0431\u044b\u043b\u0430 \u0431\u044b \u043f\u043e\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u043d\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e legacy \u0441\u0438\u0441\u0442\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.  XML \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u0435\u043d \u0432 travel \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, GDS (\u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e \u043d\u0438\u0445 \u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%93%D0%BB%D0%BE%D0%B1%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B4%D0%B8%D1%81%D1%82%D1%80%D0%B8%D0%B1%D1%8C%D1%8E%D1%82%D0%BE%D1%80%D1%81%D0%BA%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0\" rel=\"noopener noreferrer nofollow\"><u>\u0432\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/u><\/a>) \u0438\u043b\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 <a href=\"https:\/\/www.nationalrail.co.uk\/100296.aspx\" rel=\"noopener noreferrer nofollow\"><u>Darwin<\/u><\/a> \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u0438 \u0436\u0435\u043b\u0435\u0437\u043d\u043e\u0434\u043e\u0440\u043e\u0436\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 \u0412\u0435\u043b\u0438\u043a\u043e\u0431\u0440\u0438\u0442\u0430\u043d\u0438\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0435\u0433\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0430. \u0412 \u043d\u0435\u0439 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u043f\u0430\u0440\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0443 xml \u0432 Golang: \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0439, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043f\u043e\u043b\u044f \u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u043c\u0438.  \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/pkg.go.dev\/encoding\/xml\" rel=\"noopener noreferrer nofollow\"><u>encoding\/xml<\/u><\/a> \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 c <a href=\"https:\/\/pkg.go.dev\/encoding\/json\" rel=\"noopener noreferrer nofollow\"><u>encoding\/json<\/u><\/a>, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0433\u043e, \u043d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0432\u0441\u0435 \u0436\u0435 \u0435\u0441\u0442\u044c.<\/p>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f Go \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u043f\u043e XML<\/h2>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043e\u043f\u0438\u0441\u0430\u0442\u044c go \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 xml \u0444\u0430\u0439\u043b\u0430\u043c. \u041c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e c \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u0442\u0435\u0433\u043e\u0432 (\u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u0435\u0433\u0438 \u0434\u043b\u044f XML \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e \u043c\u0435\u0442\u043e\u0434\u0443 <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Marshal\" rel=\"noopener noreferrer nofollow\">Marshal<\/a>). \u041d\u043e \u0434\u043b\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 go \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u043e xml, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/github.com\/miku\/zek\/\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/miku\/zek\/<\/a> (\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043d\u043b\u0430\u0439\u043d \u0432\u0435\u0440\u0441\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430: <a href=\"https:\/\/www.onlinetool.io\/xmltogo\/\" rel=\"noopener noreferrer nofollow\">https:\/\/www.onlinetool.io\/xmltogo\/<\/a>). \u0415\u0441\u043b\u0438 \u0432\u044b \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0435\u0441\u044c \u0441 \u0442\u0430\u043a\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c, \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e \u0441\u0442\u0430\u0442\u044c\u0435\u0439 <a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-use-struct-tags-in-go-ru\" rel=\"noopener noreferrer nofollow\">&#171;\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u0433\u043e\u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0432 Go&#187;<\/a><\/p>\n<h2>\u041f\u0430\u0440\u0441\u0438\u043d\u0433 XML \u0432 Go \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e xml \u0444\u0430\u0439\u043b\u0430 \u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e Unmarshal \u0432 golang \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u041f\u0440\u0438\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 \u044f \u0432\u0437\u044f\u043b \u0441 \u0441\u0430\u0439\u0442\u0430 <a href=\"https:\/\/www.w3schools.com\/xml\/simple.xml\" rel=\"noopener noreferrer nofollow\">w3schools<\/a>. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043e\u043f\u0438\u0441\u0430\u0442\u044c go struct, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 xml. \u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u044d\u0433\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 (\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e json, \u0435\u0441\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441 json \u0432 golang, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c <a href=\"https:\/\/gobyexample.com\/json\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a> \u0438 <a href=\"https:\/\/golang.cafe\/blog\/golang-json-marshal-example.html\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>, \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c <a href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/529318\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a> \u0438 <a href=\"https:\/\/golang-blog.blogspot.com\/2019\/11\/json-golang.html\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>). <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440 XML \u0444\u0430\u0439\u043b\u0430:<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?> &lt;breakfast_menu>   &lt;food>     &lt;name>Belgian Waffles&lt;\/name>     &lt;price>$5.95&lt;\/price>     &lt;description>Two of our famous Belgian Waffles with plenty of real maple syrup&lt;\/description>     &lt;calories>650&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Strawberry Belgian Waffles&lt;\/name>     &lt;price>$7.95&lt;\/price>     &lt;description>Light Belgian waffles covered with strawberries and whipped cream&lt;\/description>     &lt;calories>900&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Berry-Berry Belgian Waffles&lt;\/name>     &lt;price>$8.95&lt;\/price>     &lt;description>Light Belgian waffles covered with an assortment of fresh berries and whipped cream&lt;\/description>     &lt;calories>900&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>French Toast&lt;\/name>     &lt;price>$4.50&lt;\/price>     &lt;description>Thick slices made from our homemade sourdough bread&lt;\/description>     &lt;calories>600&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Homestyle Breakfast&lt;\/name>     &lt;price>$6.95&lt;\/price>     &lt;description>Two eggs, bacon or sausage, toast, and our ever-popular hash browns&lt;\/description>     &lt;calories>950&lt;\/calories>   &lt;\/food> &lt;\/breakfast_menu><\/code><\/pre>\n<p>\u0418 \u0432\u043e\u0442 go \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0435\u0433\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442:<\/p>\n<pre><code class=\"go\">type BreakfastMenu struct { XMLName xml.Name `xml:\"breakfast_menu\"` Food    []struct { Name        string `xml:\"name\"` Price       string `xml:\"price\"` Description string `xml:\"description\"` Calories    string `xml:\"calories\"` } `xml:\"food\"` } <\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e. \u041a\u043e\u0434 \u0434\u043b\u044f Unmarshal (\u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0438\u0437 xml \u0432 golang \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443) \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"go\">menu := new(BreakfastMenu) err := xml.Unmarshal([]byte(data), menu) if err != nil { fmt.Printf(\"error: %v\", err) return }<\/code><\/pre>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e Marshal (\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f Unmarshal, \u0438\u0437 go \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432 xml):<\/p>\n<pre><code class=\"go\">xmlText, err := xml.MarshalIndent(menu, \" \", \" \") if err != nil { fmt.Printf(\"error: %v\\n\", err) return }<\/code><\/pre>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u043e <a href=\"https:\/\/go.dev\/play\/p\/2P5kCbP7FMw\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a> (\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#MarshalIndent\" rel=\"noopener noreferrer nofollow\">MarshalIndent<\/a> \u0432\u043c\u0435\u0441\u0442\u043e <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Marshal\" rel=\"noopener noreferrer nofollow\">Marshal<\/a> \u2013 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 xml \u0432 \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u043c \u0432\u0438\u0434\u0435: \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u0441\u0442\u0443\u043f\u044b \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044b \u0441\u0442\u0440\u043e\u043a.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 Golang XML Marshal\/Unmarshal<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"go\">package main  import ( \"encoding\/xml\" \"fmt\" )  type BreakfastMenu struct { XMLName xml.Name `xml:\"breakfast_menu\"` \/\/Text    string   `xml:\",chardata\"` Food []struct { \/\/Text        string `xml:\",chardata\"` Name        string `xml:\"name\"` Price       string `xml:\"price\"` Description string `xml:\"description\"` Calories    string `xml:\"calories\"` } `xml:\"food\"` }  func main() { menu := new(BreakfastMenu) err := xml.Unmarshal([]byte(data), menu) if err != nil { fmt.Printf(\"error: %v\", err) return } fmt.Printf(\"--- Unmarshal ---\\n\\n\") for _, foodNode := range menu.Food { fmt.Printf(\"Name: %s\\n\", foodNode.Name) fmt.Printf(\"Price: %s\\n\", foodNode.Price) fmt.Printf(\"Description: %s\\n\", foodNode.Description) fmt.Printf(\"Calories: %s\\n\", foodNode.Calories) fmt.Printf(\"---\\n\") }  xmlText, err := xml.MarshalIndent(menu, \" \", \" \") if err != nil { fmt.Printf(\"error: %v\\n\", err) return } fmt.Printf(\"\\n--- Marshal ---\\n\\n\") fmt.Printf(\"xml: %s\\n\", string(xmlText)) }  var data = ` &lt;?xml version=\"1.0\" encoding=\"UTF-8\"?> &lt;breakfast_menu>   &lt;food>     &lt;name>Belgian Waffles&lt;\/name>     &lt;price>$5.95&lt;\/price>     &lt;description>Two of our famous Belgian Waffles with plenty of real maple syrup&lt;\/description>     &lt;calories>650&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Strawberry Belgian Waffles&lt;\/name>     &lt;price>$7.95&lt;\/price>     &lt;description>Light Belgian waffles covered with strawberries and whipped cream&lt;\/description>     &lt;calories>900&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Berry-Berry Belgian Waffles&lt;\/name>     &lt;price>$8.95&lt;\/price>     &lt;description>Light Belgian waffles covered with an assortment of fresh berries and whipped cream&lt;\/description>     &lt;calories>900&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>French Toast&lt;\/name>     &lt;price>$4.50&lt;\/price>     &lt;description>Thick slices made from our homemade sourdough bread&lt;\/description>     &lt;calories>600&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Homestyle Breakfast&lt;\/name>     &lt;price>$6.95&lt;\/price>     &lt;description>Two eggs, bacon or sausage, toast, and our ever-popular hash browns&lt;\/description>     &lt;calories>950&lt;\/calories>   &lt;\/food> &lt;\/breakfast_menu> ` <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u043e \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c: \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 xml \u0444\u0430\u0439\u043b \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0442\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0438 \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043f\u043e \u0441\u0435\u0442\u0438 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0430\u0440\u0441\u0438\u043d\u0433. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<h2>\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 XML<\/h2>\n<p>\u0414\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 XML \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Decoder\" rel=\"noopener noreferrer nofollow\">Decoder<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0441\u0438\u0442\u044c xml \u0444\u0430\u0439\u043b \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u0442\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 UTF-8 (\u0434\u043e\u0441\u043b\u043e\u0432\u043d\u0430\u044f \u0446\u0438\u0442\u0430\u0442\u0430 \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438: <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Decoder\" rel=\"noopener noreferrer nofollow\">\u201cA Decoder represents an XML parser reading a particular input stream. The parser assumes that its input is encoded in UTF-8.\u201d<\/a>)<\/p>\n<p>\u0421 \u043f\u043e\u043b\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0438 <a href=\"https:\/\/go.dev\/play\/p\/dNmF3NBw9gX\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435<\/a>. <\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 XML \u0432 Golang<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"go\">package main  import ( \"bytes\" \"encoding\/xml\" \"fmt\" )  const foodElementName = \"food\"  type BreakfastMenu struct { Food []Food `xml:\"food\"` }  type Food struct { Name        string `xml:\"name\"` Price       string `xml:\"price\"` Description string `xml:\"description\"` Calories    string `xml:\"calories\"` }  func main() { var ( menu BreakfastMenu food Food )  xmlData := bytes.NewBufferString(data)  d := xml.NewDecoder(xmlData)  for t, _ := d.Token(); t != nil; t, _ = d.Token() { switch se := t.(type) { case xml.StartElement: if se.Name.Local == foodElementName { d.DecodeElement(&amp;food, &amp;se) menu.Food = append(menu.Food, food) } } }  fmt.Printf(\"--- Unmarshal ---\\n\\n\") for _, foodNode := range menu.Food { fmt.Printf(\"Name: %s\\n\", foodNode.Name) fmt.Printf(\"Price: %s\\n\", foodNode.Price) fmt.Printf(\"Description: %s\\n\", foodNode.Description) fmt.Printf(\"Calories: %s\\n\", foodNode.Calories) fmt.Printf(\"---\\n\") } }  var ( data = ` &lt;?xml version=\"1.0\" encoding=\"UTF-8\"?> &lt;breakfast_menu>   &lt;food>     &lt;name>Belgian Waffles&lt;\/name>     &lt;price>$5.95&lt;\/price>     &lt;description>Two of our famous Belgian Waffles with plenty of real maple syrup&lt;\/description>     &lt;calories>650&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Strawberry Belgian Waffles&lt;\/name>     &lt;price>$7.95&lt;\/price>     &lt;description>Light Belgian waffles covered with strawberries and whipped cream&lt;\/description>     &lt;calories>900&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Berry-Berry Belgian Waffles&lt;\/name>     &lt;price>$8.95&lt;\/price>     &lt;description>Light Belgian waffles covered with an assortment of fresh berries and whipped cream&lt;\/description>     &lt;calories>900&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>French Toast&lt;\/name>     &lt;price>$4.50&lt;\/price>     &lt;description>Thick slices made from our homemade sourdough bread&lt;\/description>     &lt;calories>600&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Homestyle Breakfast&lt;\/name>     &lt;price>$6.95&lt;\/price>     &lt;description>Two eggs, bacon or sausage, toast, and our ever-popular hash browns&lt;\/description>     &lt;calories>950&lt;\/calories>   &lt;\/food> &lt;\/breakfast_menu> ` ) <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0435 \u0438 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0438\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435:<\/p>\n<pre><code class=\"go\">d := xml.NewDecoder(xmlData)  for t, _ := d.Token(); t != nil; t, _ = d.Token() { switch se := t.(type) { case xml.StartElement: if se.Name.Local == foodElementName { d.DecodeElement(&amp;food, &amp;se) menu.Food = append(menu.Food, food) } } }<\/code><\/pre>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Decoder\" rel=\"noopener noreferrer nofollow\">xml.Decoder<\/a> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#NewDecoder\" rel=\"noopener noreferrer nofollow\">xml.NewDecoder<\/a>. \u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0430\u043c xml \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Decoder.Token\" rel=\"noopener noreferrer nofollow\">Token<\/a>. \u041e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Token\" rel=\"noopener noreferrer nofollow\">Token<\/a> \u0438\u043b\u0438 nil, \u0435\u0441\u043b\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442 \u043a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430. \u0421\u0442\u0440\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Token\" rel=\"noopener noreferrer nofollow\">Token<\/a> \u0438 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0446\u0430 \u0444\u0430\u0439\u043b\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f nil \u0434\u043b\u044f <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Token\" rel=\"noopener noreferrer nofollow\">Token<\/a> \u0438 <a href=\"https:\/\/pkg.go.dev\/io#pkg-variables\" rel=\"noopener noreferrer nofollow\">io.EOF<\/a> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<p>\u0422\u0438\u043f xml.Token \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 <a href=\"https:\/\/cs.opensource.google\/go\/go\/+\/refs\/tags\/go1.19.3:src\/encoding\/xml\/xml.go;l=52\" rel=\"noopener noreferrer nofollow\">\u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d<\/a> \u043a\u0430\u043a &#8216;<em>type Token any&#8217;<\/em> (\u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c <a href=\"https:\/\/pkg.go.dev\/builtin#any\" rel=\"noopener noreferrer nofollow\">any \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d<\/a> \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441: &#8216;<em>type any = interface{}&#8217;<\/em>). \u0414\u043e <a href=\"https:\/\/go.dev\/blog\/go1.18\" rel=\"noopener noreferrer nofollow\">\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u043e\u0432 \u0432 Golang<\/a> xml.Token \u0431\u044b\u043b <a href=\"https:\/\/cs.opensource.google\/go\/go\/+\/refs\/tags\/go1.17.13:src\/encoding\/xml\/xml.go;l=55\" rel=\"noopener noreferrer nofollow\">\u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/a>: &#8216;<em>type Token interface{}&#8217;<\/em>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438, <a href=\"https:\/\/pkg.go.dev\/encoding\/xml@go1.19.2#Token\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0442\u0438\u043f\u043e\u0432: StartElement, EndElement, CharData, Comment, ProcInst \u0438\u043b\u0438 Directive. \u041d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0430\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0442.\u0435. \u0442\u0438\u043f StartElement. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d \u043d\u0430\u043c \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0434\u043e\u0439 \u201cfood\u201d. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0442\u0430\u043a, \u0442\u043e \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0432 Go \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 Decode.<\/p>\n<h2>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 (custom unmarshal)<\/h2>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f. \u0427\u0430\u0441\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0431\u044b\u0432\u0430\u0435\u0442 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0434\u0430\u0442\u044b, \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043b\u0438\u0431\u043e enum-\u043e\u0432. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <a href=\"https:\/\/pkg.go.dev\/encoding\/xml@go1.17.13#Unmarshaler\" rel=\"noopener noreferrer nofollow\">Unmarshaler<\/a> \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"https:\/\/pkg.go.dev\/encoding\/xml\" rel=\"noopener noreferrer nofollow\">encoding\/xml<\/a>. \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434: <a href=\"https:\/\/pkg.go.dev\/encoding\/xml@go1.17.13#Unmarshaler\" rel=\"noopener noreferrer nofollow\">UnmarshalXML<\/a>, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"go\">type userDate time.Time const userDateFormat = \"2006-01-02\"  func (ud *userDate) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { dateString := \"\" err := d.DecodeElement(&amp;dateString, &amp;start) if err != nil { return err } dat, err := time.Parse(userDateFormat, dateString) if err != nil { return err } *ud = userDate(dat) return nil }<\/code><\/pre>\n<p>\u041a\u043e\u0440\u043e\u0442\u043a\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Decoder\" rel=\"noopener noreferrer nofollow\">xml.Decoder<\/a> \u0438 xml \u044d\u043b\u0435\u043c\u0435\u043d\u0442 (\u043c\u044b \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 xml.StartElement \u0432 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u043c \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u044b \u043f\u0430\u0440\u0441\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0442\u0438\u043f <a href=\"https:\/\/pkg.go.dev\/time#Time\" rel=\"noopener noreferrer nofollow\">time.Time<\/a> (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0432\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0434\u0430\u0442\u044b: <em>userDateFormat<\/em>) \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0438\u0432\u0435\u0440\u0443 <em>ud<\/em>, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0432 \u0442\u0438\u043f \u043a <em>userDate<\/em>. \u041f\u043e\u043b\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u043e <a href=\"https:\/\/go.dev\/play\/p\/9hzKuHEP7ar\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<details class=\"spoiler\">\n<summary>Custom unmarshal XML Golang<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"go\">package main  import ( \"encoding\/xml\" \"fmt\" \"time\" )  type userDate time.Time  const userDateFormat = \"2006-01-02\"  type FilmsDB struct { XMLName xml.Name `xml:\"films\"` Film    []Film   `xml:\"film\"` }  type Film struct { Title       string   `xml:\"title\"` ReleaseDate userDate `xml:\"releaseDate\"` }  func (ud *userDate) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { dateString := \"\" err := d.DecodeElement(&amp;dateString, &amp;start) if err != nil { return err } dat, err := time.Parse(userDateFormat, dateString) if err != nil { return err } *ud = userDate(dat) return nil }  func (ud userDate) String() string { return time.Time(ud).Format(time.RFC822) }  func main() { filmsDB := new(FilmsDB) err := xml.Unmarshal([]byte(data), filmsDB) if err != nil { fmt.Printf(\"error: %v\", err) return } fmt.Printf(\"--- Unmarshal ---\\n\\n\") for _, film := range filmsDB.Film { fmt.Printf(\"Title: %s\\n\", film.Title) fmt.Printf(\"Release Date: %s\\n\", film.ReleaseDate) fmt.Printf(\"---\\n\") } }  var ( data = ` &lt;?xml version=\"1.0\" encoding=\"UTF-8\"?> &lt;films>   &lt;film>     &lt;title>Johnny Mnemonic&lt;\/title>     &lt;releaseDate>1995-05-26&lt;\/releaseDate>   &lt;\/film> &lt;\/films> ` ) <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0422\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438<\/h2>\n<p>\u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0435\u0449\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0432 \u043f\u0440\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438 \u0432 xml. \u0420\u0435\u0434\u043a\u043e, \u043d\u043e \u0432\u0441\u0435 \u0436\u0435 \u0438\u043d\u043e\u0433\u0434\u0430 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u0441 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u043e\u0439, \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0439 \u043e\u0442 UTF-8. \u041d\u0430 \u044d\u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043e\u043b\u044f <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Decoder\" rel=\"noopener noreferrer nofollow\"><em>CharsetReader \u0443 \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430<\/em><\/a>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438 xml \u0444\u0430\u0439\u043b\u0430 \u0432 utf-8 (\u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430: &#8216;<em>CharsetReader func(charset string, input io.Reader) (io.Reader, error)&#8217;<\/em> )<\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0437\u0430\u0434\u0430\u0442\u044c CharsetEncoder \u2013 \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <a href=\"https:\/\/pkg.go.dev\/golang.org\/x\/net\/html\/charset#NewReaderLabel\" rel=\"noopener noreferrer nofollow\">NewReaderLabel<\/a> \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"https:\/\/pkg.go.dev\/golang.org\/x\/net\/html\/charset\" rel=\"noopener noreferrer nofollow\">x\/net\/html\/charset<\/a>. \u041f\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u043c\u0443 charset (\u043e\u043d \u0436\u0435 label \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 <a href=\"https:\/\/pkg.go.dev\/golang.org\/x\/net\/html\/charset#NewReaderLabel\" rel=\"noopener noreferrer nofollow\">NewReaderLabel<\/a>) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/pkg.go.dev\/golang.org\/x\/net\/html\/charset#Lookup\" rel=\"noopener noreferrer nofollow\">Lookup<\/a> \u043e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 \u0438\u0437 \u044d\u0442\u043e\u0439 <a href=\"https:\/\/cs.opensource.google\/go\/x\/text\/+\/master:encoding\/htmlindex\/tables.go;l=94?q=nameMap&amp;ss=go\/x\/text\" rel=\"noopener noreferrer nofollow\">\u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/a>. \u041f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 charset \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0438\u0437 <a href=\"https:\/\/www.tutorialspoint.com\/xml\/xml_encoding.htm\" rel=\"noopener noreferrer nofollow\">encoding<\/a> \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 xml \u0444\u0430\u0439\u043b\u0430. \u041a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439:<\/p>\n<pre><code class=\"go\">filmsDB := new(FilmsDB) r := bytes.NewReader([]byte(data)) d := xml.NewDecoder(r) d.CharsetReader = charset.NewReaderLabel err := d.Decode(&amp;filmsDB) if err != nil { fmt.Printf(\"error: %v\", err) return }<\/code><\/pre>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c, \u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e <a href=\"https:\/\/go.dev\/play\/p\/PGNU_SIFCdF\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u043d &#8216;<em>encoding=&#187;windows-1251&#8243;<\/em>&#8216; \u0443 XML \u0438 <em>title<\/em> \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 windows-1251. <\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u043c\u0438 XML \u0432 Golang<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"go\">package main  import ( \"bytes\" \"encoding\/xml\" \"fmt\" \"time\"  \"golang.org\/x\/net\/html\/charset\" )  type userDate time.Time  const userDateFormat = \"2006-01-02\"  type FilmsDB struct { XMLName xml.Name `xml:\"films\"` Film    []Film   `xml:\"film\"` }  type Film struct { Title       string   `xml:\"title\"` ReleaseDate userDate `xml:\"releaseDate\"` }  func (ud *userDate) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { dateString := \"\" err := d.DecodeElement(&amp;dateString, &amp;start) if err != nil { return err } dat, err := time.Parse(userDateFormat, dateString) if err != nil { return err } *ud = userDate(dat) return nil }  func (ud userDate) String() string { return time.Time(ud).Format(time.RFC822) }  func main() { filmsDB := new(FilmsDB) r := bytes.NewReader([]byte(data)) d := xml.NewDecoder(r) d.CharsetReader = charset.NewReaderLabel err := d.Decode(&amp;filmsDB) if err != nil { fmt.Printf(\"error: %v\", err) return }  fmt.Printf(\"--- Unmarshal ---\\n\\n\") for _, film := range filmsDB.Film { fmt.Printf(\"Title: %s\\n\", film.Title) fmt.Printf(\"Release Date: %s\\n\", film.ReleaseDate) fmt.Printf(\"---\\n\") } }  var ( jhonnyMnemonicASCII = []byte{0xc4, 0xe6, 0xee, 0xed, 0xed, 0xe8, 0x2d, 0xcc, 0xed, 0xe5, 0xec, 0xee, 0xed, 0xe8, 0xea} )  var ( data = ` &lt;?xml version=\"1.0\" encoding=\"windows-1251\"?> &lt;films>   &lt;film>     &lt;title>` + string(jhonnyMnemonicASCII) + `&lt;\/title>     &lt;releaseDate>1995-05-26&lt;\/releaseDate>   &lt;\/film> &lt;\/films> ` ) <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 xml \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435  \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b. \u041e\u043d\u0430 \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u0435\u0442 \u043d\u0430 \u043f\u043e\u043b\u043d\u043e\u0442\u0443 \u0438 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u043e\u0431\u044a\u0435\u043c\u043b\u044e\u0449\u0435\u0439, \u043d\u043e \u044d\u0442\u043e\u0433\u043e, \u043e\u0431\u044b\u0447\u043d\u043e, \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u044f\u0442 \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u0436\u0438\u0437\u043d\u044c \u0438 \u0443\u0441\u043a\u043e\u0440\u044f\u0442 \u0432\u0430\u0448\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438.<\/p>\n<h2>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/h2>\n<p><a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Marshal\" rel=\"noopener noreferrer nofollow\">https:\/\/pkg.go.dev\/encoding\/xml#Marshal<\/a> &#8212; \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u043c\u0435\u0442\u043e\u0434\u0443 Marshal, \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c go \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f xml<\/p>\n<p><a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-use-struct-tags-in-go-ru\" rel=\"noopener noreferrer nofollow\">https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-use-struct-tags-in-go-ru<\/a> &#8212; \u043f\u0440\u043e \u0442\u0435\u0433\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0432 Golang<\/p>\n<p><a href=\"https:\/\/www.onlinetool.io\/xmltogo\/\" rel=\"noopener noreferrer nofollow\">https:\/\/www.onlinetool.io\/xmltogo\/<\/a> &#8212; \u043e\u043d\u043b\u0430\u0439\u043d \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 go \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u043f\u043e xml \u0444\u0430\u0439\u043b\u0443<\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/company\/vk\/blog\/463063\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/company\/vk\/blog\/463063\/<\/a> &#8212; \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0432 \u043e\u0431\u0449\u0435\u043c \u0438 \u043f\u0440\u043e \u043f\u0443\u0441\u0442\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/702918\/\"> https:\/\/habr.com\/ru\/post\/702918\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0410\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c XML \u0432 2022 \u0433\u043e\u0434\u0443 \u0431\u044b\u043b\u0430 \u0431\u044b \u043f\u043e\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u043d\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e legacy \u0441\u0438\u0441\u0442\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441 \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.  XML \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u0435\u043d \u0432 travel \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, GDS (\u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0431\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e \u043d\u0438\u0445 \u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%93%D0%BB%D0%BE%D0%B1%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B4%D0%B8%D1%81%D1%82%D1%80%D0%B8%D0%B1%D1%8C%D1%8E%D1%82%D0%BE%D1%80%D1%81%D0%BA%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0\" rel=\"noopener noreferrer nofollow\"><u>\u0432\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/u><\/a>) \u0438\u043b\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 <a href=\"https:\/\/www.nationalrail.co.uk\/100296.aspx\" rel=\"noopener noreferrer nofollow\"><u>Darwin<\/u><\/a> \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u0438 \u0436\u0435\u043b\u0435\u0437\u043d\u043e\u0434\u043e\u0440\u043e\u0436\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 \u0412\u0435\u043b\u0438\u043a\u043e\u0431\u0440\u0438\u0442\u0430\u043d\u0438\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0435\u0433\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0430. \u0412 \u043d\u0435\u0439 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u043f\u0430\u0440\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0443 xml \u0432 Golang: \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0439, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043f\u043e\u043b\u044f \u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u043c\u0438.  \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/pkg.go.dev\/encoding\/xml\" rel=\"noopener noreferrer nofollow\"><u>encoding\/xml<\/u><\/a> \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 c <a href=\"https:\/\/pkg.go.dev\/encoding\/json\" rel=\"noopener noreferrer nofollow\"><u>encoding\/json<\/u><\/a>, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0433\u043e, \u043d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0432\u0441\u0435 \u0436\u0435 \u0435\u0441\u0442\u044c.<\/p>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f Go \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u043f\u043e XML<\/h2>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043e\u043f\u0438\u0441\u0430\u0442\u044c go \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 xml \u0444\u0430\u0439\u043b\u0430\u043c. \u041c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e c \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u0442\u0435\u0433\u043e\u0432 (\u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u0435\u0433\u0438 \u0434\u043b\u044f XML \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e \u043c\u0435\u0442\u043e\u0434\u0443 <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Marshal\" rel=\"noopener noreferrer nofollow\">Marshal<\/a>). \u041d\u043e \u0434\u043b\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 go \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u043e xml, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/github.com\/miku\/zek\/\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/miku\/zek\/<\/a> (\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043d\u043b\u0430\u0439\u043d \u0432\u0435\u0440\u0441\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430: <a href=\"https:\/\/www.onlinetool.io\/xmltogo\/\" rel=\"noopener noreferrer nofollow\">https:\/\/www.onlinetool.io\/xmltogo\/<\/a>). \u0415\u0441\u043b\u0438 \u0432\u044b \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0435\u0441\u044c \u0441 \u0442\u0430\u043a\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c, \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e \u0441\u0442\u0430\u0442\u044c\u0435\u0439 <a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-use-struct-tags-in-go-ru\" rel=\"noopener noreferrer nofollow\">&#171;\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u0433\u043e\u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0432 Go&#187;<\/a><\/p>\n<h2>\u041f\u0430\u0440\u0441\u0438\u043d\u0433 XML \u0432 Go \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e xml \u0444\u0430\u0439\u043b\u0430 \u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e Unmarshal \u0432 golang \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u041f\u0440\u0438\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 \u044f \u0432\u0437\u044f\u043b \u0441 \u0441\u0430\u0439\u0442\u0430 <a href=\"https:\/\/www.w3schools.com\/xml\/simple.xml\" rel=\"noopener noreferrer nofollow\">w3schools<\/a>. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043e\u043f\u0438\u0441\u0430\u0442\u044c go struct, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 xml. \u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u044d\u0433\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 (\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e json, \u0435\u0441\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441 json \u0432 golang, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c <a href=\"https:\/\/gobyexample.com\/json\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a> \u0438 <a href=\"https:\/\/golang.cafe\/blog\/golang-json-marshal-example.html\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>, \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c <a href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/529318\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a> \u0438 <a href=\"https:\/\/golang-blog.blogspot.com\/2019\/11\/json-golang.html\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>). <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440 XML \u0444\u0430\u0439\u043b\u0430:<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?> &lt;breakfast_menu>   &lt;food>     &lt;name>Belgian Waffles&lt;\/name>     &lt;price>$5.95&lt;\/price>     &lt;description>Two of our famous Belgian Waffles with plenty of real maple syrup&lt;\/description>     &lt;calories>650&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Strawberry Belgian Waffles&lt;\/name>     &lt;price>$7.95&lt;\/price>     &lt;description>Light Belgian waffles covered with strawberries and whipped cream&lt;\/description>     &lt;calories>900&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Berry-Berry Belgian Waffles&lt;\/name>     &lt;price>$8.95&lt;\/price>     &lt;description>Light Belgian waffles covered with an assortment of fresh berries and whipped cream&lt;\/description>     &lt;calories>900&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>French Toast&lt;\/name>     &lt;price>$4.50&lt;\/price>     &lt;description>Thick slices made from our homemade sourdough bread&lt;\/description>     &lt;calories>600&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Homestyle Breakfast&lt;\/name>     &lt;price>$6.95&lt;\/price>     &lt;description>Two eggs, bacon or sausage, toast, and our ever-popular hash browns&lt;\/description>     &lt;calories>950&lt;\/calories>   &lt;\/food> &lt;\/breakfast_menu><\/code><\/pre>\n<p>\u0418 \u0432\u043e\u0442 go \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0435\u0433\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442:<\/p>\n<pre><code class=\"go\">type BreakfastMenu struct { XMLName xml.Name `xml:\"breakfast_menu\"` Food    []struct { Name        string `xml:\"name\"` Price       string `xml:\"price\"` Description string `xml:\"description\"` Calories    string `xml:\"calories\"` } `xml:\"food\"` } <\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e. \u041a\u043e\u0434 \u0434\u043b\u044f Unmarshal (\u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0438\u0437 xml \u0432 golang \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443) \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"go\">menu := new(BreakfastMenu) err := xml.Unmarshal([]byte(data), menu) if err != nil { fmt.Printf(\"error: %v\", err) return }<\/code><\/pre>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e Marshal (\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f Unmarshal, \u0438\u0437 go \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432 xml):<\/p>\n<pre><code class=\"go\">xmlText, err := xml.MarshalIndent(menu, \" \", \" \") if err != nil { fmt.Printf(\"error: %v\\n\", err) return }<\/code><\/pre>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u043e <a href=\"https:\/\/go.dev\/play\/p\/2P5kCbP7FMw\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a> (\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#MarshalIndent\" rel=\"noopener noreferrer nofollow\">MarshalIndent<\/a> \u0432\u043c\u0435\u0441\u0442\u043e <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Marshal\" rel=\"noopener noreferrer nofollow\">Marshal<\/a> \u2013 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 xml \u0432 \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u043c \u0432\u0438\u0434\u0435: \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0442\u0441\u0442\u0443\u043f\u044b \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044b \u0441\u0442\u0440\u043e\u043a.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 Golang XML Marshal\/Unmarshal<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"go\">package main  import ( \"encoding\/xml\" \"fmt\" )  type BreakfastMenu struct { XMLName xml.Name `xml:\"breakfast_menu\"` \/\/Text    string   `xml:\",chardata\"` Food []struct { \/\/Text        string `xml:\",chardata\"` Name        string `xml:\"name\"` Price       string `xml:\"price\"` Description string `xml:\"description\"` Calories    string `xml:\"calories\"` } `xml:\"food\"` }  func main() { menu := new(BreakfastMenu) err := xml.Unmarshal([]byte(data), menu) if err != nil { fmt.Printf(\"error: %v\", err) return } fmt.Printf(\"--- Unmarshal ---\\n\\n\") for _, foodNode := range menu.Food { fmt.Printf(\"Name: %s\\n\", foodNode.Name) fmt.Printf(\"Price: %s\\n\", foodNode.Price) fmt.Printf(\"Description: %s\\n\", foodNode.Description) fmt.Printf(\"Calories: %s\\n\", foodNode.Calories) fmt.Printf(\"---\\n\") }  xmlText, err := xml.MarshalIndent(menu, \" \", \" \") if err != nil { fmt.Printf(\"error: %v\\n\", err) return } fmt.Printf(\"\\n--- Marshal ---\\n\\n\") fmt.Printf(\"xml: %s\\n\", string(xmlText)) }  var data = ` &lt;?xml version=\"1.0\" encoding=\"UTF-8\"?> &lt;breakfast_menu>   &lt;food>     &lt;name>Belgian Waffles&lt;\/name>     &lt;price>$5.95&lt;\/price>     &lt;description>Two of our famous Belgian Waffles with plenty of real maple syrup&lt;\/description>     &lt;calories>650&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Strawberry Belgian Waffles&lt;\/name>     &lt;price>$7.95&lt;\/price>     &lt;description>Light Belgian waffles covered with strawberries and whipped cream&lt;\/description>     &lt;calories>900&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Berry-Berry Belgian Waffles&lt;\/name>     &lt;price>$8.95&lt;\/price>     &lt;description>Light Belgian waffles covered with an assortment of fresh berries and whipped cream&lt;\/description>     &lt;calories>900&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>French Toast&lt;\/name>     &lt;price>$4.50&lt;\/price>     &lt;description>Thick slices made from our homemade sourdough bread&lt;\/description>     &lt;calories>600&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Homestyle Breakfast&lt;\/name>     &lt;price>$6.95&lt;\/price>     &lt;description>Two eggs, bacon or sausage, toast, and our ever-popular hash browns&lt;\/description>     &lt;calories>950&lt;\/calories>   &lt;\/food> &lt;\/breakfast_menu> ` <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u043e \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c: \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 xml \u0444\u0430\u0439\u043b \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430, \u0442\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0438 \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043f\u043e \u0441\u0435\u0442\u0438 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0430\u0440\u0441\u0438\u043d\u0433. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<h2>\u041f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 XML<\/h2>\n<p>\u0414\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 XML \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Decoder\" rel=\"noopener noreferrer nofollow\">Decoder<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0441\u0438\u0442\u044c xml \u0444\u0430\u0439\u043b \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u0442\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 UTF-8 (\u0434\u043e\u0441\u043b\u043e\u0432\u043d\u0430\u044f \u0446\u0438\u0442\u0430\u0442\u0430 \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438: <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Decoder\" rel=\"noopener noreferrer nofollow\">\u201cA Decoder represents an XML parser reading a particular input stream. The parser assumes that its input is encoded in UTF-8.\u201d<\/a>)<\/p>\n<p>\u0421 \u043f\u043e\u043b\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0438 <a href=\"https:\/\/go.dev\/play\/p\/dNmF3NBw9gX\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435<\/a>. <\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 XML \u0432 Golang<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"go\">package main  import ( \"bytes\" \"encoding\/xml\" \"fmt\" )  const foodElementName = \"food\"  type BreakfastMenu struct { Food []Food `xml:\"food\"` }  type Food struct { Name        string `xml:\"name\"` Price       string `xml:\"price\"` Description string `xml:\"description\"` Calories    string `xml:\"calories\"` }  func main() { var ( menu BreakfastMenu food Food )  xmlData := bytes.NewBufferString(data)  d := xml.NewDecoder(xmlData)  for t, _ := d.Token(); t != nil; t, _ = d.Token() { switch se := t.(type) { case xml.StartElement: if se.Name.Local == foodElementName { d.DecodeElement(&amp;food, &amp;se) menu.Food = append(menu.Food, food) } } }  fmt.Printf(\"--- Unmarshal ---\\n\\n\") for _, foodNode := range menu.Food { fmt.Printf(\"Name: %s\\n\", foodNode.Name) fmt.Printf(\"Price: %s\\n\", foodNode.Price) fmt.Printf(\"Description: %s\\n\", foodNode.Description) fmt.Printf(\"Calories: %s\\n\", foodNode.Calories) fmt.Printf(\"---\\n\") } }  var ( data = ` &lt;?xml version=\"1.0\" encoding=\"UTF-8\"?> &lt;breakfast_menu>   &lt;food>     &lt;name>Belgian Waffles&lt;\/name>     &lt;price>$5.95&lt;\/price>     &lt;description>Two of our famous Belgian Waffles with plenty of real maple syrup&lt;\/description>     &lt;calories>650&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Strawberry Belgian Waffles&lt;\/name>     &lt;price>$7.95&lt;\/price>     &lt;description>Light Belgian waffles covered with strawberries and whipped cream&lt;\/description>     &lt;calories>900&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Berry-Berry Belgian Waffles&lt;\/name>     &lt;price>$8.95&lt;\/price>     &lt;description>Light Belgian waffles covered with an assortment of fresh berries and whipped cream&lt;\/description>     &lt;calories>900&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>French Toast&lt;\/name>     &lt;price>$4.50&lt;\/price>     &lt;description>Thick slices made from our homemade sourdough bread&lt;\/description>     &lt;calories>600&lt;\/calories>   &lt;\/food>   &lt;food>     &lt;name>Homestyle Breakfast&lt;\/name>     &lt;price>$6.95&lt;\/price>     &lt;description>Two eggs, bacon or sausage, toast, and our ever-popular hash browns&lt;\/description>     &lt;calories>950&lt;\/calories>   &lt;\/food> &lt;\/breakfast_menu> ` ) <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0435 \u0438 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0438\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435:<\/p>\n<pre><code class=\"go\">d := xml.NewDecoder(xmlData)  for t, _ := d.Token(); t != nil; t, _ = d.Token() { switch se := t.(type) { case xml.StartElement: if se.Name.Local == foodElementName { d.DecodeElement(&amp;food, &amp;se) menu.Food = append(menu.Food, food) } } }<\/code><\/pre>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Decoder\" rel=\"noopener noreferrer nofollow\">xml.Decoder<\/a> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#NewDecoder\" rel=\"noopener noreferrer nofollow\">xml.NewDecoder<\/a>. \u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0430\u043c xml \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Decoder.Token\" rel=\"noopener noreferrer nofollow\">Token<\/a>. \u041e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Token\" rel=\"noopener noreferrer nofollow\">Token<\/a> \u0438\u043b\u0438 nil, \u0435\u0441\u043b\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442 \u043a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430. \u0421\u0442\u0440\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Token\" rel=\"noopener noreferrer nofollow\">Token<\/a> \u0438 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0446\u0430 \u0444\u0430\u0439\u043b\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f nil \u0434\u043b\u044f <a href=\"https:\/\/pkg.go.dev\/encoding\/xml#Token\" rel=\"noopener noreferrer nofollow\">Token<\/a> \u0438 <a href=\"https:\/\/pkg.go.dev\/io#pkg-variables\" rel=\"noopener noreferrer nofollow\">io.EOF<\/a> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<p>\u0422\u0438\u043f xml.Token \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 <a href=\"https:\/\/cs.opensource.google\/go\/go\/+\/refs\/tags\/go1.19.3:src\/encoding\/xml\/xml.go;l=52\" rel=\"noopener noreferrer nofollow\">\u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d<\/a> \u043a\u0430\u043a &#8216;<em>type Token any&#8217;<\/em> (\u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c <a href=\"https:\/\/pkg.go.dev\/builtin#any\" rel=\"noopener noreferrer nofollow\">any \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d<\/a> \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441: &#8216;<em>type any = interface{}&#8217;<\/em>). \u0414\u043e <a href=\"https:\/\/go.dev\/blog\/go1.18\" rel=\"noopener noreferrer nofollow\">\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u043e\u0432 \u0432 Golang<\/a> xml.Token \u0431\u044b\u043b <a href=\"https:\/\/cs.opensource.google\/go\/go\/+\/refs\/tags\/go1.17.13:src\/encoding\/xml\/xml.go;l=55\" rel=\"noopener noreferrer nofollow\">\u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u043a\u0430\u043a \u043f\u0443\u0441\u0442\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/a>: &#8216;<em>type Token interface{}&#8217;<\/em>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438, <a href=\"https:\/\/pkg.go.dev\/encoding\/xml@go1.19.2#Token\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0434\u043d\u0438\u043c<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-342013","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/342013","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=342013"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/342013\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=342013"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=342013"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=342013"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}