Функция xml.Unmarshal
Функция xml.Unmarshal преобразует XML-данные в структуры Go.
Первый параметр принимает срез байтов с XML-данными, второй -
указатель на структуру, в которую нужно распарсить данные.
Функция возвращает ошибку, если парсинг не удался.
Синтаксис
err := xml.Unmarshal(data, &struct)
Пример
Давайте распарсим простой XML с тегом person, содержащим атрибуты и вложенные элементы:
package main
import (
"encoding/xml"
"fmt"
)
type Person struct {
XMLName xml.Name `xml:"person"`
ID int `xml:"id,attr"`
Name string `xml:"name"`
Age int `xml:"age"`
}
func main() {
data := []byte(`
<person id="123">
<name>John Doe</name>
<age>30</age>
</person>
`)
var res Person
err := xml.Unmarshal(data, &res)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("ID: %d, Name: %s, Age: %d\n", res.ID, res.Name, res.Age)
}
Результат выполнения кода:
"ID: 123, Name: John Doe, Age: 30"
Пример
Распарсим XML со списком элементов, используя тег xml:"item" для маркировки:
package main
import (
"encoding/xml"
"fmt"
)
type Item struct {
XMLName xml.Name `xml:"item"`
Name string `xml:"name"`
Price float64 `xml:"price"`
}
type Catalog struct {
XMLName xml.Name `xml:"catalog"`
Items []Item `xml:"item"`
}
func main() {
data := []byte(`
<catalog>
<item>
<name>Laptop</name>
<price>999.99</price>
</item>
<item>
<name>Mouse</name>
<price>25.50</price>
</item>
</catalog>
`)
var res Catalog
err := xml.Unmarshal(data, &res)
if err != nil {
fmt.Println(err)
return
}
for _, item := range res.Items {
fmt.Printf("%s: $%.2f\n", item.Name, item.Price)
}
}
Результат выполнения кода:
"Laptop: $999.99"
"Mouse: $25.50"
Пример
Обработаем XML с пространствами имен, используя поле XMLName:
package main
import (
"encoding/xml"
"fmt"
)
type Doc struct {
XMLName xml.Name `xml:"http://example.com doc"`
Body string `xml:"body"`
}
func main() {
data := []byte(`
<doc xmlns="http://example.com">
<body>Hello, XML namespace!</body>
</doc>
`)
var res Doc
err := xml.Unmarshal(data, &res)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(res.Body)
}
Результат выполнения кода:
"Hello, XML namespace!"
Смотрите также
-
функцию
xml.Marshal,
которая преобразует структуры Go в XML -
функцию
xml.MarshalIndent,
которая преобразует структуры в форматированный XML -
тип
xml.Decoder,
который позволяет читать XML из потока -
тип
xml.Name,
который представляет имя XML-элемента с пространством имен