使用Go语言解析XML中的重复标签

4
当一个XML源有多个标签在一个结构中时,我在解析它时遇到了问题:
<feed>
<entry>
:
:
</entry>
<entry>
:
:

</entry>
</feed>

在这种情况下,我没有问题通过定义一个[]entries数组来解析该条目。但其中一个条目是一个geocode标记,它的valuename和value标记重复出现了两次。在这种情况下,如何定义结构呢?
<geocode>
<valueName>abc</valueName>
<value>a1</value>
<valueName>def</valueName>
<value>d1</value>
</geocode>

这是我遇到问题的go程序。 https://play.golang.org/p/SE8RXTNbYl

1个回答

7

如果在同一个父标签下有多个相同名称的标签,您可以始终使用切片来保存所有出现的标签,无论它们是连续枚举还是它们之间有其他标签。

为了完整起见,这是您要解析的XML片段:

<cap:geocode>
    <valueName>FIPS6</valueName>
    <value>002090 002290</value>
    <valueName>UGC</valueName>
    <value>AKZ222</value>
</cap:geocode>

所以,只需将您的地理编码结构从这个改为:
type geocode struct {
    ValueName1 string `xml:"valueName"`
    Value1     string `xml:"value"`
    ValueName2 string `xml:"valueName"`
    Value2     string `xml:"value"`
}

翻译为:

type geocode struct {
    ValueNames []string `xml:"valueName"`
    Values     []string `xml:"value"`
}

并打印它们的代码:

gc := v.Entries[0].Geocode
log.Println(len(gc.Values))
log.Println(gc.ValueNames)
log.Println(gc.Values)
for i := range gc.Values {
    fmt.Printf("ValueName=%s, Value=%s\n", gc.ValueNames[i], gc.Values[i])
}

输出结果(在Go Playground上尝试您修改后的源代码):

2009/11/10 23:00:00 2
2009/11/10 23:00:00 [FIPS6 UGC]
2009/11/10 23:00:00 [002090 002290 AKZ222]
ValueName=FIPS6, Value=002090 002290
ValueName=UGC, Value=AKZ222

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接