Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go中动态类型(空接口)的XML解组_Go - Fatal编程技术网

Go中动态类型(空接口)的XML解组

Go中动态类型(空接口)的XML解组,go,Go,我需要解析具有动态元素的XML消息,因此我使用了interface{}类型的元素在消息结构中表示它 一旦我知道这个动态元素的类型(在运行时),我就会初始化一个消息结构,然后尝试解组XML消息。但是,动态元素的内容不会被取消编组 这是一个我试图实现的目标,包括评论和实际输出与预期输出: 我尝试了几种变体,但无法使解组按预期工作。有人能帮我理解为什么会有这种行为,以及如何让它起作用吗?提前谢谢 代码(如果Go Playder链接有一天中断): 主程序包 输入“fmt” 导入“编码/xml” //XM

我需要解析具有动态元素的XML消息,因此我使用了
interface{}
类型的元素在消息结构中表示它

一旦我知道这个动态元素的类型(在运行时),我就会初始化一个消息结构,然后尝试解组XML消息。但是,动态元素的内容不会被取消编组

这是一个我试图实现的目标,包括评论和实际输出与预期输出:

我尝试了几种变体,但无法使解组按预期工作。有人能帮我理解为什么会有这种行为,以及如何让它起作用吗?提前谢谢

代码(如果Go Playder链接有一天中断):

主程序包
输入“fmt”
导入“编码/xml”
//XML根
类型消息结构{
XMLName xml.Name`xml:“消息”`
操作`xml:“操作”`
}
//操作可以包含Create或Update元素
类型操作结构{
Create*Create`xml:“创建”`
Update*Update`xml:“更新”`
}
//没关系。。。
类型创建结构{}
//更新包含一个颜色元素或任何其他元素(我们只知道它在运行时的类型)
类型更新结构{
颜色*Color`xml:“颜色”`
其他任何
}
//没关系。。。
类型颜色结构{}
键入任意接口{}
var xmlStr=[]字节(`
1000
`)
func main(){
//此时,我们已经知道希望在Other中接收什么,因此我们可以为其内容(大小)声明一个结构
类型大小结构{
XMLName xml.Name`xml:“大小”`
宽度字符串`xml:“宽度”`
}
//拆封
消息:=&消息{
操作:操作{
更新:&更新{
Other:&Size{},//这里我将Other设置为Size,因此我希望能够将内容解组到其中
},
},
}
如果错误:=xml.Unmarshal(xmlStr,msg);错误!=nil{
fmt.Println(错误)
}
//再次执法
b、 错误:=xml.marshallindent(消息“,”)
如果错误!=零{
fmt.Println(错误)
}
fmt.Printf(“应为:\n\n%s\n\n”,xmlStr)
fmt.Printf(“实际:\n\n%s”,字符串(b))
}

根据
编码/xml
软件包文档:

如果XML元素包含未匹配的子元素 在上述规则中,结构有一个带有标记
“、任意“
”的字段, 解组将子元素映射到该结构字段

只需对代码进行一次小的更新,即可使其按预期工作:

xml:,any“
标记添加到
Other
字段定义中

为了清理代码,我还将删除
Any
类型,您不需要它。您可以将
Other
字段定义更改为使用标记
xml:,any“
键入
interface{}
,并完成相同的操作

像这样:

Other interface{} `xml:",any"`
执行并查看捕获的“1000”

我建议更新你的问题,直接包含你的代码,让人们更容易找到/搜索/阅读你的问题。拥有Go Playerly链接也很有用,这样读者可以快速运行/调整/测试示例