Ошибка синтаксического анализа rapidxml с атрибутом url - PullRequest
1 голос
/ 19 апреля 2011

Я получаю странную ошибку с rapidxml при разборе XML-файла, например

<?xml version="1.0" encoding="UTF-8"?>
<IMG align="left"
 src="http://www.w3.org/Icons/WWW/w3c_home" />

Выдает «ожидаемый>».Я использую код, подобный следующему, для разбора данных

std::fstream file("./test.xml");
std::istream_iterator<char> eos;
std::istream_iterator<char> iit (file);

std::vector<char> xml(iit, eos);
xml.push_back('\0');

xml_document<> doc;
doc.parse<0>(&xml[0]);

символ "/" в тряпке IMG кажется проблемой.Это ошибка rapidxml или я что-то не так делаю?

Ответы [ 3 ]

1 голос
/ 19 апреля 2011

Я просто попробовал это из любопытства.RapidXml может быть быстрым, но, конечно, он не очень хорошПравильно отклонено

$ ./test.exe '<hello we="" / >'
terminate called after throwing an instance of 'rapidxml::parse_error'
  what():  expected >
Aborted (core dumped)

Неправильно принято:

$ ./test.exe '<hello we="close">world</die><zellq></die>'

$ ./test.exe '<hello we="close/">world</die><we horrible=""></don'\''t>'

ГММВ

1 голос
/ 16 июля 2011

Способ загрузки данных 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.Обоснованием такого поведения является производительность - проверка конечных тегов занимает много времени и в большинстве случаев не требуется.

0 голосов
/ 19 апреля 2011

Ваш XML действителен. Если код и XML точно такие же, как вы опубликовали, это должна быть ошибка rapidxml. Я думаю, он либо не поддерживает разбиение списка атрибутов между несколькими строками, либо менее вероятно, не поддерживает /> для конца тега.

...