Текст элемента в разметке в Go
Текст между открывающим и закрывающим тегом
элемента можно записать в поле структуры.
Для этого в метке пишут запятую и слово
chardata без отдельного имени элемента
перед запятой.
Такой прием удобен, когда у узла нет вложенных тегов, а есть только строка внутри, например заголовок или имя файла. Сборка и разбор работают так же, ошибку проверяют после каждого шага.
Объявим элемент с одним текстовым полем и соберем его:
package main
import (
"encoding/xml"
"fmt"
)
type Title struct {
Text string `xml:",chardata"`
}
func main() {
t := Title{Text: "hello"}
data, err := xml.Marshal(t)
if err != nil {
fmt.Println("error")
return
}
fmt.Println(string(data))
}
В байтах корневой тег Title обрамляет
строку hello без дополнительного
внутреннего элемента. Значение лежит прямо
между границами тега.
Разберем текст с таким же содержимым обратно:
package main
import (
"encoding/xml"
"fmt"
)
type Title struct {
Text string `xml:",chardata"`
}
func main() {
raw := []byte(`<Title>hello</Title>`)
var t Title
err := xml.Unmarshal(raw, &t)
if err != nil {
fmt.Println("error")
return
}
fmt.Println(t.Text)
}
Дана структура:
type Caption struct {
Line string `xml:",chardata"`
}
Соберите текст для подписи "go"
и выведите байты как строку.
Дан текст:
raw := []byte(`<Caption>go</Caption>`)
Разберите его в Caption и выведите
поле с текстом.
Дана структура:
type Note struct {
Body string `xml:",chardata"`
}
Скажите, появится ли отдельный внутренний
тег для поля Body при сборке.