XML Unmarshal 被并行标签绊倒

XML Unmarshal getting tripped up by parallel tag

我正在开发一个 RSS reader 应用程序,运行 解决纽约时报 RSS 提要的问题。我已将问题缩小为以下 XML(省略不必要的字段):

<item>
  <link>https://www.nytimes.com/2017/09/25/briefing/nfl-angela-merkel-iraqi-kurdistan.html?partner=rss&amp;emc=rss</link>
  <atom:link rel="standout" href="https://www.nytimes.com/2017/09/25/briefing/nfl-angela-merkel-iraqi-kurdistan.html?partner=rss&amp;emc=rss"/>
  <pubDate>Mon, 25 Sep 2017 13:36:07 GMT</pubDate>
</item>

我正在尝试将其解析为以下结构:

type item struct {
    Link    string `xml:"link"`
    PubDate string `xml:"pubDate"`
}

解析时,Link 字段为空白。但是,通过删除 atom:link 字段,它可以正常工作。我认为标签名称的相似性使解析器感到困惑。我有一个演示问题的 go playground,删除该行可以解决问题:https://play.golang.org/p/fUbLhSbo5K 我该如何解决这个问题?特殊情况下它不太可行,因为可能还有其他提要也这样做。

这是 Go 的 encoding/xml 包中长期存在的 documentation bug。基本上,当您不指定命名空间时,该字段将匹配 any 命名空间而不是 no 命名空间。事实上,在没有命名空间的情况下,没有办法让一个字段匹配only。如果您的 XML 有命名空间,解决方案是显式设置它:

<item xmlns="foo">
  <link>https://www.nytimes.com/2017/09/25/briefing/nfl-angela-merkel-iraqi-kurdistan.html?partner=rss&amp;emc=rss</link>
  <atom:link rel="standout" href="https://www.nytimes.com/2017/09/25/briefing/nfl-angela-merkel-iraqi-kurdistan.html?partner=rss&amp;emc=rss"/>
  <pubDate>Mon, 25 Sep 2017 13:36:07 GMT</pubDate>
</item>

type item struct {
    Link    string `xml:"foo link"`
    PubDate string `xml:"pubDate"`
}

游乐场:https://play.golang.org/p/L9WOhixTKa.

如果您的 link 元素明确 没有 命名空间,您可能必须推出自己的 UnmarshalXML 方法。