一尘不染

Marshall在Go中映射到XML

go

我正在尝试将地图输出为XML数据,但是收到以下错误:

xml: unsupported type: map[string]int

编组映射适用于JSON,因此我不明白为什么它不适用于XML。使用Struct真的是唯一的方法吗?


阅读 321

收藏
2020-07-02

共1个答案

一尘不染

我最终按照DaveC的建议使用xml.Marshaler解决了这个问题

// StringMap is a map[string]string.
type StringMap map[string]string

// StringMap marshals into XML.
func (s StringMap) MarshalXML(e *xml.Encoder, start xml.StartElement) error {

    tokens := []xml.Token{start}

    for key, value := range s {
        t := xml.StartElement{Name: xml.Name{"", key}}
        tokens = append(tokens, t, xml.CharData(value), xml.EndElement{t.Name})
    }

    tokens = append(tokens, xml.EndElement{start.Name})

    for _, t := range tokens {
        err := e.EncodeToken(t)
        if err != nil {
            return err
        }
    }

    // flush to ensure tokens are written
    return e.Flush()
}

资料来源:https :
//gist.github.com/jackspirou/4477e37d1f1c043806e0

现在,只需调用即可将地图编组

output, err := xml.MarshalIndent(data, "", "  ")
2020-07-02