在以下示例中:
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
字段...但是处理起来太令人生畏和无效。
感谢。
答案 0 :(得分:0)
Unmarshal将XML解组为struct。它不称为XPath,因为你不能用Unmarshal做你想做的事。
要么解组成更大的结构并按照你的建议迭代到id == 3。 (不确定为什么你说这是低效的。我怀疑你在声称效率低下之前测量了做的成本。)
或者:使用xml.Decoder手动解析XML并自行处理令牌。