Потеря пробела вокруг сбежавших символов в CDATA с использованием анализатора expat XML в C ++
-
19-09-2019 - |
Вопрос
Я использую XML для отправки информации о проекте между приложениями. Одним из частей информации является описание проекта. Так что я:
<ProjectDescription>Test & spaces around&some & amps!</ProjectDescription>
Или: «Тестирование и пространства вокруг и некоторые и усилители!» <- Хорошо!
Когда я использую Expat, чтобы проанализировать его, мой обработчик данных получает только части всей строки за раз. «Тест», затем «&», затем «пробелы вокруг», следующее «&» и т. Д. и т. Д., Когда я затем пытаюсь реконструировать исходную строку, все расстояние вокруг & 'сбрасывается, потому что обработчик данных никогда не добирается до увидеть их. Когда я затем переписываю XML, я получаю:
<ProjectDescription>Test&spaces around&some&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 & YYY
Я получаю три события с набором данных Char * и длиной
char * = "XXX & YYY"
length = 4
char * = "&"
length = 1
char * = " YYY"
length = 4
Таким образом, пространства сохраняются. Насколько я знаю, я не использую каких -либо специфических настроек. Какая версия и платформа Expat вы используете?