为了账号安全,请及时绑定邮箱和手机立即绑定

尝试将 xml.Unmarshal 结构化为 map[string]interface{}

尝试将 xml.Unmarshal 结构化为 map[string]interface{}

Go
交互式爱情 2021-10-18 16:15:16
问题是具有 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
提交
取消
意见反馈 帮助中心 APP下载
官方微信