Вложенный элемент в разметке в Go
Поле с типом структуры превращается во вложенный элемент внутри родительского тега. Имя внутреннего узла задают меткой у поля или именем типа, если метки нет.
Так описывают составные данные: адрес внутри пользователя, параметры внутри запроса. Сборка строит дерево тегов, разбор заполняет вложенные поля по соответствующим узлам.
Объявим пользователя с вложенным адресом и соберем текст:
package main
import (
"encoding/xml"
"fmt"
)
type Address struct {
City string `xml:"city"`
}
type User struct {
Name string `xml:"name"`
Addr Address `xml:"address"`
}
func main() {
u := User{
Name: "ann",
Addr: Address{City: "oslo"},
}
data, err := xml.Marshal(u)
if err != nil {
fmt.Println("error")
return
}
fmt.Println(string(data))
}
Внутри User появляется блок
address с элементом city.
Поле Addr не печатается отдельным
тегом с таким именем: в текст идет имя
из метки address.
Разберем готовый текст с тем же деревом:
package main
import (
"encoding/xml"
"fmt"
)
type Address struct {
City string `xml:"city"`
}
type User struct {
Name string `xml:"name"`
Addr Address `xml:"address"`
}
func main() {
raw := []byte(`<User><name>ann</name><address><city>oslo</city></address></User>`)
var u User
err := xml.Unmarshal(raw, &u)
if err != nil {
fmt.Println("error")
return
}
fmt.Println(u.Addr.City)
}
Даны структуры:
type Size struct {
W int `xml:"w"`
H int `xml:"h"`
}
type Box struct {
Label string `xml:"label"`
Dim Size `xml:"size"`
}
Соберите текст для коробки с подписью
"a" и размером 2 на 3
и выведите результат.
Дан текст:
raw := []byte(`<Box><label>a</label><size><w>2</w><h>3</h></size></Box>`)
Разберите его в Box и выведите
ширину из вложенного поля.
Дана структура:
type Inner struct {
Val int `xml:"val"`
}
type Outer struct {
Core Inner `xml:"core"`
}
Укажите имя вложенного элемента для
поля Core без запуска программы.