猿问

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

在使用 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 标志无效”而失败。


蛊毒传说
浏览 1519回答 1
1回答

慕妹3146593

简而言之,你不能直接这样做。绕过 XML 结构的常见模式是实现xml.Unmarshaler接口。下面是一个例子:type Way struct {&nbsp; &nbsp; ID&nbsp; &nbsp; int&nbsp;&nbsp; &nbsp; Nodes []int}func (w *Way) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {&nbsp; &nbsp; var payload struct {&nbsp; &nbsp; &nbsp; &nbsp; ID&nbsp; &nbsp; int `xml:"id,attr"`&nbsp; &nbsp; &nbsp; &nbsp; Nodes []struct {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ref int `xml:"ref,attr"`&nbsp; &nbsp; &nbsp; &nbsp; } `xml:"nd"`&nbsp; &nbsp; }&nbsp; &nbsp;&nbsp; &nbsp; err := d.DecodeElement(&payload, &start)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; return err&nbsp;&nbsp; &nbsp; }&nbsp; &nbsp;&nbsp; &nbsp; w.ID = payload.ID&nbsp; &nbsp; w.Nodes = make([]int, 0, len(payload.Nodes))&nbsp; &nbsp; for _, node := range payload.Nodes {&nbsp; &nbsp; &nbsp; &nbsp; w.Nodes = append(w.Nodes, node.Ref)&nbsp; &nbsp; }&nbsp; &nbsp;&nbsp; &nbsp; return nil&nbsp;}在这里,payload变量是根据您的 XML 数据建模的,而Way结构则是按照您希望的方式建模的。一旦有效载荷被解码,您就可以使用它来根据需要初始化Way变量……边注: // Why can't I return nil, err?您不能返回,nil因为Way它既不是指针也不是接口,因此nil不是它的有效值。
随时随地看视频慕课网APP

相关分类

Go
我要回答