问题是具有 map[string]interface{} 类型字段的结构的 xml.Unmarshal 将失败并显示错误:unknown type map[string]interface {}{XMLName:{Space: Local:myStruct} Name:test Meta:map[]}由于 map[string]interface{} 类型的 Meta 字段是我可以定义的,因此必须动态解组内部的内容。package mainimport ( "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
1 回答
- 1 回答
- 0 关注
- 298 浏览
添加回答
举报
0/150
提交
取消