【问题标题】:Golang XML unmarshalling issue: local name collisions failGolang XML 解组问题:本地名称冲突失败
【发布时间】:2014-07-22 01:30:57
【问题描述】:

我的行为不正确(或者我做错了什么)。 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 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 混合了默认(空)命名空间和具有本地名称冲突的显式命名空间的用例似乎不起作用,这是一个错误。

但如果你能找到解决这个问题的方法,我将不胜感激。

【问题讨论】:

    标签: xml namespaces go


    【解决方案1】:

    这个问题很有意思,其实我还得做一些研究才知道。

    1. 您必须为书籍使用单独的结构

    2. 您需要使用,chardata 作为实际值。

    playground

    type Library struct {
        XMLName xml.Name `xml:"library"`
        Entry []Book `xml:"book"`
    }
    
    type Book struct {
        XMLName xml.Name `xml:"book"`
        Name   string   `xml:",chardata"`
    }
    

    【讨论】:

    • 是的,我最初有所有元素的结构,这些元素只解析为“chardata”,但想通过将它们折叠成 [] 字符串来减少结构的数量。我会回到这个,但我仍然认为使用 []string 应该可以工作。这似乎不是一致的行为......
    • 我同意,您可能应该提交错误报告code.google.com/p/go/issues/entry
    • 这似乎相关:“编码/xml:缺少未处理的嵌套命名空间”code.google.com/p/go/issues/detail?id=7113
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多