猿问

Golang xml.Unmarshall 任意元素

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


<modules>

<elt1><version>1.2.3</version></elt1>

<eltN><version>4.5.6</version></eltN>

</modules>

如何将其解析为map[string]stringfor elementnameto version?我发现的所有 Unmarshall 示例都采用静态元素名称。


噜噜哒
浏览 159回答 1
1回答

SMILET

您可以改用xml.Decoder: Example, which severely lacks error handling。package mainimport (    "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 ""}
随时随地看视频慕课网APP

相关分类

Go
我要回答