Какой самый эффективный способ анализа неполных XML-сообщений в потоке? - PullRequest
1 голос
/ 20 марта 2012

У меня есть 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.

Когда я получаю каждое сообщение, я в идеале хочу добавить его в MemBufInputSource, который содержит весь XML, который был получен в настоящее время, а затем выполнить parseNext в буфере для анализа нового полученного XML, но я не могу понять, как заставить его работать правильно.

Есть ли лучший способ обойти эту проблему? Возможно, просто использовать специальный случай для <session></session> сообщений?

Спасибо

1 Ответ

0 голосов
/ 20 марта 2012

Вы пытались использовать другой парсер?Если нет, я использую 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.

Надеюсь, это поможет!

...