1

我有一个 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 的 a 中,然后parseNext在缓冲区上执行 a 以解析已收到的新 XML,但我不知道如何获取它正常工作。

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

谢谢

4

1 回答 1

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 功能。

希望有帮助!

于 2012-03-20T14:56:24.997 回答