为了账号安全,请及时绑定邮箱和手机立即绑定

Golang xml.Unmarshall 任意元素

Golang xml.Unmarshall 任意元素

Go
噜噜哒 2023-06-05 09:13:34
具有任意数量的任意命名元素的 XML:<modules><elt1><version>1.2.3</version></elt1><eltN><version>4.5.6</version></eltN></modules>如何将其解析为map[string]stringfor elementnameto version?我发现的所有 Unmarshall 示例都采用静态元素名称。
查看完整描述

1 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

您可以改用xml.Decoder: Example, which severely lacks error handling。

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 ""

}


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信