2016-04-29 29 views
0

的價值可以說我有一個xml:找到一個單一的屬性或元素

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

我如何獲得id的值,而無需創建一個struct的麻煩?那可能嗎?如果沒有,是否有一個簡短的手來找到id的價值?

+0

只是好奇..你爲什麼不希望定義一個結構? 「麻煩」似乎不是一個足夠好的理由。當然有解決方法,但我的建議是在這裏使用一個結構,或使用正則表達式+ FindStringSubmatch。 –

+0

@ william.taylor.09好,讓我說我有一個巨大的XML文件,我只想要這一個具體的價值,可以深埋在一堆的元素。創建一個結構是一個純粹的煩惱。我只需要快速搜索即可找到一個匹配屬性,代碼最小爲 – jzm

回答

1

普通掃描儀的表現都不是完美的解決方案,因爲在複雜的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) 
} 

https://play.golang.org/p/x5eFvdhpTW

+0

謝謝先生。我希望會有一個更簡單的形式與結構,如類型結構{Id字符串'xml:「東西> ID」'}但我想這會做 – jzm

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]) 
} 

我沒有測試這種剪斷但使用這種模式。

0

在使用結構是正確的方法,你可以使用正則表達式匹配它:

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

相關問題