我正在查看XMPP协议并测试与服务器的一些基本交互。 XMPP通过向前和向后交换XML进行交互,但是这个XML是正在进行的流的一部分,有效地构建文档。
我试图使用XmlWriter重现这一点,虽然我几乎可以根据需要创建Xml,但我似乎无法阻止编写器关闭Xml元素。例如,要打开连接,您需要发送<stream:stream ... >
元素(在交互的某个稍后点关闭)。使用XmlWriter将始终关闭此元素,例如:<stream:stream ... />
我不想要,因为发送关闭/>
将导致服务器关闭流。
有没有办法让XmlWriter让元素“打开”但仍然检索其中包含的数据?当然我可以在元素上做一个字符串替换来摆脱'/',但我更愿意找到一个更简洁的方法来做到这一点。
发送到服务器的初始消息如下所示:
<?xml version="1.0" encoding="utf-8"?><stream:stream from="email@address.com" to="address.com" version="1.0" xml:lang="en" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" >
到目前为止,我的代码是:
private string CreateStreamHeader(string from, string to, double version)
{
Encoding encoding = new UTF8Encoding(false);
var sb = new StringBuilder();
var settings = new XmlWriterSettings();
settings.Encoding = encoding;
using(var output = new StringWriterWithEncoding(sb, encoding))
{
using(XmlWriter writer = XmlWriter.Create(output, settings))
{
writer.WriteStartDocument();
writer.WriteStartElement("stream", "stream", "http://etherx.jabber.org/streams");
writer.WriteAttributeString("from", from);
writer.WriteAttributeString("to", to);
writer.WriteAttributeString("version", version.ToString("0.0"));
writer.WriteAttributeString("xml", "lang", null, "en");
writer.WriteAttributeString("xmlns", "jabber:client");
}
}
return sb.ToString();
}
这段代码产生:
<?xml version="1.0" encoding="utf-8"?><stream:stream from="email@address.com" to="address.com" version="1.0" xml:lang="en" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" />
&lt; - 请注意/&gt;这里
注意:StringWriterWithEncoding是this post中解释的那个
答案 0 :(得分:0)
您应该考虑链接到xmpp.org的现有库之一。处理名称空间声明就像它们是属性一样,以后会再次困扰你。
关于您的问题,请手动序列化stream:stream
开始标记,并仅将XmlWriter用于完整节。