我不知道如何使这段代码有效。我只想尝试解析这样一个简单的XML文件:
package main
import (
"encoding/xml"
"fmt"
)
type Data struct {
XMLName xml.Name `xml:"data"`
Nam string `xml:"nam,attr"`
}
type Struct struct {
XMLName xml.Name `xml:"struct"`
Data []Data
}
func main() {
x := `
<struct>
<data nam="MESSAGE_TYPE">
</data>
<data nam="MESSAGE_TYPE2">
</data>
</struct>
`
s := Struct{}
err := xml.Unmarshal([]byte(x), &s)
if err != nil {
panic(err)
}
fmt.Printf("%v\n", s)
fmt.Println(s.Data)
}
我得到的是:
{{ struct} []}
[]
但是当我改变&#34;数据&#34;元素为大写,如下所示:
package main
import (
"encoding/xml"
"fmt"
)
type Data struct {
XMLName xml.Name `xml:"Data"`
Nam string `xml:"nam,attr"`
}
type Struct struct {
XMLName xml.Name `xml:"struct"`
Data []Data
}
func main() {
x := `
<struct>
<Data nam="MESSAGE_TYPE">
</Data>
<Data nam="MESSAGE_TYPE2">
</Data>
</struct>
`
s := Struct{}
err := xml.Unmarshal([]byte(x), &s)
if err != nil {
panic(err)
}
fmt.Printf("%v\n", s)
fmt.Println(s.Data)
}
我明白了:
{{ struct} [{{ Data} MESSAGE_TYPE} {{ Data} MESSAGE_TYPE2}]}
[{{ Data} MESSAGE_TYPE} {{ Data} MESSAGE_TYPE2}]
有人可以告诉我为什么吗?
答案 0 :(得分:6)
如果未在结构字段上放置XML注释,则将该字段的名称视为XML元素的名称。
在endoding / xml包中的Unmarshal文档中,我们可以找到以下内容:
Unmarshal使用以下规则将XML元素映射到结构。在规则中,字段的标记指的是与struct字段标记中的键“xml”关联的值(请参阅上面的示例)。
- 如果XML元素包含名称与a匹配的子元素 字段没有任何模式标志(“,attr”,“,chardata”等),Unmarshal 将子元素映射到该结构域。
匹配区分大小写,因此会对您的情况产生影响。
我建议像这样注释结构以适应实际数据:
type Struct struct {
XMLName xml.Name `xml:"struct"`
Data []Data `xml:"data"`
}