使用rapidxml操作xml~读写文件操作

rapidxml~网上很容易下,下面介绍使用方法:
1、xml写文件
如下:
#include <iostream>
#include 
<rapidxml/rapidxml.hpp>
#include 
<rapidxml/rapidxml_utils.hpp>
#include 
<rapidxml/rapidxml_print.hpp>

using namespace rapidxml;

int main()
{    
      xml_document
<> doc;  
      xml_node
<>* rot = doc.allocate_node(rapidxml::node_pi,doc.allocate_string("xml version='1.0' encoding='utf-8'"));
      doc.append_node(rot);
      xml_node
<>* node =   doc.allocate_node(node_element,"config","information");  
      xml_node
<>* color =   doc.allocate_node(node_element,"color",NULL);  
      doc.append_node(node);
      node
->append_node(color);
      color
->append_node(doc.allocate_node(node_element,"red","0.1"));
      color
->append_node(doc.allocate_node(node_element,"green","0.1"));
      color
->append_node(doc.allocate_node(node_element,"blue","0.1"));
      color
->append_node(doc.allocate_node(node_element,"alpha","1.0"));

      xml_node
<>* size =   doc.allocate_node(node_element,"size",NULL); 
      size
->append_node(doc.allocate_node(node_element,"x","640"));
      size
->append_node(doc.allocate_node(node_element,"y","480"));
      node
->append_node(size);

      xml_node
<>* mode = doc.allocate_node(rapidxml::node_element,"mode","screen mode");
      mode
->append_attribute(doc.allocate_attribute("fullscreen","false"));
      node
->append_node(mode);

      std::
string text;  
      rapidxml::print(std::back_inserter(text), doc, 
0);  

      std::cout
<<text<<std::endl; 
    
      std::ofstream 
out("config.xml");
     
out << doc;

      system(
"PAUSE");
     
return EXIT_SUCCESS;
}

生成的xml文件为:
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客<?xml version='1.0' encoding='utf-8' ?>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
<config>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客    
<color>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客        
<red>0.1</red>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客        
<green>0.1</green>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客        
<blue>0.1</blue>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客        
<alpha>1.0</alpha>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客    
</color>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客    
<size>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客        
<x>640</x>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客        
<y>480</y>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客    
</size>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客    
<mode fullscreen="false">screen mode</mode>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
</config>

2、读xml文件
基本的步骤为
首先获取xml文件数据
然后分析数据
获取节点
获取属性
获取名字
获取值
...

代码如下:
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客#include <iostream>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客#include 
<rapidxml/rapidxml.hpp>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客#include 
<rapidxml/rapidxml_utils.hpp>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客#include 
<rapidxml/rapidxml_print.hpp>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客 
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
using namespace rapidxml;
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
int main()
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
{    
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客      file
<> fdoc("config.xml");
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客      std::cout
<<fdoc.data()<<std::endl; 
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客      xml_document
<>   doc;    
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客      doc.parse
<0>(fdoc.data()); 
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客      std::cout
<<doc.name()<<std::endl;
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客     
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客     
//! 获取根节点
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
      xml_node<>* root = doc.first_node();
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客      std::cout
<<root->name()<<std::endl;
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客     
//! 获取根节点第一个节点
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
      xml_node<>* node1 = root->first_node();
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客      std::cout
<<node1->name()<<std::endl; 
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客      xml_node
<>* node11 = node1->first_node();
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客      std::cout
<<node11->name()<<std::endl;
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客      std::cout
<<node11->value()<<std::endl;
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客     
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客     
//! 修改之后再次保存
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
      xml_node<>* size = root->first_node("size");
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客      size
->append_node(doc.allocate_node(node_element,"w","0"));
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客      size
->append_node(doc.allocate_node(node_element,"h","0"));
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客      std::
string text;  
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客      rapidxml::print(std::back_inserter(text),doc,
0);  
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客 
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客      std::cout
<<text<<std::endl; 
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客    
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客      std::ofstream 
out("config.xml");
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客     
out << doc;
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客      system(
"PAUSE");
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客     
return EXIT_SUCCESS;
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客}

使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
生成的xml为:
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客<?xml version='1.0' encoding='utf-8' ?>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
<config>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客    
<color>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客        
<red>0.1</red>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客        
<green>0.1</green>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客        
<blue>0.1</blue>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客        
<alpha>1.0</alpha>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客    
</color>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客    
<size>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客        
<x>640</x>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客        
<y>480</y>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客    
</size>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客    
<mode fullscreen="false">screen mode</mode>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
</config>
使用rapidxml操作xml~读写文件操作 - songhao0201 - songhao0201的博客
需要说明的是rapidxml明显有一个bug
那就是append_node(doc.allocate_node(node_element,"h","0"));的时候并不考虑该对象是否存在!

参考:http://hi.baidu.com/gookings/blog/item/fa4f7b09a1a7cfc33ac7637c.html

你可能感兴趣的:(使用rapidxml操作xml~读写文件操作)