我有一个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>
消息的特殊情况?
由于
答案 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功能。
希望有所帮助!