Список элементов в разметке в Go
Срез структур с общей меткой элемента дает несколько тегов подряд с одним и тем же именом. Каждый элемент среза становится отдельным узлом внутри родителя.
Так описывают списки записей, пунктов меню или строк таблицы без отдельного контейнера на каждый индекс. При разборе все одноименные узлы складывают в срез в том же порядке, как они шли в тексте.
Объявим каталог с двумя позициями и соберем текст:
package main
import (
"encoding/xml"
"fmt"
)
type Item struct {
Name string `xml:"name"`
}
type Catalog struct {
Items []Item `xml:"item"`
}
func main() {
c := Catalog{
Items: []Item{
{Name: "a"},
{Name: "b"},
},
}
data, err := xml.Marshal(c)
if err != nil {
fmt.Println("error")
return
}
fmt.Println(string(data))
}
Внутри Catalog идут два блока
item с разным содержимым. Имя
item взято из метки у поля-среза,
а не из имени типа Item.
Разберем текст с двумя пунктами обратно:
package main
import (
"encoding/xml"
"fmt"
)
type Item struct {
Name string `xml:"name"`
}
type Catalog struct {
Items []Item `xml:"item"`
}
func main() {
raw := []byte(`<Catalog><item><name>a</name></item><item><name>b</name></item></Catalog>`)
var c Catalog
err := xml.Unmarshal(raw, &c)
if err != nil {
fmt.Println("error")
return
}
fmt.Println(len(c.Items), c.Items[1].Name)
}
Даны структуры:
type Row struct {
Val int `xml:"val"`
}
type Table struct {
Rows []Row `xml:"row"`
}
Соберите текст для таблицы с двумя
строками со значениями 1 и 2
и выведите его.
Дан текст:
raw := []byte(`<Catalog><item><name>x</name></item><item><name>y</name></item></Catalog>`)
Разберите его в Catalog как в
примере и выведите длину среза и имя
второго пункта.
Дана структура:
type Part struct {
Code string `xml:"code"`
}
type List struct {
Parts []Part `xml:"part"`
}
Скажите, сколько элементов part
появится при сборке, если в срезе три
значения.