rapidxml操作xml

rapidxml:(内容源自网络)

一个项目对xml的操作是很常见的,在网上找了好久,经过大家一致认为,rapidxml在解析xml上占有绝对优势(bug需要在用的时候发觉)。

 

 

库可以配置宏:

RAPIDXML_NO_EXCEPTIONS //不使用异常

RAPIDXML_STATIC_POOL_SIZE //内存池大小默认(64 * 1024)

一般都不用改

 

rapidxml.hpp:

         只要文件 实现内存池 解析string 异常处理

xml_base 基数节点类

xml_attribute 文本类

xml_node 节点类

xml_document 文档类

rapidxml_iterators.hpp:

         提供两个迭代器类:node_iterator, attribute_iterator

rapidxml_print.hpp:

         提供跟字符串,流对象的装换函数

rapidxml_utils.hpp:

         提供一个file用来读取文件使用

         跟两个计数函数 count_children,count_attributes

 

 

注意:需要说明的是rapidxml明显有一个bug,那就是append_node(doc.allocate_node(node_element,"h","0"));的时候并不考虑该对象是否存在!

 

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 version='1.0' encoding='utf-8' ?>
<config>
    <color>
        <red>0.1</red>
        <green>0.1</green>
        <blue>0.1</blue>
        <alpha>1.0</alpha>
    </color>
    <size>
        <x>640</x>
        <y>480</y>
    </size>
    <mode fullscreen="false">screen mode</mode>
</config>
 

 

读xml文件:

#include <iostream>
#include <rapidxml/rapidxml.hpp>
#include <rapidxml/rapidxml_utils.hpp>
#include <rapidxml/rapidxml_print.hpp>
 
using namespace rapidxml;

int main()
{    
      file<> fdoc("config.xml");
      std::cout<<fdoc.data()<<std::endl; 
      xml_document<>   doc;    
      doc.parse<0>(fdoc.data()); 

      std::cout<<doc.name()<<std::endl;
     
     //! 获取根节点
      xml_node<>* root = doc.first_node();
      std::cout<<root->name()<<std::endl;

     //! 获取根节点第一个节点
      xml_node<>* node1 = root->first_node();
      std::cout<<node1->name()<<std::endl; 

      xml_node<>* node11 = node1->first_node();
      std::cout<<node11->name()<<std::endl;
      std::cout<<node11->value()<<std::endl;
     
     //! 修改之后再次保存
      xml_node<>* size = root->first_node("size");
      size->append_node(doc.allocate_node(node_element,"w","0"));
      size->append_node(doc.allocate_node(node_element,"h","0"));

      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 version='1.0' encoding='utf-8' ?>
<config>
    <color>
        <red>0.1</red>
        <green>0.1</green>
        <blue>0.1</blue>
        <alpha>1.0</alpha>
    </color>
    <size>
        <x>640</x>
        <y>480</y>
    </size>
    <mode fullscreen="false">screen mode</mode>
</config>
 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值