c ++でexpat xmlパーサーを使用して、cdataで脱出したシンボルの周りで白い空間を失う
-
19-09-2019 - |
質問
XMLを使用して、アプリケーション間でプロジェクト情報を送信しています。情報の1つはプロジェクトの説明です。ので、私は持っています:
<ProjectDescription>Test & spaces around&some & amps!</ProjectDescription>
または:「周りのテストとスペース&some&amps!」 < - いいね!
その後、Expatを使用して解析すると、データハンドラーは一度に文字列全体の一部を取得します。 「テスト」、次に「&」、次に「周りのスペース」、次の「&」など。元の文字列を再構築しようとすると、データハンドラーが決して届かないため、&sの周りのすべての間隔が削除されます。彼らを見て。 XMLを書き直すと、
<ProjectDescription>Test&spaces around&some&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 & YYY
char *と長さのデータセットを使用して3つのイベントを取得します。
char * = "XXX & YYY"
length = 4
char * = "&"
length = 1
char * = " YYY"
length = 4
したがって、スペースは保持されます。私が知る限り、私は特定の設定を使用していません。どのバージョンとExpatのプラットフォームを使用していますか?
所属していません StackOverflow