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

问题是具有 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



交互式爱情
浏览 299回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go