Способ загрузки данных XML в вектор неправильный.В текстовом режиме C ++ для потоков установлен флаг «skipws» по умолчанию, который заставляет их пропускать все пробелы во входных данных.Вы можете убедиться в этом, изучив содержимое вашего вектора - в нем пропущены все пробелы / концы.Это, очевидно, заставляет синтаксический анализатор жаловаться.
Снимите флажок skipws в потоке, чтобы получить правильное поведение:
file.unsetf(ios::skipws);
В качестве альтернативы, вы можете использовать класс файла из rapidxml_utils.hpp для загрузки файла:
using namespace rapidxml;
file<> file("test.xml");
xml_document<> doc;
doc.parse<0>(file.data());
К сожалению, загрузка текстовых файлов с потоками C ++ очень сложна и полна ловушек.
Что касается sehe тестов, описанных выше, "неправильно принятые" случаинаходятся в разработке (у меня недостаточно репутации, чтобы добавлять комментарии к его ответу).Вам необходимо использовать флаг синтаксического анализа parse_validate_closing_tags, чтобы парсер проверил, совпадает ли имя конечного тега с именем начального тега:
doc.parse<parse_validate_closing_tags>(...);
См. parse_validate_closing_tags в руководстве rapidxml.Обоснованием такого поведения является производительность - проверка конечных тегов занимает много времени и в большинстве случаев не требуется.