在字段名中使用索引的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将出

我试图解组一个“动态”XML响应,但我不确定如何处理它。服务器的响应非常大,因此我不希望对响应进行两次解析。XML如下所示:

...
<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