Потеря пробелов вокруг экранированных символов в CDATA с использованием синтаксического анализатора Expat XML в C ++ - PullRequest
2 голосов
/ 14 декабря 2009

Я использую XML для отправки информации о проекте между приложениями. Одним из элементов информации является описание проекта. Итак, у меня есть:

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

Или: "Тест и пробелы вокруг, а также усилители!" <- ХОРОШО! </p>

Когда я затем использую Expat для его анализа, мой обработчик данных получает только части всей строки за раз. «Тест», затем «&», затем «пробелы вокруг», следующий «&» и т. Д. И т. Д. Когда я затем пытаюсь восстановить исходную строку, все пробелы вокруг & отбрасываются, потому что обработчик данных никогда не попадает в увидеть их. Когда я переписываю XML, я получаю:

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

Или: "Тест и пробелы вокруг, а также усилители!" <- ПЛОХО! </p>

Это известная проблема с существующими обходными решениями? Есть ли какая-то настройка, которую я могу дать 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» содержит данные в элементе. Без всяких & вещей - это вся строка между тегами open и close, в случае «строки с пробелами».

1 Ответ

0 голосов
/ 14 декабря 2009

Я только что запустил тест с моей собственной библиотекой, которая использует 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, заданными следующим образом:

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

char * = "&"
length = 1

char * = " YYY"
length = 4

Таким образом, пробелы сохраняются. Насколько я знаю, я не использую никакие настройки Specal. Какую версию и платформу Expat вы используете?

...