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包的局限性,这就是我接受这个答案的原因。