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