1 回答
TA贡献1893条经验 获得超10个赞
不幸的是,无法使用默认的 XML 解组器通过仅使用结构字段标签来实现您的目标,因此您必须:
为具有“ref”字段的“Members”字段提取结构类型(类似于“Info”类型)。
为“Member”使用自定义类型,它是一个字符串,
xml.Unmarshaler
通过从关联的 XML 元素中提取“ref”属性的值来实现。
以下是如何实施上述策略 #2 ( Go Playground ) 的示例:
type Group struct {
Id string `xml:"id,attr"`
Members []MemberRef `xml:"member"`
Info []Info `xml:"info"`
}
type MemberRef string
func (m *MemberRef) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
*m = MemberRef(start.Attr[0].Value) // Assume only the "ref" attribute exists.
_, err := d.Token() // Consume and discard the synthetic xml.EndElement.
return err
}
// ...
var group Group
err := xml.Unmarshal([]byte(xmlstr), &group)
if err != nil {
panic(err)
}
fmt.Printf("%#v\n", group)
// main.Group{Id:"26659127", Members:[]main.MemberRef{"292403538", "298884289", "261728686"}, Info:...
请注意,您甚至可以将此结构直接编组为您列出的示例 JSON 格式:
bs, err := json.MarshalIndent(group, "", " ")
if err != nil {
panic(err)
}
fmt.Println(string(bs))
// {
// "Id": "26659127",
// "Members": [
// "292403538",
// "298884289",
// "261728686"
// ],
// "Info": [
// ...
- 1 回答
- 0 关注
- 110 浏览
添加回答
举报