У меня есть базовое поле xml, которое выглядит так <cpe test = "123">cpe:/a:openbsd:openssh:5.3p1</cpe>, и я хочу разобрать его с помощью Go. Я создаю объект, и хотя он обычно распаковывает и печатает тестовый атрибут, содержимое внутри скобок всегда печатается как пустое.
package main
import (
"fmt"
"encoding/xml"
)
type Cpe struct {
XMLName xml.Name `xml:"cpe"`
Value string `xml:"chardata"`
Res string `xml:"test,attr"`
}
func main() {
var inputXML = `<cpe test = "123">cpe:/a:openbsd:openssh:5.3p1</cpe>`
byteValue := []byte(inputXML)
// Create the onject
var cpe Cpe
// Unmarshal the xml using the Address object
xml.Unmarshal(byteValue, &cpe)
// prints the Res and Address Value
fmt.Println(cpe.Res)
fmt.Println(cpe.Value)
}
Результатом этих вещей являются 123 и nothing. Погуглив, я узнаю, что могу использовать innerXML вместо chardata, что дало тот же результат.
Детская площадка: https://play.golang.org/p/7eyoXjnOlS4





chardata — это параметр, а не XML-тег или имя атрибута, поэтому вам нужно поставить запятую перед ним, если вы просто указываете параметр:
Value string `xml:",chardata"`
Также проверьте ошибки:
// Unmarshal the xml using the Address object
err := xml.Unmarshal(byteValue, &cpe)
fmt.Println("err:", err)
// prints the Res and Address Value
fmt.Println("attribute:", cpe.Res)
fmt.Println("chardata:", cpe.Value)
Это выведет (попробуйте на Go Playground):
err: <nil>
attribute: 123
chardata: cpe:/a:openbsd:openssh:5.3p1
Большое спасибо! Я провел около 3 часов с этим демоном.