2011-03-12 28 views
2

所以我知道有上Boost.Qi XML parsing官方教程,但我挺鋼不明白如何與它這樣的XML解析:如何用boost.Qi解析這樣的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 .. (我需要的是簡單的 - 調用一個函數(稱爲具有相同的名稱,主機()),我需要發送到功能對象,如像文件)標籤(:

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

所以 - 如何使boost.Qi解析我的XML並在解析時調用我的函數?

+1

我不確定boost :: spirit是否適合您的任務。當然,這是可能的,它們提供了一個解析XML小部分的簡單例子。我認爲當沒有可用的目標語言解析器時,應該使用Spirit,並使用一個快速,完整,經過充分測試的XML優化解析器。 [RapidXML](http://rapidxml.sourceforge.net/)很好,例如與Boost很好地集成。 – tux21b 2011-03-12 15:40:45

回答

2

我沒有工作的例子,但(我通過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,versionurl等等之類的東西。然後example中的代碼應該或多或少相同 - 您將需要更改xml_mini_printer以進行輸出。我將自己做一個練習。如果我得到任何地方會更新。

編輯:Bah我卡住了!

+1

不耐煩我等你的代碼示例!=)謝謝你的幫助! – Rella 2011-03-12 14:12:53