我的行为不正确(或者我做错了)。 golang XML demarshalling似乎不处理本地名称冲突的特定情况。 也就是说,你有一个元素有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":""}
但是,如果我在结构中注释掉“预订字符串”: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"}
如果我有两个显式名称空间,问题就会消失(输出是预期的输出):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混合使用默认(空)命名空间和显式命名空间与本地名称冲突的用例似乎不起作用,这是一个错误。
但如果你能找到我的方法,我会很感激。
答案 0 :(得分:3)
这个问题非常有趣,我实际上不得不做一些研究才能得到它。
您必须为图书使用单独的结构
您需要使用,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"`
}