boost库在解析XML时具有良好的性能,可操作性也很强下地址有个简单的说明
http://blog.csdn.net/luopeiyuan1990/article/details/9445691
一下是做的两个实例:入门教程,大神见笑,希望能帮助你尽快进入XML的开发之旅。
<root> <delfile> <filenum> 35 </filenum> <paths> <path> <pathname>/tmp/tmp0/</pathname> <before_hours> 0 </before_hours> </path> <path> <pathname>/tmp/tmp1/</pathname> <before_hours> 1 </before_hours> </path> <path> <pathname>/tmp/tmp2/</pathname> <before_hours> 2 </before_hours> </path> <path> <pathname>/tmp/tmp3/</pathname> <before_hours> 3 </before_hours> </path> <path> <pathname>/tmp/tmp4/</pathname> <before_hours> 4 </before_hours> </path> </paths> </delfile> <backup> <backuptime> 23:59 </backuptime> </backup> </root>
代码:(例程引用了狂人山庄的博客,感谢网友)
#include <boost/property_tree/ptree.hpp> #include <boost/property_tree/xml_parser.hpp> #include <boost/typeof/typeof.hpp> #include <iostream> using namespace std; /* 相关的xml参考文件请参考del.conf */ void ReadConfig() { boost::property_tree::ptree pt; //定义一个存放xml的容器指针 boost::property_tree::read_xml("del.conf", pt); //读入目录下 del.conf文件 入口在pt这个指针 int filenum = pt.get<int>("root.delfile.filenum"); //将 xml文件中, root节点,下一层delfile 下一层的filenum 作为int类型取出,存在在filenum变量中。 cout << "filenum: " << filenum << endl;//不注释了 - - BOOST_AUTO(child, pt.get_child("root.delfile.paths")); //BOOST_AUTO自动获取表达式, 这里定义个一个节点child指针,并将指针指向 root下一层的delfile的下一层的paths for (BOOST_AUTO(pos, child.begin()); pos != child.end(); ++pos)//由于paths节点有多个节点,并且这些节点名称一样,可以用遍历的方法来获取他们,方法见左 { BOOST_AUTO(child_paths, pos->second.get_child("")); //此处不需要填结点名,但引号不能省.这里是获取该节点下所有子节点的意思,子节点获取后放在child_path这个指针 for (BOOST_AUTO(pos_paths, child_paths.begin()); pos_paths != child_paths.end(); ++pos_paths) cout << pos_paths->second.data() << endl; } } int main() { ReadConfig(); return 0; }
第二个教程。代码可读性不是很高,但是写法用了一个FOREACH,很简洁。
<debug name="debugname"> <file name="debug.log"/> <modules type="internal"> <module1>Finance_Internal</module1> <module2>Admin_Internal</module2> <module3>HR_Internal</module3> </modules> <modules type="external"> <module>Finance_External1</module> <module>Admin_External2</module> <module>HR_External3</module> </modules> </debug>
相应代码:
/* * test2.cpp * * Created on: Jul 23, 2013 * Author: leo_luopy */ #include <iostream> #include <string> #include <boost/property_tree/ptree.hpp> #include <boost/property_tree/xml_parser.hpp> #include <boost/foreach.hpp> using namespace std; using namespace boost::property_tree; int main(void) { ptree pt; //定义一个容器入口指针 read_xml("debug_settings.xml", pt); BOOST_FOREACH(ptree::value_type &v1, pt.get_child("debug")){ if(v1.first == "<xmlattr>"){ //it's an attribute //read debug name="debugname" cout<< "debug name=" << v1.second.get<string>("name") << endl; }else if(v1.first == "file"){ //read file name="debug.log" cout << " file name=" << v1.second.get<string>("<xmlattr>.name") << endl; } else{ // v1.first == "modules" //get module type cout<< " module type:" << v1.second.get<string>("<xmlattr>.type") << endl; //loop for every node under modules BOOST_FOREACH(ptree::value_type &v2, v1.second){ if(v2.first == "<xmlattr>"){ //it's an attribute //this can also get module type cout<< " module type again:" << v2.second.get<string>("type") << endl; } else{ //all the modules have the same structure, so just use data() function. cout<< " module name:" << v2.second.data() << endl; } }//end BOOST_FOREACH } }//end BOOST_FOREACH return 0 ; }