问题是具有 map[string]interface{} 类型字段的结构的 xml.Unmarshal 将失败并显示错误:
unknown type map[string]interface {}
{XMLName:{Space: Local:myStruct} Name:test Meta:map[]}
由于 map[string]interface{} 类型的 Meta 字段是我可以定义的,因此必须动态解组内部的内容。
package main
import (
"encoding/xml"
"fmt"
)
func main() {
var myStruct MyStruct
// meta is as far as we know, inside meta, dynamic properties and nesting will happen
s := `<myStruct>
<name>test</name>
<meta>
<someProp>something</someProp>
<someOtherDynamic>
<name>test</name>
<somethingElse>test2</somethingElse>
<nested3>
<name>nested3</name>
<nested3elements>
<elem>ele1</elem>
<elem>ele2</elem>
</nested3elements>
</nested3>
</someOtherDynamic>
</meta>
</myStruct>`
err := xml.Unmarshal([]byte(s), &myStruct)
if err == nil {
fmt.Printf("%+v\n", myStruct)
} else {
fmt.Println(err)
fmt.Printf("%+v\n", myStruct)
}
}
type MyStruct struct {
XMLName xml.Name `xml:"myStruct"`
Name string `xml:"name"`
Meta map[string]interface{} `xml:"meta,omitempty"`
}
我在这里做了一个例子:http : //play.golang.org/p/lTDJzXXPwT
我怎样才能做到这一点?
到目前为止,我的解决方法“解决方案”:
http://play.golang.org/p/gQUlvkYl7k
基本上发生的是:
Meta 字段删除了 xml 注释,因此从 xml.Unmashal 中被忽略
新类型 MapContainer 使用以下字段创建:InnerXML []byte xml:",innerxml"
使用xml:"meta,omitempty"注释添加 MapContainer 类型的 MetaByte 字段
因此,在第一个 xml.Unmarshal 中,我们保存了元元素 XML 的字节切片。然后在我们自定义的 xml unmarshal 函数中,我们使用那个 byteSlice 并使用 mxj 包中的魔法函数 NewMapXml,并将结构的 Meta 字段设置为这个新创建的映射。
这要归功于天才制作这个 repo,https://github.com/clbanning/mxj,它可以从 XML 解组到地图。
更新当前最佳解决方案:
http://play.golang.org/p/_tw06klods
相关分类