2011-07-19 72 views
1

我有一個連接到XMPP服務器的客戶端和服務器發送我的答案的Java,從XMPP服務器的響應串到XML文檔

<?xml version="1.0"?><stream:stream id="119B61FB" from="chat.facebook.com" version="1.0" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" xml:lang="en"> 

我嘗試創建與Document類的XMLDocument

try { 
     parser = factory.newDocumentBuilder(); 
     d = parser.parse(new ByteArrayInputStream(cleanXMLString.getBytes("UTF-8"))); 
    } catch (ParserConfigurationException ex) { 
     Logger.getLogger(XMPPManager.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (SAXException ex) { 
     Logger.getLogger(XMPPManager.class.getName()).log(Level.SEVERE, null, ex); 
    } 

,但我得到的錯誤:

org.xml.sax.SAXParseException: XML document structures must start and end within the same entity of the SAXException.

有辦法禁用此限制,因爲文檔未被</stream:stream>標籤關閉是正常的嗎?

回答

1

這是您將實施XMPP的許多問題中的第一個。

您需要一個增量XML解析器,如James Clark的XP。更好的做法是從list on xmpp.org使用Java的現有XMPP庫。

+0

謝謝,但我試過一個演示,我看到有需要使用有效的XML文檔。我已經解決了在解析它之前手動在字符串中添加結束標記。 –

+1

這種方法將爲你工作幾個小時。明天,在你編寫了一個工作但不正確的角括號解析器,以便你可以告訴你什麼時候將你想到的作爲一個完整的文檔放入XML解析器中時,你會意識到你需要一個新的XML每個節的解析器,這是一個*噸*的內存。說真的,我寫了多個XMPP客戶端和客戶端庫。心痛在你走的路上。 –

0

嘗試使用Smack進行服務器和客戶端之間的通信。它將爲您處理所有低級別通信,並允許您在更實用的抽象級別進行編程。

+0

在Smack api中,我不知道如何使用自定義的SASL機制,躺在X-FACEBOOK-PLATFORM上。 –

+0

添加您自己的SASL機制:http://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smack/SASLAuthentication.html –