我有这个XML结构:
<group id="26659127">
<member ref="292403538"/>
<member ref="298884289"/>
<member ref="261728686"/>
<info k="name" v="omega"/>
<info k="rank" v="16"/>
</group>
我需要将此XML转换为该结构:
{
Id: "26659127",
Members: ["26659127", "298884289", "261728686"],
Info: [
{
Key: "name",
Value: "omega"
},
{
Key: "rank",
Value: "16"
}
]
}
我已经创建了一个用于解析XML的结构:
type Group struct {
Id string `xml:"id,attr"`
Members []string `xml:" "`
Info []Info `xml:"info"`
}
type Info struct {
Key string `xml:"k,attr"`
Value string `xml:"v,attr"`
}
但是,正如您所看到的,我尚未为Members
定义表达式。实际上,我尝试将xml:"member,ref,attr"
和xml:"member:ref,attr"
放在这里,但是没有用。
是否有可能解决此问题?如果是,我应该使用什么表达方式?
答案 0 :(得分:0)
不幸的是,没有办法通过仅使用struct字段标记来使用默认的XML解组器来实现您的目标,因此您必须:
xml.Unmarshaler
。以下是如何实施上述策略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": [
// ...