在自定义UnmarshalXML函数中正确使用XML注释,字段和结构

Dac*_*d3r 13 go

考虑以下结构:

type MyStruct struct {
    Name string
    Meta map[string]interface{}
}
Run Code Online (Sandbox Code Playgroud)

其中包含以下UnmarshalXML函数:

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
}
Run Code Online (Sandbox Code Playgroud)

我对这段代码的问题是这些问题:

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{})
Run Code Online (Sandbox Code Playgroud)

我的问题是我如何正确使用xml注释(,innerxml等),字段和结构,所以我不必手动预先/附加<meta></meta>标记,以将整个元字段作为单个地图.

完整的代码示例如下:http://play.golang.org/p/Q4_tryubO6

kos*_*tya 5

xmlpackage没有提供解组XML的方法,map[string]interface{}因为没有单一的方法来执行它,在某些情况下它是不可能的.映射不保留元素的顺序(在XML中很重要),并且不允许具有重复键的元素.

mxj您在示例中使用的包具有一些规则,如何将任意XML解组为Go map.如果您的要求与这些规则不冲突,您可以使用mxj包进行所有解析,并且根本不使用xml包:

// 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{})
Run Code Online (Sandbox Code Playgroud)

完整示例:http://play.golang.org/p/AcPUAS0QMj