1、引入头文件:

一般用到的头文件:

 #include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_utils.hpp" //rapidxml::file
#include "rapidxml/rapidxml_print.hpp" //rapidxml::print

2、部分类型介绍:

  类:xml_document  
  定义一个该类的对象doc 
  rapidxml::xml_document<> doc; 
  类的定义位置:rapidxml.hpp         类的成员函数:

    1)parse(Ch *text) 将数据解析为DOM Tree
      使用时doc.parse(text);
      parseFlag指定格式,可以用’|’来组合使用
      常用的parseFlag:
      parseFlag为0表示默认的parseflag

      parse_comment_nodes表示带上xml中的注释
      parse_no_data_nodes在要修改结点值的时候要设置这个parseFlag

    2) clear() 清空DOM Tree
      此外xml_document继承自xml_node因此还具有xml_node的方法。

  3)获取DOM Tree结点rapidxml::xml_node<> *root; 类:xml_node

    常用的类成员函数:

      1)node_type type() const; 获取结点类型 获取的类型是枚举的
      2)Ch* name() const; 获取结点名
      3)std::size_t name_size() const; 获取结点名长度
      4)Ch* value() const; 获取结点值
      5)std::size_t value_size() const; 获取结点值长度
      7)xml_node* last_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; 获取DOM Tree最后一个子结点的指针

      8)xml_attribute* first_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; 获取结点的第一个属性指针

      9)xml_attribute* next_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; 获取结点的下一个属性指针

      10)xml_attribute* last_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const;获取结点的最后一个属性指针

        属性指针的格式见类xml_attribute

      11)xml_node* previous_sibling(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const;获取上一个同级结点的指针

      12)xml_node* next_sibling(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; 获取下一个同级结点的指针

      13)xml_attribute* first_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; 获取第一个同级结点的指针

      14)xml_attribute* last_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const; 获取最后一个同级结点的指针

      15)void insert_node(xml_node< Ch > *where, xml_node< Ch > *child);在第一个参数指向的结点之前,

  

  4)获取属性
    类:xml_attribute
    定义于:rapidxml.hpp
    常用方法:
      1)xml_attribute *previous_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const;获取前一个属性
      2)xml_attribute *next_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const;获取后一个属性
  

  5)为一个新的属性或者结点分配空间
    1)为结点分配空间
      xml_node* allocate_node(node_type type, const Ch *name=0, const Ch *value=0, std::size_t name_size=0, std::size_t value_size=0);
    2)为属性分配空间
      xml_attribute* allocate_attribute(const Ch *name=0, const Ch *value=0, std::size_t name_size=0, std::size_t value_size=0);

namespace rapidxml
{
  // Forward declarations
  template<class Ch> class xml_node;
  template<class Ch> class xml_attribute;
  template<class Ch> class xml_document;

  //! Enumeration listing all node types produced by the parser.
  //! Use xml_node::type() function to query node type.
  enum node_type
  {

    //文档节点。 名称和值为空。
    node_document, //!< A document node. Name and value are empty.

    //元素节点。 名称包含元素名称。 值包含第一个数据节点的文本。

    node_element, //!< An element node. Name contains element name. Value contains text of first data node.

    //一个数据节点。 名称为空。 值包含数据文本。
    node_data, //!< A data node. Name is empty. Value contains data text.

    //一个CDATA节点。 名称为空。 值包含数据文本。
    node_cdata, //!< A CDATA node. Name is empty. Value contains data text.

    //评论节点。 名称为空。 值包含注释text
    node_comment, //!< A comment node. Name is empty. Value contains comment text.

    //声明节点。 名称和值为空。 声明参数(版本,编码和独立)在节点属性中。
    node_declaration, //!< A declaration node. Name and value are empty. Declaration parameters (version, encoding and standalone) are in node attributes.

    //DOCTYPE节点。 名称为空。 值包含DOCTYPE文本。
    node_doctype, //!< A DOCTYPE node. Name is empty. Value contains DOCTYPE text.

    //PI节点。 名称包含目标。 值包含说明。
    node_pi //!< A PI node. Name contains target. Value contains instructions.
  };

}

c++开源库rapidxm的更多相关文章

  1. 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~

    一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻 ...

  2. Java下好用的开源库推荐

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文想介绍下自己在Java下做开发使用到的一些开源的优秀编程库,会不定 ...

  3. 第三方开源库和jar包的区别

    jar包和第三方开源库的根本区别在于,开源库的功能比jar包功能更强大,通过引入库项目可以访问java文件以及该开源库项目下的资源文件,例如图片,layout等文件 jar包中只能放class文件 引 ...

  4. 【转】用JitPack发布开源库时附加文档和源码

    来自:http://www.gcssloop.com/course/jitpack-sources-javadoc 用JitPack发布开源库时附加文档和源码 很早之前写过一篇用JitPack发布An ...

  5. libCURL开源库在VS2010环境下编译安装,配置详解

    libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...

  6. GitHub上那些值得一试的JAVA开源库--转

    原文地址:http://www.jianshu.com/p/ad40e6dd3789 作为一名程序员,你几乎每天都会使用到GitHub上的那些著名Java第三方库,比如Apache Commons,S ...

  7. .NET蓝牙开源库:32feet.NET

    在用C#调用蓝牙编程一文中我留个小悬念就是:InTheHand.Net.Personal.dll是怎么来的?这篇文章来解答这个问题,InTheHand.Net.Personal.dll就是来源于今天要 ...

  8. Android Studio 简介及导入 jar 包和第三方开源库方[转]

    原文:http://blog.sina.com.cn/s/blog_693301190102v6au.html Android Studio 简介 几天前的晚上突然又想使用 Android Studi ...

  9. 快快快!27个提升效率的iOS开源库推荐

    文章来源:http://www.csdn.net/article/2015-07-21/2825264-27-ios-open-source-libraries/1 我热爱开源,更喜爱那些花费宝贵的业 ...

随机推荐

  1. Codeforces Round #610 (Div. 2) A-E简要题解

    contest链接: https://codeforces.com/contest/1282 A. Temporarily unavailable 题意: 给一个区间L,R通有网络,有个点x,在x+r ...

  2. 经常使用的cmd命令

    ASSOC 显示或修改文件扩展名关联.ATTRIB 显示或更改文件属性.BREAK 设置或清除扩展式 CTRL+C 检查.BCDEDIT 设置启动数据库中的属性以控制启动加载.CACLS 显示或修改文 ...

  3. 【PAT甲级】1114 Family Property (25分)(并查集)

    题意: 输入一个正整数N(<=10000),接着输入N行每行包括一个人的ID和他双亲的ID以及他的孩子数量和孩子们的ID(四位整数包含前导零),还有他所拥有的房产数量和房产面积.输出一共有多少个 ...

  4. Linux(Mac)常用命令

    df -B[G,M,K]查看磁盘剩余空间 free -mh查看内存 netstat -ntlp查看当前监听的网络端口 mount -t auto /dev/cdrom /media/cdrom挂载cd ...

  5. linux下grep分析apache日志的命令集合

    https://my.oschina.net/hmc0316/blog/112004 实例:月份英文简写英文全称一月Jan.January二月Feb.February三月Mar.March四月Apr. ...

  6. java基础(八)之函数的复写/重写(override)

    复写的意思就是子类对父类的修改. 复写的条件: 1.在具有父子类关系的两个类当中:2.父类和子类各有一个函数,这两个函数的定义保持一致(返回值类型.函数名.参数列表) 还是老样子,3个文件来说明. P ...

  7. js Array 的所有方法

    下面的这些方法会改变调用它们的对象自身的值: Array.prototype.copyWithin()  在数组内部,将一段元素序列拷贝到另一段元素序列上,覆盖原有的值. Array.prototyp ...

  8. 使用git上传项目解决码云文件次数上传限制(原文)

    起因:个人免费版的码云上传文件时限制: 1个小时内只能上传20个文件 解决方法:在码云创建空的项目仓库,使用git客户端下载码云的项目,把需要上传的文件复制到该项目中去,用git提交! 1.配置git ...

  9. 非分页中的上一篇下一篇sql语句如何写

    上一页:where id=(select max(id) from examination where id < #{id} and class=#{class}) 下一页:where id=( ...

  10. Linux - paste

    1. 概述 引入 碰到一个场景, 需要将两列合并成一列 vim 的 ex 貌似不太好做这个事 如果两列在一行里, ex 是可以做的 但问题就是, 两列不在一行里... sed 和 awk 应该是可以做 ...