2017-09-26 52 views
2

我正在研究一個RSS閱讀器應用程序,並且遇到了紐約時報RSS源的問題。我已經縮小問題下到下面的XML(不必要的字段省略):XML Unmarshal被並行標記絆倒

<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"` 
} 

當解析,鏈接場空白。但是,通過刪除atom:link字段,它工作正常。我認爲標籤名稱中的相似性令解析器感到困惑。我有一個演示該問題的遊樂場,並且刪除該線路可修復該問題:https://play.golang.org/p/fUbLhSbo5K 我該如何解決此問題?特殊情況並不可行,因爲可能還有其他供稿也會這樣做。

回答

2

這是一個長期存在的documentation bug在Go的encoding/xml包。基本上,當你不指定名稱空間時,該字段將匹配任何名稱空間,而不是名稱空間。實際上,當沒有命名空間時,沒有辦法使域匹配只有。如果您的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方法。