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

将子元素的属性直接解析为 Go 结构体

将子元素的属性直接解析为 Go 结构体

Go
蛊毒传说 2021-12-27 17:59:04
在使用 Go 解析 XML 时,如何将嵌套元素的属性直接读入结构中?我的 XML 如下所示。它是 OpenStreetMap 格式的一部分:<way id="123" >        <nd ref="101"/>        <!-- Lots of nd elements repeated -->        <nd ref="109"/></way>我有type Way struct {    Nodes []NodeRef `xml:"nd"`}和type NodeRef struct {    Ref int `xml:"ref,attr"`}但我希望能够做到type Way struct {    Nodes []int `???`}直接地。关于解组的文档对我没有帮助。我试过使用,xml:"nd>ref,attr"但由于“链对 attr 标志无效”而失败。
查看完整描述

1 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

简而言之,你不能直接这样做。绕过 XML 结构的常见模式是实现xml.Unmarshaler接口。下面是一个例子:


type Way struct {

    ID    int 

    Nodes []int

}


func (w *Way) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {

    var payload struct {

        ID    int `xml:"id,attr"`

        Nodes []struct {

            Ref int `xml:"ref,attr"`

        } `xml:"nd"`

    }   


    err := d.DecodeElement(&payload, &start)

    if err != nil {

        return err 

    }   


    w.ID = payload.ID

    w.Nodes = make([]int, 0, len(payload.Nodes))


    for _, node := range payload.Nodes {

        w.Nodes = append(w.Nodes, node.Ref)

    }   


    return nil 

}

在这里,payload变量是根据您的 XML 数据建模的,而Way结构则是按照您希望的方式建模的。一旦有效载荷被解码,您就可以使用它来根据需要初始化Way变量……


边注: // Why can't I return nil, err?


您不能返回,nil因为Way它既不是指针也不是接口,因此nil不是它的有效值。


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

添加回答

举报

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