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

Go:解组包含不同实体的 XML 列表

Go:解组包含不同实体的 XML 列表

Go
料青山看我应如是 2021-12-20 14:33:43
我得到了以下 XML 结构<properties>    <property name="element1">data1</property>    <property name="element2">data2</property>    <datetime name="start">13 Jan 2015 14:13:15GMT</datetime>    <property name="element3">data3</property>    <property name="element4">data4</property>    <property name="element5">data5</property>    <categorisation name="category">cat1</categorisation>    <property name="element6">data6</property>    <property name="element7">data7</property></properties>我想将其解组为以下内容:type Property string {    Name string    Value string}type Properties struct {    Props []Property     DateTime time.Time    Category string}但我不知道如何处理乱序属性
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

该encoding/xml软件包会为您处理。您只需要正确标记您的结构字段以告诉xml包它们是如何在 XML 源中找到的:


type Property struct {

    Name  string `xml:"name,attr"`

    Value string `xml:",cdata"`

}


type Properties struct {

    Props    []Property `xml:"property"`

    DateTime string     `xml:"datetime"`

    Category string     `xml:"categorisation"`

}

请注意,我将DateTime字段类型更改为,string因为 XML ( 13 Jan 2015 14:13:15GMT) 中的时间戳不符合标准(在 Go layout:中为ISO 8601)。2006-01-02T15:04:05Z07:00time.RFC3339


解组代码:


ps := Properties{}

if err := xml.Unmarshal([]byte(src), &ps); err != nil {

    panic(err)

}

fmt.Printf("%+v", ps)

输出(在Go Playground上试试):


{Props:[{Name:element1 Value:data1} {Name:element2 Value:data2} {Name:element3 Value:data3}

 {Name:element4 Value:data4} {Name:element5 Value:data5} {Name:element6 Value:data6}

 {Name:element7 Value:data7}] DateTime:13 Jan 2015 14:13:15GMT Category:cat1}

你可以看到,Props正常包含正确的顺序所有7个性能即使<datetime>和<categorisation>标签插入它们之间。


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

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