2012-03-21 76 views
1

我正在查看XMPP协议并测试与服务器的一些基本交互。 XMPP通过向前和向后交换XML进行交互,但是此XML是正在进行的流的一部分,可以有效地构建文档。XmlWriter离开元素打开

我试图用XmlWriter重现这一点,尽管我可以根据需要创建Xml,但似乎无法阻止作者关闭Xml元素。例如,要打开连接,您发送一个<stream:stream ... >元素(在交互的稍后时间点关闭)。使用XmlWriter将始终关闭此元素,例如:<stream:stream ... />,这是我不想要的,因为发送关闭/>将导致服务器关闭流。

有没有办法让XmlWriter离开元素“打开”,但仍检索包含在内的数据?当然,我可以在元素上做一个字符串替换来摆脱'/',但如果可能的话,我宁愿找到一个更好的方法。

最初的消息发送到服务器看起来是这样的: <?xml version="1.0" encoding="utf-8"?><stream:stream from="[email protected]" 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 protected]" to="address.com" version="1.0" xml:lang="en" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" /> < - 注意这里的/>

注意:StringWriterWithEncoding是在this post

+0

向我们展示您的代码到目前为止,或它的一个简单的例子。 – gingerbreadboy 2012-03-21 08:48:19

+0

@gingerbreadboy我已经更新它现在给一些更多的信息。希望这可以帮助。 – 2012-03-21 13:31:33

回答

0

您应该考虑链接到xmpp.org的现有库之一。将名称空间声明视为属性将在以后再次出现。

至于你的问题,手动序列化stream:stream开始标记,并且只使用XmlWriter完整的节。