假设我有一个xml:
<test>
<something id="" />
</test>
如何在没有创建结构的麻烦的情况下获取id的值?那可能吗?如果没有,是否有一个简短的手来找到id的值?
答案 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)
}
答案 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
}