为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕仙森 2023-03-29 17:09:04
情况:我有这个 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"放在这里,但是没有用。问题:有没有可能解决这个问题?如果是,我应该使用什么表达方式?
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

不幸的是,无法使用默认的 XML 解组器通过仅使用结构字段标签来实现您的目标,因此您必须:

  1. 为具有“ref”字段的“Members”字段提取结构类型(类似于“Info”类型)。

  2. 为“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": [

//     ...


查看完整回答
反对 回复 2023-03-29
  • 1 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信