2012-03-20 58 views
1

我有一個TCP連接,通過流向我發送XML消息。通過流解析不完整XML消息的最有效方法是什麼?

我在<?xml version="1.0" encoding="utf-8"?>消息中收到的第一條消息。

第二個是身份驗證請求消息,它提供了一個種子,用於散列我的憑據以發送回服務器 - <session seed="VJAWKBJXJO">

在這一點上,我應該發回一個<session user="admin" password_hash="123456789">消息來驗證自己。

一旦通過身份驗證,我將以<Msg>data</Msg>的形式收到所需的數據。

如果我沒有及時與服務器進行身份驗證,我收到一條消息</session>,表明會話已關閉。

問題是我不能使用DOM解析器,因爲試圖解析沒有結束標籤的<session>標籤總是會拋出錯誤,所以我試圖使用Xerces-c SAX解析器來執行漸進式解析的XML。

當我收到每封郵件時,我想理想地將它附加到包含當前已收到的所有XML的MemBufInputSource,然後在緩衝區上執行parseNext以分析已收到的新XML,但無法弄清楚如何讓它正常工作。

有沒有更好的解決此問題的方法?也許只是使用<session></session>消息的特例?

謝謝

+0

當我試圖解析''消息時,當它找不到''結束標記時,我當前的實現一直在持續下降 – 2012-03-20 14:00:34

回答

0

您是否嘗試過使用不同的解析器?如果沒有,我使用libxml2(http://xmlsoft.org/),它非常簡單,它可以讓你在閒暇時處理錯誤。

您可以從流(您的連接)創建xmlTextReaderPtr:

xmlTextReaderPtr reader = xmlReaderForMemory(...) 

然後通過節點重複,直到你找到你的數據:

while ((result=xmlTextReaderRead(reader))== 1) 
{ 
    int nodetype = xmlTextReaderNodeType(reader); 

    if (nodetype == XML_READER_TYPE_ELEMENT) 
    { 
     const xmlChar* name = xmlTextReaderConstName(reader); 
     /* now name is the name of the element, like "session" */ 
     if (strcmp(name,"session")==0) 
     { 
      /* now look for the XML_READER_TYPE_ATTRIBUTE named "seed" and read the 
      * value with xmlTextReaderConstValue to get the seed value */ 
     } 
    } 
} 

他們有一個簡單的例子,以及,用於解析出數值:

http://xmlsoft.org/examples/reader1.c

它確實有一些功能,雖然我只能說基本的閱讀,寫作和xinclude功能。

希望有幫助!

+0

感謝您的建議,但不幸的是我必須使用xerces- c庫 – 2012-03-20 15:05:02

相關問題