Golang xml.Unmarshall 任意元素



XML,具有任意数量的任意命名元素:

<modules>
<elt1><version>1.2.3</version></elt1>
<eltN><version>4.5.6</version></eltN>
</modules>

如何将其解析为map[string]string以供elementname version?我找到的所有Unmarhall示例都采用静态元素名称。

你可以

改用xml.Decoder:示例,严重缺乏错误处理。

package main
import (
    "encoding/xml"
    "fmt"
    "io"
    "strings"
)
func main() {
    data := `<modules>
         <elt1><version>1.2.3</version></elt1>
         <eltN><version>4.5.6</version></eltN>
         </modules>`
    fmt.Println(parseVersions(strings.NewReader(data)))
}
func parseVersions(s io.Reader) map[string]string {
    r := make(map[string]string)
    decoder := xml.NewDecoder(s)
    for token, err := decoder.Token(); err == nil; token, err = decoder.Token() {
        switch v := token.(type) {
        case xml.StartElement:
            if el := v.Name.Local; strings.HasPrefix(el, "elt") {
                r[el] = parseVersion(decoder)
            }
        }
    }
    return r
}
func parseVersion(decoder *xml.Decoder) string {
    token, _ := decoder.Token()
    switch v := token.(type) {
    case xml.StartElement:
        if v.Name.Local == "version" {
            cd, _ := decoder.Token()
            return string(cd.(xml.CharData))
        }
    }
    return ""
}

最新更新