获取XML中属性的值,但是获取哪个元素由Go中另一个属性的值确定

时间:2013-09-22 22:48:15

标签: xml go

在以下示例中:

package main

import (
    "fmt"
    "encoding/xml"
)

var data = `
<data>
    <text id="0" action="wake"/>
    <text id="1" action="eat"/>
    <text id="2" action="bathe"/>
    <text id="3" action="walk"/>
</data>
`

type Result struct {
    XMLName xml.Name `xml:"data"`
    Action string //this is the part I want to solve
}


func main() {
    res := Result{}
    xml.Unmarshal(data, &res)
    fmt.Printf("%#v", res)
}

我想得到的是以下结构:

{XMLName: xml.Name{Space:"", Local:"data"}, Action:"eat"}

那么我只能在第四个action元素上获得text属性的值吗?换句话说,我想获取任意元素的属性值,但该元素由该元素中的另一个属性决定(在本例中为id=3)。

解决这个问题的一件事是嵌入另一个结构,它将每个text元素保存为切片,并迭代该切片,如果id字段是3,那么我得到那个内部结构的action字段...但是处理起来太令人生畏和无效。

感谢。

1 个答案:

答案 0 :(得分:0)

Unmarshal将XML解组为struct。它不称为XPath,因为你不能用Unmarshal做你想做的事。

要么解组成更大的结构并按照你的建议迭代到id == 3。 (不确定为什么你说这是低效的。我怀疑你在声称效率低下之前测量了做的成本。)

或者:使用xml.Decoder手动解析XML并自行处理令牌。