通过流分析不完整的 XML 消息的最有效方法是什么?

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

本文关键字:消息 XML 方法 是什么 有效      更新时间:2023-10-16

我有一个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>消息使用特殊情况?

谢谢

您是否尝试过使用其他解析器? 如果没有,我使用的是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 功能。

希望对您有所帮助!