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

时间:2012-03-20 12:58:47

标签: c++ xml xerces-c

我有一个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的渐进式解析。

当我收到每条消息时,我希望理想地将它附加到包含当前已收到的所有XML的MemBufInputSource,然后在缓冲区上执行parseNext以解析已经存在的新XML收到了,但我无法弄清楚如何让它正常工作。

有没有更好的解决这个问题的方法?也许仅使用<session></session>消息的特殊情况?

由于

1 个答案:

答案 0 :(得分: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功能。

希望有所帮助!