c ++でexpat xmlパーサーを使用して、cdataで脱出したシンボルの周りで白い空間を失う

StackOverflow https://stackoverflow.com/questions/1900160

質問

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

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

または:「周りのテストとスペース&some&amps!」 < - いいね!

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

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

または:「周りのテストとスペース&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」には要素内のデータが含まれます。 「スペースのある文字列」の場合、それは何もありません。

役に立ちましたか?

解決

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 *と長さのデータセットを使用して3つのイベントを取得します。

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

char * = "&"
length = 1

char * = " YYY"
length = 4

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top