Атрибут элемента в разметке в Go
Поле можно вывести не отдельным тегом,
а атрибутом в открывающей скобке элемента.
В метке после имени атрибута пишут запятую
и слово attr.
Так часто хранят короткий идентификатор или флаг, когда для него не нужен собственный вложенный узел. Остальные поля по-прежнему становятся дочерними элементами или текстом.
Объявим запись с числовым идентификатором в атрибуте и соберем текст:
package main
import (
"encoding/xml"
"fmt"
)
type Entry struct {
ID int `xml:"id,attr"`
Name string `xml:"name"`
}
func main() {
e := Entry{ID: 5, Name: "ann"}
data, err := xml.Marshal(e)
if err != nil {
fmt.Println("error")
return
}
fmt.Println(string(data))
}
У корня Entry в открывающем теге
появляется пара id="5", а имя
остается дочерним элементом name.
Поле ID не дает отдельного тега
id с телом внутри.
Разберем текст с тем же атрибутом:
package main
import (
"encoding/xml"
"fmt"
)
type Entry struct {
ID int `xml:"id,attr"`
Name string `xml:"name"`
}
func main() {
raw := []byte(`<Entry id="5"><name>ann</name></Entry>`)
var e Entry
err := xml.Unmarshal(raw, &e)
if err != nil {
fmt.Println("error")
return
}
fmt.Println(e.ID, e.Name)
}
Дана структура:
type File struct {
Kind string `xml:"kind,attr"`
Path string `xml:"path"`
}
Соберите текст для файла с видом
"txt" и путем "main.go"
и выведите результат.
Дан текст:
raw := []byte(`<Entry id="9"><name>kim</name></Entry>`)
Разберите его в Entry как в
примере и выведите идентификатор с именем.
Дана структура:
type Tag struct {
Code int `xml:"code,attr"`
Text string `xml:"text"`
}
Скажите, где окажется значение поля
Code после сборки: в атрибуте
или во вложенном теге.