Go 在自定义解组XML函数中正确使用XML注释、字段和结构

Go 在自定义解组XML函数中正确使用XML注释、字段和结构,go,Go,考虑以下结构: type MyStruct struct { Name string Meta map[string]interface{} } 它具有以下解组XML功能: func (m *MyStruct) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { var v struct { XMLName xml.Name //`xml:"myStruct"` Nam

考虑以下结构:

type MyStruct struct {
    Name string
    Meta map[string]interface{}
}
它具有以下解组XML功能:

func (m *MyStruct) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
    var v struct {
        XMLName xml.Name //`xml:"myStruct"`
        Name    string   `xml:"name"`
        Meta    struct {
            Inner []byte `xml:",innerxml"`
        } `xml:"meta"`
    }

    err := d.DecodeElement(&v, &start)
    if err != nil {
        return err
    }

    m.Name = v.Name
    myMap := make(map[string]interface{})

    // ... do the mxj magic here ... -

    temp := v.Meta.Inner

    prefix := "<meta>"
    postfix := "</meta>"
    str := prefix + string(temp) + postfix
    //fmt.Println(str)
    myMxjMap, err := mxj.NewMapXml([]byte(str))
    myMap = myMxjMap

    // fill myMap
    //m.Meta = myMap
    m.Meta = myMap["meta"].(map[string]interface{})
    return nil
}
func(m*MyStruct)解组xml(d*xml.Decoder,start xml.StartElement)错误{
var v结构{
XMLName xml.Name/`xml:“myStruct”`
名称字符串`xml:“名称”`
元结构{
内部[]字节`xml:,内部xml“`
}`xml:“元”`
}
错误:=d.DecodeElement(&v,&start)
如果错误!=零{
返回错误
}
m、 姓名
myMap:=make(映射[字符串]接口{})
//…在这里执行mxj魔术-
温度:=v.Meta.Inner
前缀:=“”
后缀:=“”
str:=前缀+字符串(临时)+后缀
//fmt.Println(str)
myMxjMap,err:=mxj.NewMapXml([]字节(str))
myMap=myMxjMap
//填写我的地图
//m、 Meta=myMap
m、 Meta=myMap[“Meta”]。(map[string]接口{})
归零
}
我对这段代码的问题是以下几行:

prefix := "<meta>"
postfix := "</meta>"
str := prefix + string(temp) + postfix
myMxjMap, err := mxj.NewMapXml([]byte(str))
myMap = myMxjMap
//m.Meta = myMap
m.Meta = myMap["meta"].(map[string]interface{})
前缀:=“”
后缀:=“”
str:=前缀+字符串(临时)+后缀
myMxjMap,err:=mxj.NewMapXml([]字节(str))
myMap=myMxjMap
//m、 Meta=myMap
m、 Meta=myMap[“Meta”]。(map[string]接口{})
我的问题是如何正确使用xml注释(、innerxml等)、字段和结构,这样我就不必在之后手动预/追加
标记,从而将整个元字段作为一个映射


完整的代码示例如下:

xml
包不提供将xml解组到
map[string]接口{}
的方法,因为没有单一的方法,在某些情况下是不可能的。映射不保留元素的顺序(这在XML中很重要),并且不允许元素具有重复的键

示例中使用的
mxj
包具有一些规则,可以将任意XML解组到Go映射中。如果您的要求与这些规则不冲突,您可以使用
mxj
package来执行所有解析,而不使用
xml
package:

// I am skipping error handling here
m, _ := mxj.NewMapXml([]byte(s))
mm := m["myStruct"].(map[string]interface{})
myStruct.Name = mm["name"].(string)
myStruct.Meta = mm["meta"].(map[string]interface{})

完整示例:

这不完全是我所希望的答案,但我想这是没办法的。您的建议在我的特定情况下不起作用,但至少您指出了Go xml包的局限性,这就是我接受这个答案的原因。