RapidXml Manual: http://rapidxml.sourceforge.net/manual.html

DOM解析是将XML文件全部载入,组装成一颗DOM树,然后通过节点以及节点之间的关系来解析XML文件。

RapidXml是一个使用C++编写的XML DOM解析工具包,整个解析工具包包含在一个头文件中,所以使用时不用编译也不用连接。只要包含rapidxml中的三个头文件即可。

RapidXml 试图成为最快的 XML DOM 解析工具包,同时保证解析结果的可用性、可移植性以及与 W3C 标准的兼容性。在操作同一数据时,其解析速度接近于 strlen() 函数。

  • 解析:

以下代码使用RapidXml解析一段以0结束的字符串text:

1 using namespace rapidxml;
2 xml_document<> doc;    // character type defaults to char
3 doc.parse<0>(text);    // 0 means default parse flags

其中,doc为解析得到的DOM tree的根节点。由于所有的RapidXml接口都包含在rapixml,所以用户需要使用这个名字空间。类xml_document代表了DOM结构的根,它公开继承了xml_node和memory_pool。xml_document::parse()的模板参数用来标识解析标志,使用它可以对解析器的行为进行调整(这里我也不太明白,调整什么?)。这个标志必须是编译时的常数。

  • Accessing DOM Tree:

使用xml_node和xml_attribute类中的方法访问DOM tree。

1 cout << "Name of my first node is: " << doc.first_node()->name() << "\n";
2 xml_node<> *node = doc.first_node("foobar");
3 cout << "Node foobar has value " << node->value() << "\n";
4 for (xml_attribute<> *attr = node->first_attribute();
5      attr; attr = attr->next_attribute())
6 {
7     cout << "Node foobar has attribute " << attr->name() << " ";
8     cout << "with value " << attr->value() << "\n";
9 }

  • Modifying DOM Tree:

下例为创建一个HTML文档,它唯一的内容是一个google.com的链接( <a href=google.com>Google</a>):

xml_document<> doc;
xml_node<> *node = doc.allocate_node(node_element, "a", "Google");
doc.append_node(node);
xml_attribute<> *attr = doc.allocate_attribute("href", "google.com");
node->append_attribute(attr);

nodes和attributes并不真正拥有文章中节点和属性的名字及值,因为它们只是存储了指向源文中某个位置的指针。所以,当为一个节点分配名字和值的时候,必须确保待这些字符串有合适的生命周期。最简单的方法是从xml_document memory pool中分配字符串。当然,在上面例子中没有必要这么做,因为这里使用了字符常量。下面的代码使用了memory_pool::allocate_string()方法分配节点名字(这样它将和文档具有相同的生命周期)给新的节点:

xml_document<> doc;
char *node_name = doc.allocate_string(name);        // Allocate string and copy name into it
xml_node<> *node = doc.allocate_node(node_element, node_name);  // Set node name to node_name

  • Printing XML

将xml_document和xml_node的对象写入一XML的string里,可以使用在rapidxml_print.hpp头文件中定义的print()函数或者操作符<<。

using namespace rapidxml;
xml_document<> doc;    // character type defaults to char
// ... some code to fill the document// Print to stream using operator <<
std::cout << doc;   // Print to stream using print function, specifying printing flags
print(std::cout, doc, 0);   // 0 means default printing flags// Print to string using output iterator
std::string s;
print(std::back_inserter(s), doc, 0);// Print to memory buffer using output iterator
char buffer[4096];                      // You are responsible for making the buffer large enough!
char *end = print(buffer, doc, 0);      // end contains pointer to character after last printed character
*end = 0;                               // Add string terminator after XML

转载于:https://www.cnblogs.com/hihilary/archive/2012/11/18/2772983.html

RapidXml的使用相关推荐

  1. [转]xml解析工具的效率比较QDomDocument、TinyXml-2、RapidXml、PugiXml

    转自:http://www.itdaan.com/blog/2017/02/20/301ad47832f4.html 由于windows环境下测试不稳定,博主选择在linux下进行的测试! Qt - ...

  2. rapidxml修改节点的值

    1.rapidxml修改节点的value,修改之后,序列化还是原来的值,具体原因是什么,要看rapidxml是怎么实现的.如下: void TestRapidXml() {char* xmlConte ...

  3. rapidxml在qt linux(gcc)下写xml文件出错

    在linux(gcc)下使用qt写入xml出错,代码如下: 错误如图:这里写图片描述 在网上找了好久没有找到答案,最后在http://stackoverflow.com/questions/14113 ...

  4. 使用 rapidxml 做配置文件

    对于配置文件,一般会选用ini,xml 等等的配置格式.如何快速高效的从文件内读取自己想要的信息是每个做配置文件想要达到的效果.对以小型开发我们并不用时用到msxml这种重量级的解析器.那样会给自己添 ...

  5. rapidxml对unicode的支持

    为了提高duilib创建布局控件的效率,在LuaDui项目中使用rapidxml解析器替换了duilib库自带的xml解析器. duilib使用unicode编译,所以rapidxml需要解析unic ...

  6. 使用rapidxml 生成xml文件

    rapidxml是一个快速的xml库,由C++模板实现的高效率xml解析库,同时也是boost库的property_tree的内置解析库. 当时rapidxml时,只需要把rapidxml.hpp . ...

  7. RapidXml使用(备忘)

    好吧,先来说一下,为什么我要选择RapidXml来进行本地xml文件的解析: 对,没有错,接下来你看到的很长的一大段都摘自于: http://stackoverflow.com/questions/9 ...

  8. rapidxml操作XML

    主要对上一篇文章做了修改,文章涉及创建.读取和修改XML文件,内容比较齐全,可以供大家学习. 创建xml文件: 基本步骤:给文件分配节点xmlDoc.allocate_node(node_elemen ...

  9. rapidxml标识符 memory

    这次转战到rapidxml中,用了几次感觉很容易上手,就测试了几次直接用在了我的项目中,但出现个莫名奇妙的错误,就是标题,找了一会,突然间想到,我在一个头文件里覆盖了new #pragma once ...

  10. 使用Rapidxml 库遇到的问题和分析过程

    C++解析xml的开源库有很多,在此我就不一一列举了,今天主要说下Rapidxml,我使用这个库也并不是很多,如有错误之处还望大家能够之处,谢谢. 附: 官方链接:http://rapidxml.so ...

最新文章

  1. Python编程不能帮你找到女朋友,却能让你成为有钱的单身狗
  2. 深思考人工智能蝉联SMP2018多轮语义对话冠军,报告解读多轮人机对话实现过程...
  3. AOP埋点从入门到放弃(二)
  4. 模块化数据中心成未来互联网企业首选
  5. 大乐斗2服务器维护,2月23日更新公告
  6. 在微信小程序中调用本地接口
  7. 部署SAP HANA之前你需要知道的那些事
  8. SLAM: SLAM基本流程—VSLAM扫盲之旅
  9. SAP OData服务性能测量的四种办法
  10. java集合体检套餐管理系统_体检套餐管理系统
  11. 缺失值处理 - 获取一段时间内所有日期的列表 - (Python、MySQL)
  12. [python网络编程]使用scapy修改源IP发送请求
  13. 计算机基础教程(一)
  14. 基于FPGA的虚拟示波器的设计
  15. JS计算今天在本月第几周
  16. 计算几何之旋转卡壳算法
  17. Maven 常用镜像站地址
  18. java面试全套清单_Java 全套面试题 PDF 下载
  19. 什么是XSL?(XSL概述)
  20. 如何点击验证码刷新验证码的问题解决方法?

热门文章

  1. 【电机控制入门】——电机控制书籍推荐
  2. redhat7安装Oracle11g数据库全过程
  3. java怎么开发app_如何开发一款APP
  4. Python 自定义模块
  5. PDF文件如何删除空白页?告诉你两种好方法
  6. 实践教程 | 万字长文,值得收藏/参考的OpenCV C++基础代码
  7. win10、win8/8.1、win7系统激活工具-----也可激活Office各版本
  8. 冰点文库下载安装及使用教程
  9. 如何在VirtualBox中安装win7虚拟机?
  10. 网件刷breed_斐讯K2刷不死breed加padavan华硕固件教程