2

アプリケーション間でプロジェクト情報を送信するために XML を使用しています。情報の 1 つにプロジェクトの説明があります。ので、私は持っています:

<ProjectDescription>Test &amp; spaces around&amp;some  &amp;  amps!</ProjectDescription>

または: 「テスト & スペース & いくつか & amps!」<-- いいね!

次に Expat を使用してそれを解析すると、データ ハンドラーは一度に文字列全体の一部だけを取得します。「テスト」、「&」、「前後のスペース」、次の「&」など。その後、元の文字列を再構築しようとすると、データ ハンドラーが到達しないため、& の周りのすべてのスペースが削除されます。彼らを見て。XML を書き直すと、次のようになります。

<ProjectDescription>Test&amp;spaces around&amp;some&amp;amps!</ProjectDescription>

または: 「Test&spaces around&some&s!」<--悪い!

これは既存の回避策に関する既知の問題ですか? エスケープされたシンボルの周りの動作を制御するために Expat に与えることができる設定はありますか?

答えをグーグルで検索しようとした私の試みは、悲惨な失敗に終わりました。

編集:コメントの質問への回答:私はパーサーに登録する独自のハンドラーを持っています:

parser=XML_ParserCreate(NULL); 
XML_SetUserData(parser,&depth);
XML_SetElementHandler(parser,startElement,endElement); 
XML_SetCharacterDataHandler(parser,dataHandler); 

ハンドラーは次のように宣言されます。

static void dataHandler(void *userData,const XML_Char *s,int l) 

そして、「s」には要素内のデータが含まれます。「スペースを含む文字列」の場合は、& などがない場合は、開始タグと終了タグの間の文字列全体です。

4

1 に答える 1

0

expat を使用する独自のライブラリでテストを実行しました。私のハンドラーは次のようになり、何が起こっているかを表示するデバッグ ステートメントが表示されます。

void CharDataHandler( void * parser, 
                       const XML_Char *s,
                       int len ) {
    std::cerr << "[" << s << "]\n";
    std::cerr << len << "\n";
    // my own processing here - not important 
}

あなたが話している行動はわかりません。入力データの場合:

XXX &amp; YYY

次のように char * と length データ セットを使用して 3 つのイベントを取得します。

char * = "XXX &amp; YYY"
length = 4

char * = "&"
length = 1

char * = " YYY"
length = 4

したがって、スペースは保持されます。私の知る限り、特別な設定は使用していません。Expat のどのバージョンとプラットフォームを使用していますか?

于 2009-12-14T11:17:25.070 に答える