Как разобрать такой XML с boost.Qi и вызвать функции, названные тегами? - PullRequest
2 голосов
/ 12 марта 2011

так что я знаю, что есть официальные учебные пособия по Boost.Qi XML-парсингу , но я не понимаю, как с ним разобраться, такой XML:

<host url="http://www.site.com"/>
<run app="myApp" version=443 url="/folderName/innerFolder/myApp.exe"/>
<folder name="folderName" version=443>
<folder name="innerFolder" version=443>
<file name="innerFile.txt" version=443 url="/folderName/innerFolder/innerFile.txt">
<file name="myApp" version=443 url="/folderName/innerFolder/myApp.exe"/>
</folder>
<file name="fileName"  url="/folderName/fileName.exe" version=442/>
</folder>

Это выглядит довольно простоно я не понимаю, как разобрать мой xml .. (Что мне нужно, так это просто - вызвать функцию (вызывается с тем же именем, что и тег, такой как file ()) из host ()), который мне нужно отправить объектам функций, таким как:

typedef boost::variant<int, std::string, void*> variant_type;
std::map<std::string, variant_type> tagObj;
tagObj["url"] = 10;

Итак - как сделать boost.Qi разобрать мой XML и вызвать мои функции при разборе?

1 Ответ

2 голосов
/ 12 марта 2011

У меня еще нет рабочего примера (сегодня утром я тоже рассматриваю пример парсера xml), но я бы сказал, что вы хотите изменить это правило

qi::rule<Iterator, std::string(), ascii::space_type> start_tag;

до

qi::rule<Iterator, tag_struct(), ascii::space_type> start_tag;

где tag_struct - это BOOST_FUSION_ADAPT_STRUCT, который принимает такие вещи, как folder name, version url и т. Д. Тогда код из примера должен быть более или менее одинаковым - вам потребуется измените xml_mini_printer для вывода. Я сам попробую это сделать в качестве упражнения. Будет ли обновление, если я получу где-нибудь.

РЕДАКТИРОВАТЬ: Бах я застрял!

...