1

ストリーム経由で XML メッセージを送信する TCP 接続があります。

メッセージで受け取る最初の<?xml version="1.0" encoding="utf-8"?>メッセージ。

2 番目は認証要求メッセージで、資格情報をハッシュしてサーバーに送り返すときに使用するシードを提供します - <session seed="VJAWKBJXJO">

この時点で、<session user="admin" password_hash="123456789">自分自身を認証するためにメッセージを送り返す必要があります。

認証が完了すると、目的のデータが の形式で受信されます<Msg>data</Msg>

サーバーとの認証が間に合わない場合</session>、セッションが閉じられたことを示すメッセージを受け取ります。

<session>問題は、終了タグのないタグを解析しようとすると常にエラーがスローされるため、DOM パーサーを使用できないことです。そのため、Xerces-c SAX パーサーを使用して XML のプログレッシブ解析を実行しようとしています。

各メッセージを受信したら、理想的にMemBufInputSourceは、現在受信したすべての XML を含む に追加parseNextし、バッファに対して a を実行して、受信した新しい XML を解析したいのですが、それを取得する方法がわかりません正しく動作しています。

この問題を回避するより良い方法はありますか? おそらく、<session></session>メッセージに特別なケースを使用しているだけでしょうか?

ありがとう

4

1 に答える 1

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 機能についてのみ話すことができます。

それが役立つことを願っています!

于 2012-03-20T14:56:24.997 に答える