在 golang 中使用 XMLNS 声明编码/解码 XML 根令牌

Posted

技术标签:

【中文标题】在 golang 中使用 XMLNS 声明编码/解码 XML 根令牌【英文标题】:Encoding/decoding XML root token with XMLNS declaration in golang 【发布时间】:2014-11-26 22:48:03 【问题描述】:

我正在尝试使用 encoding/xml 包在 Go 中对 XML 令牌进行编码和解码。有问题的 XML 令牌有一个命名空间、一个xmlns 属性和一个用于标记上命名空间的命名空间声明(此处的示例是一个 XMPP 流开始元素)。它是 XMPP 流的根元素:

<?xml version="1.0" encoding="UTF-8"?>
<stream:stream
       from='juliet@im.example.com'
       to='im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:client'
       xmlns:stream='http://etherx.jabber.org/streams'>

(忽略处理指令,我只是为了说明这是根元素)

我希望能够从结构中读取/写入此令牌,因此我将其作为xml.StartElementdecoder.Token() 获取,并手动将所有属性复制到结构中。然后我用encoder.Encode(thestruct) 写出来,但总是得到有趣的结果(xmlns 是错误的,即使XMLName 是正确的,起始标记也永远不是stream:stream)。

应该如何修改这个结构,以便能够对上述 XML 进行编码和解码?

type stream struct 
    STo         string   `xml:"to,attr"`
    SFrom       string   `xml:"from,attr"`
    Version     string   `xml:"version,attr"`
    Xmlns       string   `xml:"xmlns,attr"`
    Lang        string   `xml:"http://www.w3.org/XML/1998/namespace lang,attr"`
    Id          string   `xml:"id,attr"`
    XmlnsStream string   `xml:"xmlns stream,attr"`
    XMLName     xml.Name `xml:"http://etherx.jabber.org/streams stream"`

【问题讨论】:

【参考方案1】:

你得到正确的结果,因为:

<stream:stream
      xmlns:stream='http://etherx.jabber.org/streams' />

一样
<stream xmlns='http://etherx.jabber.org/streams' />

Jabber 的 XML 非常复杂,所以如果您不想得到正确的 XMPP XML,您可能需要编写自己的编码器。

顺便说一句,如果您查看 Golang XMPP 实现,您会发现它们都使用自己的编码(并且通常还使用解码)。

【讨论】:

以上是关于在 golang 中使用 XMLNS 声明编码/解码 XML 根令牌的主要内容,如果未能解决你的问题,请参考以下文章

xml:编码“utf-16”声明但 Decoder.CharsetReader 为零解组成功

golang 压缩在golang中解压缩字符串

GoLang-字符串

在 Golang 中将字符串解组为类似结构的结构

Golang中进行Url编码,再也不怕奇奇怪怪的参数格式了

Golang中进行Url编码,再也不怕奇奇怪怪的参数格式了