Потеря пробела вокруг сбежавших символов в CDATA с использованием анализатора expat XML в C ++

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

Вопрос

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

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

Или: «Тестирование и пространства вокруг и некоторые и усилители!» <- Хорошо!

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

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

Или: «Тестирование и пространства вокруг и немного!» <- Плохо!

Это известная проблема с существующими обходными путями? Есть ли некоторые настройки, которые я могу дать Expat, чтобы контролировать его поведение вокруг сбежавших символов?

Мои попытки Googling Ответ встретился с мрачной неудачей.

РЕДАКТИРОВАТЬ: В ответ на вопрос в комментариях: у меня есть собственный обработчик, который я регистрируюсь с парсером:

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 * и длиной

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

char * = "&"
length = 1

char * = " YYY"
length = 4

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top