zoukankan      html  css  js  c++  java
  • boost解析XML方法教程


    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 ;
    }


















  • 相关阅读:
    JS控制SVG缩放+鼠标控制事件
    JS多线程之Web Worker
    通过Java调用Python脚本
    Cornerstone的使用
    SVN服务器的搭建
    Python 函数作用域
    RDD转换算子(transformantion)
    Spark RDD简介
    Django 外键
    Django 模型常用属性
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3211956.html
Copyright © 2011-2022 走看看