我的行为不正确(或者我做错了什么)。 golang XML 解码似乎无法处理本地名称冲突的特定情况。 也就是说,其中一个元素有 2 个子元素,两个子元素都具有相同的本地名称(“book”),但一个没有命名空间(或默认或空),另一个具有显式命名空间。
对于(一个人为的)例子:
<library
xmlns:lib="http://foobar.com/ns/library">
<lib:book>
AAA
</lib:book>
<book>
ZZZ
</book>
<library>
如果我使用以下结构来表示这一点:
type Library_Type struct {
Book string `xml:"book,omitempty" json:",omitempty"`
Book_lib string `xml:"http://foobar.com/ns/library book,omitempty" json:",omitempty"`
Lib string `xml:"xmlns lib,attr"`
}
并尝试解码,它根本不起作用:来源:http://play.golang.org/p/YW2XpTVRs5
输出:
{"Lib":""}
{"Lib":""}
但是,如果我注释掉结构中的“Book string”:http://play.golang.org/p/BRv6tUNreM
输出:
{"Book_lib":"\n AAA\n ","Lib":"http://foobar.com/ns/library"}
如果我注释掉“Book_lib”...:http://play.golang.org/p/u_Up9X9YMp
输出:
{"Book":"\n ZZZ\n ","Lib":"http://foobar.com/ns/library"}
如果我在“Book”前面添加一个空格: 来自:
Book string `xml:"book,omitempty" json:",omitempty"`
致:
Book string `xml:" book,omitempty" json:",omitempty"`
但是,添加 2 个空格(可以解释为第一个空格是命名空间,第二个空格空格分隔;当没有命名空间时,调用 xml.StartElement.Name.Space 等于 ""):
致:
Book string `xml:" book,omitempty" json:",omitempty"`
http://play.golang.org/p/Br_WBR3U8K
输出:
{"Book_lib":"\n AAA\n ","Lib":"http://foobar.com/ns/library"}
如果我有两个显式 namespace ,问题就会消失(输出是预期的输出):http://play.golang.org/p/llpMuC0SV8
输出:
{"Book_bin":"\n ZZZ\n ","Book_lib":"\n AAA\n ","Lib":"http://foobar.com/ns/library","Bin":"http://foobar.com/ns/bin"}
因此,除非我在这里做错了什么,否则 XML 混合使用默认(空)命名空间和具有本地名称冲突的显式命名空间的用例似乎不起作用,这是一个错误。
但是如果您能为我找到解决此问题的方法,我将不胜感激。
最佳答案
这个问题很有趣,我实际上必须做一些研究才能得到它。
您必须为书籍使用单独的结构
您需要使用
,chardata
作为实际值。
type Library struct {
XMLName xml.Name `xml:"library"`
Entry []Book `xml:"book"`
}
type Book struct {
XMLName xml.Name `xml:"book"`
Name string `xml:",chardata"`
}
关于xml - Golang XML 解码问题 : local name collisions fail,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24870309/