猿问

将 XML 解析为包含切片的结构

情况:

我有这个 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"放在这里,但是没有用。


问题:

有没有可能解决这个问题?如果是,我应该使用什么表达方式?


慕仙森
浏览 111回答 1
1回答

白猪掌柜的

不幸的是,无法使用默认的 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 stringfunc (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 Grouperr := 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": [//     ...
随时随地看视频慕课网APP

相关分类

Go
我要回答