在 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.StartElement
和decoder.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 根令牌的主要内容,如果未能解决你的问题,请参考以下文章