簡體   English   中英

在流上解析不完整XML消息的最有效方法是什么?

[英]What's the most efficient way to parse incomplete XML messages over a stream?

我有一個TCP連接,可以通過流向我發送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。

當我收到我想最好將其追加到每個消息MemBufInputSource其中包含當前已收到的所有XML,然后執行parseNext的緩沖解析已接收新的XML,但我無法弄清楚如何使它正常工作。

是否有解決此問題的更好方法? 也許只是對<session></session>消息使用特殊情況?

謝謝

您是否嘗試過使用其他解析器? 如果沒有,我使用的是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功能。

希望有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM