2012-03-21 67 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完整的節。