2012-03-20 72 views
1

我有一个TCP连接,通过流向我发送XML消息。通过流解析不完整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

当我试图解析''消息时,当它找不到''结束标记时,我当前的实现一直在持续下降 – 2012-03-20 14:00:34

回答

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

希望有帮助!

+0

感谢您的建议,但不幸的是我必须使用xerces- c库 – 2012-03-20 15:05:02

相关问题