0

在以下示例中:

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字段......但它太令人生畏且无法处理。

谢谢。

4

1 回答 1

0

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

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

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

于 2013-09-23T07:33:11.103 回答