Go 具有全局命名空间的解组

Go 具有全局命名空间的解组,go,unmarshalling,Go,Unmarshalling,我有以下XML: <rss version="2.0"> <channel> ... <item> <link>http://stackoverflow.com</link> <atom:link xmlns:atom="http://www.w3.org/2005/Atom" href="http://stackoverflow.com"/> ... <

我有以下XML:

<rss version="2.0">
  <channel>
    ...
    <item>
      <link>http://stackoverflow.com</link>
      <atom:link xmlns:atom="http://www.w3.org/2005/Atom" href="http://stackoverflow.com"/>
      ...
    </item>
  </channel>
</rss>
我知道,我需要一个前缀来获取链接,但因为没有给定名称空间(以
xmls
-属性的形式),但我不知道如何

当然,我可以将所有
:*link
-属性保存到一个切片,但我相信有更好的解决方案


提前感谢!

标准库
encoding/xml
包中的名称空间处理似乎是一个很大的特殊问题,在不同名称空间中使用相同名称的元素似乎是一个触发因素

理想情况下,您可以将给定的XML解码为以下结构:

type Rss struct {
    Items []Item `xml:"channel>item"`
}

type Item struct {
    Link     string   `xml:"link"`
    AtomLink AtomLink `xml:"http://www.w3.org/2005/Atom link"`
}

type AtomLink struct {
    Href string `xml:"href,attr"`
}
但这会导致错误
main.Item字段“Link”和标记“Link”与字段“AtomLink”和标记“Link”冲突http://www.w3.org/2005/Atom 链接“
(如中所示)

但是,如果我们决定通过注释掉
Item.AtomLink
字段来忽略
元素,那么我们最终会解码一个空字符串,因为
xml:“link”< /代码>在任何命名空间中匹配< <代码> <代码>元素,而不只是空白命名空间。最终的<代码> <代码>元素是空的,所以不返回任何东西。

一些可能的解决办法包括:

  • 只尝试解码
    元素,因为它可以被唯一地选择。如果您也在处理没有Atom命名空间元素的RSS提要,这可能没有用

  • 通过修改要使用的
    结构,收集所有
    元素的内容:

    Links []string `xml:"link"`
    
    然后丢弃切片中的所有空字符串


  • 在一天结束时,包需要一些方法来引用空白命名空间。这可能需要新的语法来保持现有程序的运行。

    GO的XML解析器中的命名空间处理有点麻烦,正如您可以看到的这个测试程序:如果我注释<代码>项目。链接< /代码>字段,我得到不同的A。答案取决于
    元素的顺序。你是对的,问题是,我不需要
    ),我得到一个空字符串。对。这似乎是bug的另一个例子:它可能选择了元素的内容,元素是空的。好吧,也许我会尝试修复它,谢谢!回答这个问题,我会记下答案:)非常感谢。我将解决以下问题:
    
    Links []string `xml:"link"`