Golang XML解组问题:本地名称冲突失败

时间:2014-07-21 16:43:20

标签: xml namespaces go

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

但如果你能找到我的方法,我会很感激。

1 个答案:

答案 0 :(得分:3)

这个问题非常有趣,我实际上不得不做一些研究才能得到它。

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

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

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