查找单个属性或元素的值

时间:2016-04-29 12:50:09

标签: go

假设我有一个xml:

<test>
    <something id="" />
</test>

如何在没有创建结构的麻烦的情况下获取id的值?那可能吗?如果没有,是否有一个简短的手来找到id的值?

3 个答案:

答案 0 :(得分:1)

扫描仪的正则表达式不是完美的解决方案,因为在复杂的xml中可能会发生,你就找不到好的id。它也没有解决像&amp; amp;等字符的问题。 ..只有解决方案是Unmarshal,但是,您不必描述元素的结构,这不会打扰您。

package main

import (
    "encoding/xml"
    "fmt"
)

func main() {
    type Something struct {
        Id string `xml:"id,attr"`
    }
    type Result struct {
        //XMLName xml.Name `xml:"test"`
        Something    Something   `xml:"something"`
    }
    var v Result

    data := `
<test>
   <something id="123"/>
   <tag_that_i_ignore id="aaa" attr="???"/>
</test>
    `
    err := xml.Unmarshal([]byte(data), &v)
    if err != nil {
        fmt.Printf("error: %v", err)
        return
    }
    fmt.Printf("Result: %#v\n\n", v)
}

请参阅https://play.golang.org/p/x5eFvdhpTW

答案 1 :(得分:0)

我不知道它是否不那么麻烦,但你可以“手动”挖出这样的价值:

scanner := bufio.NewScanner(reader)
for scanner.Scan() {
   scannedText := scanner.Text()
   i := strings.Index(scannedText, `id="`) + len(`id="`)
   j := strings.Index(scannedText[i:], `"`) + i
   id, _ := strconv.Atoi(scannedText[i:j])
}

我没有测试这个剪辑但是已经使用了这种模式。

答案 2 :(得分:0)

虽然使用struct是正确的方法,但您可以使用regexp来匹配它:

var idRe = regexp.MustCompile(`<something[^>]+?id="([^"]+)"[^>]+`)

func FindIDs(in string) []string {
    vals := idRe.FindAllStringSubmatch(in, -1)
    out := make([]string, len(vals))
    for i, v := range vals {
        out[i] = v[1]
    }
    return out
}

playground