xml - Golang XML 解码问题 : local name collisions fail

标签 xml namespaces go

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

但是如果您能为我找到解决此问题的方法,我将不胜感激。

最佳答案

这个问题很有趣,我实际上必须做一些研究才能得到它。

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

关于xml - Golang XML 解码问题 : local name collisions fail,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24870309/

相关文章:

php - 无法使用 simplexml 解析 https 上的 XML 文件

go - 我的 net/http post 方法使用了 100% 的 CPU

architecture - 命名空间/解决方案结构

java - 使用命名空间的 jaxb 解码

php - 从php中的同名命名空间导入全局类

golang sqlx "missing destination name ...."

go - sync.Cond 测试广播 - 为什么要循环检查?

java - Android 应用程序返回 NULL

c# - 签署 SAML 响应会生成 CryptographicException : An XmlDocument context is required for enveloped transforms

java - 重置/清除 RecyclerView