的價值可以說我有一個xml:找到一個單一的屬性或元素
<test>
<something id="" />
</test>
我如何獲得id的值,而無需創建一個struct的麻煩?那可能嗎?如果沒有,是否有一個簡短的手來找到id的價值?
的價值可以說我有一個xml:找到一個單一的屬性或元素
<test>
<something id="" />
</test>
我如何獲得id的值,而無需創建一個struct的麻煩?那可能嗎?如果沒有,是否有一個簡短的手來找到id的價值?
普通掃描儀的表現都不是完美的解決方案,因爲在複雜的XML可能發生,那你不會找到好的ID。它也不能解決字符如& 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)
}
謝謝先生。我希望會有一個更簡單的形式與結構,如類型結構{Id字符串'xml:「東西> ID」'}但我想這會做 – jzm
我不知道這是否是少些麻煩,但你可以挖掘的價值了「手動」做這樣的事情:
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])
}
我沒有測試這種剪斷但使用這種模式。
在使用結構是正確的方法,你可以使用正則表達式匹配它:
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
}
只是好奇..你爲什麼不希望定義一個結構? 「麻煩」似乎不是一個足夠好的理由。當然有解決方法,但我的建議是在這裏使用一個結構,或使用正則表達式+ FindStringSubmatch。 –
@ william.taylor.09好,讓我說我有一個巨大的XML文件,我只想要這一個具體的價值,可以深埋在一堆的元素。創建一個結構是一個純粹的煩惱。我只需要快速搜索即可找到一個匹配屬性,代碼最小爲 – jzm