gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:17:53 25 4
gpt4 key购买 nike

我有一个通过流向我发送 XML 消息的 TCP 连接。

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

第二个是身份验证请求消息,它提供了一个种子,用于散列我的凭据以发送回服务器 - <session seed="VJAWKBJXJO">

此时我应该发回 <session user="admin" password_hash="123456789"> 消息来验证我自己。

一旦通过身份验证,我将收到 <Msg>data</Msg> 形式的所需数据。

如果我没有及时向服务器进行身份验证,我会收到一条 </session> 消息,表明 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 功能。

希望对您有所帮助!

关于c++ - 通过流解析不完整的 XML 消息的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9787222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com