考虑下面的结构:
type MyStruct struct { Name string Meta map[string]interface{} }
其中有以下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 }
我的这个代码的问题是这些代码:
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{})
我的问题是如何正确使用xml注释(,innerxml等),字段和结构体,因此我不必手动预处理/追加< meta>< / meta>标签之后,将整个Meta字段作为单个地图.
完整的代码示例如下:http://play.golang.org/p/Q4_tryubO6
xml包不提供将XML解组成map [string] interface {}的方式,因为没有一种方法可以实现,在某些情况下也是不可能的.地图不保留元素的顺序(在XML中很重要),并且不允许具有重复键的元素.
您在示例中使用的mxj包具有一些规则,如何将任意XML解组成Go映射.如果您的要求与这些规则不冲突,您可以使用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{})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。