使用golang中的XMLNS声明对XML根令牌进行编码/解码

时间:2014-11-26 22:48:03

标签: xml xml-parsing go

我正在尝试使用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的{​​{1}}获取,并手动将所有属性复制到结构中。然后我用decoder.Token()写出来,但总是得到有趣的结果(xmlns是错的,即使encoder.Encode(thestruct)是正确的,开始标记也不是stream:stream

如何修改此结构以便能够对上述XML之类的内容进行编码和解码?

XMLName

1 个答案:

答案 0 :(得分:1)

您得到了正确的结果,因为:

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

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

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

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