通过流分析不完整的 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 的渐进式解析。
当我收到每条消息时,我想理想地将其附加到包含当前已接收的所有 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 功能。
希望对您有所帮助!
- boost::进程间消息队列引发错误
- Cppcheck生成xml转储文件
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何在pugixml中获取节点的内部XML
- 如何使用tinyxml2从XML加载父实体和子实体
- 如何通过参数抛出错误消息
- 从服务器传输到客户端的消息不会出现
- boost xml parsingl将xml的路径作为变量发送
- ROS2 动态消息模板
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 使用 Tinyxml 在 xml 中添加一个子子项
- C++秘密消息学校作业
- 增强基于 XML class_id的反序列化
- glad 导致 glfwSwapBuffers 返回错误消息
- C++入门 5 版:类消息和文件夹
- 如何通过不同的编程语言发送,接收和解析XML消息
- 通过流分析不完整的 XML 消息的最有效方法是什么?