在字段名中使用索引的XML解组动态响应
我试图解组一个“动态”XML响应,但我不确定如何处理它。服务器的响应非常大,因此我不希望对响应进行两次解析。XML如下所示:在字段名中使用索引的XML解组动态响应,xml,go,unmarshalling,Xml,Go,Unmarshalling,我试图解组一个“动态”XML响应,但我不确定如何处理它。服务器的响应非常大,因此我不希望对响应进行两次解析。XML如下所示: ... <nic_cnt>2</nic_cnt> <ifindex1>eno1</ifindex1> <ifindex2>eno2</ifindex2> ... 。。。 2. eno1 eno2 ... 因此,nic\u cnt字段定义了可能时间iIndex的发生方式。由于我不知道iIndex将出
...
<nic_cnt>2</nic_cnt>
<ifindex1>eno1</ifindex1>
<ifindex2>eno2</ifindex2>
...
。。。
2.
eno1
eno2
...
因此,
nic\u cnt
字段定义了可能时间iIndex
的发生方式。由于我不知道iIndex将出现多少次,因此我无法静态定义解组响应所需的结构字段。您可以使用带有,任何XML标记选项的切片来告诉包将任何XML标记放入其中。该文件记录在:
对于
标记,使用另一个结构,该结构包含类型为XMLName
的字段,因此如果只需要筛选以ifindex
开头的字段,则实际字段名将可用
让我们分析以下XML:
<root>
<nic_cnt>2</nic_cnt>
<ifindex1>eno1</ifindex1>
<ifindex2>eno2</ifindex2>
</root>
解析它的示例代码:
var root Root
if err := xml.Unmarshal([]byte(src), &root); err != nil {
panic(err)
}
fmt.Printf("%+v", root)
输出(在上尝试):
请注意,Root.Entries
还将包含其他未映射的XML标记。如果您只关心以ifindex
开头的标记,则可以通过以下方式“过滤”它们:
如果XML还包含其他标记:
<other>something else</other>
谢谢这正是我想要的。我确信我能理解:由于any
tag选项,任何未在结构中显式定义的XML字段都将被解组到Entries
slice?@rhillhouse是的,但正如我的上一个示例所示,标记名是可用的,您可以简单地过滤掉不需要的内容。
var root Root
if err := xml.Unmarshal([]byte(src), &root); err != nil {
panic(err)
}
fmt.Printf("%+v", root)
{NicCnt:2 Entries:[
{XMLName:{Space: Local:ifindex1} Value:eno1}
{XMLName:{Space: Local:ifindex2} Value:eno2}]}
for _, e := range root.Entries {
if strings.HasPrefix(e.XMLName.Local, "ifindex") {
fmt.Println(e.XMLName.Local, ":", e.Value)
}
}
<other>something else</other>
{NicCnt:2 Entries:[
{XMLName:{Space: Local:ifindex1} Value:eno1}
{XMLName:{Space: Local:ifindex2} Value:eno2}
{XMLName:{Space: Local:other} Value:something else}]}
ifindex1 : eno1
ifindex2 : eno2