考虑以下结构:
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
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