Quick notes on how to use RapidXML

There’s a C++ XML library called RapidXML which is perfect for most non-enterprise uses of XML. I wouldn’t call this a tutorial, but I hope this ends up helping someone. The documentation isn’t very explicit on how to output an XML declaration, for example.

How to create your XML from scratch and then output this XML into a string, with an XML declaration:

<?xml version="1.0" encoding="utf-8"?><rootnode version="1.0" type="example">
  <childnode/></rootnode>
using namespace rapidxml;

xml_document<> doc;

// xml declaration
xml_node<>* decl = doc.allocate_node(node_declaration);
decl->append_attribute(doc.allocate_attribute("version", "1.0"));
decl->append_attribute(doc.allocate_attribute("encoding", "utf-8"));
doc.append_node(decl);

// root node
xml_node<>* root = doc.allocate_node(node_element, "rootnode");
root->append_attribute(doc.allocate_attribute("version", "1.0"));
root->append_attribute(doc.allocate_attribute("type", "example"));
doc.append_node(root);

// child node
xml_node<>* child = doc.allocate_node(node_element, "childnode");
root->append_node(child);

std::string xml_as_string;// watch for name collisions here, print() is a very common function name!print(std::back_inserter(xml_as_string), doc);// xml_as_string now contains the XML in string form, indented// (in all its angle bracket glory)

std::string xml_no_indent;// print_no_indenting is the only flag that print() knows aboutprint(std::back_inserter(xml_as_string), doc, print_no_indenting);// xml_no_indent now contains non-indented XML

Parsing and traversing an XML document like this one:

<?xml version="1.0" encoding="utf-8"?><rootnode version="1.0" type="example">
  <childnode entry="1">
    <evendeepernode attr1="cat" attr2="dog"/>
    <evendeepernode attr1="lion" attr2="wolf"/>
  </childnode>
  <childnode entry="2">
  </childnode></rootnode>
void traverse_xml(std::string input_xml){
    // (input_xml contains the above XML)

    // make a safe-to-modify copy of input_xml
    // (you should never modify the contents of an std::string directly)
    vector<char> xml_copy(input_xml.begin(), input_xml.end());
    xml_copy.push_back('\0');

    // only use xml_copy from here on!
    xml_document<> doc;
    // we are choosing to parse the XML declaration
    // parse_no_data_nodes prevents RapidXML from using the somewhat surprising
    // behavior of having both values and data nodes, and having data nodes take
    // precedence over values when printing
    // >>> note that this will skip parsing of CDATA nodes <<<
    doc.parse<parse_declaration_node | parse_no_data_nodes>(&xml_copy[0]);

    // alternatively, use one of the two commented lines below to parse CDATA nodes, 
    // but please note the above caveat about surprising interactions between 
    // values and data nodes (also read http://www.ffuts.org/blog/a-rapidxml-gotcha/)
    // if you use one of these two declarations try to use data nodes exclusively and
    // avoid using value()
    //doc.parse<parse_declaration_node>(&xml_copy[0]); // just get the XML declaration
    //doc.parse<parse_full>(&xml_copy[0]); // parses everything (slowest)

    // since we have parsed the XML declaration, it is the first node
    // (otherwise the first node would be our root node)
    string encoding = doc.first_node()->first_attribute("encoding")->value();
    // encoding == "utf-8"

    // we didn't keep track of our previous traversal, so let's start again
    // we can match nodes by name, skipping the xml declaration entirely
    xml_node<>* cur_node = doc.first_node("rootnode");
    string rootnode_type = cur_node->first_attribute("type")->value();
    // rootnode_type == "example"

    // go straight to the first evendeepernode
    cur_node = cur_node->first_node("childnode")->first_node("evendeepernode");
    string attr2 = cur_node->first_attribute("attr2")->value();
    // attr2 == "dog"

    // and then to the second evendeepernode
    cur_node = cur_node->next_sibling("evendeepernode");
    attr2 = cur_node->first_attribute("attr2")->value();
    // now attr2 == "wolf"}
时间: 2024-10-02 10:26:25

Quick notes on how to use RapidXML的相关文章

学 Kotlin,看这一篇就够了

为什么学习Kotlin? 欢呼声热烈 谷歌宣布 Kotlin 成 Android 开发一级语言 Kotlin on Android. Now official 17 位谷歌 Android 开发专家是如何看待 Kotlin 的? 为什么你该摒弃 Java ,全面转向 Kotlin 语言? 为什么说Kotlin值得一试 如何学习Kotlin? 官网以及相关文档 Kotlin 官网 Kotlin 文档 Kotlin 博客 Kotlin 中文文档 Kotlin on GitHub Kotlin开发实践

IBM Notes 9 的新功能

Notes 9 将支持客户不断创造更高效的工作团队,从各个方面提供更加贴心便捷的用户体验.全新的主页设计,新增的 OneUI 主题,众多 Notes 邮件新功能,日历新功能等等,从界面到功能,无一不是新的惊喜.在下文中,我们将一一为你介绍 Notes 9 这些主要的新特性. 新的 Home 页面:Discover Page Notes 9 引入了全新的 Discover 页面来替换原有的 Get Start 页面.你可以从下面两张图片对他们的区别有一个直观的感受. 图 1. 新的 Discove

Git for Windows v2.8.3 Release Notes

Git for Windows v2.8.3 Release Notes Latest update: May 20th 2016 Introduction These release notes describe issues specific to the Git for Windows release. The release notes covering the history of the core git commands can be found in the Git projec

体验IBM Notes 9非常有用的新功能

其中嵌入式邮件体验可以让用户在 Notes 的环境里直接查看到与第三方 Open http://www.aliyun.com/zixun/aggregation/13666.html">Social 系统交互的信息,Notes Browser Plugin 使得用户可以通过在浏览器里打开和查看 Notes 数据库,而不必切换到 Notes 客户端了. Notes 9 将支持客户不断创造更高效的工作团队,从各个方面提供更加贴心便捷的用户体验.全新的主页设计,新增的 OneUI 主题,众多 N

(转) Quick Guide to Build a Recommendation Engine in Python

  本文转自:http://www.analyticsvidhya.com/blog/2016/06/quick-guide-build-recommendation-engine-python/   Introduction This could help you in building your first project! Be it a fresher or an experienced professional in data science, doing voluntary proj

Nutch 笔记(一):Quick Start

最近用到了nutch,目的是针对指定的一些网站抓取其内容,然后做分析用. nutch 笔记是我使用nutch过程一系列总结,写下自己的学习经过和大家一起分享,也希望能得到大家的指点 好了,废话少说,言归正传,第一篇:Quick Start,我们的目标是快速的能跑起来,能检索出我们想要的结果. 首先要明白nutch是什么? nutch是一个基于lucene的开源搜索引擎,它包括了所有你想要的东西,是一个完整的解决方案 . 一:安装JDK 如果你已经安装了JDK,并且已经设置了JAVA_HOME,那

ASP能否调用notes的数据

数据 试试吧 <% On error resume next Set session=CreateObject("Notes.NotesSession") Set db=session.GetDatabase("","test4.nsf") Set doc=db.CreateDocument doc.Form="Main" doc.Subject="subject" doc.Body="bo

解并实现 IBM Lotus Notes 的本地邮件副本

复制所提供的灵活性和自由性是使用 IBM Lotus Notes 的无与伦比的优点.许多组织选择在全天候的基础上利用这个功能强大的特性,并将其用户配置为使用 Notes 数据库(包括邮件数据库)的本地副本. 除了上述文章中所讨论的要点外,Lotus Notes/Domino 还添加了其它特性,从而使实现本地邮件副本更具吸引力.本文讨论了这些新增的增强功能,并推荐了一些设置本地邮件副本的方法.在解释本地副本模型和(在您的基础设施内建立此环境相关的)技术细节之前,让我们先来看一个模型的适用性示例.

Flex Quick Starts中文翻译(一)

中文 前言 Adobe  Flex  2.0 是一项新兴的技术,它基于强大的已经很成熟的 J2EE 平台,具有一些很强大并 且迷人的特性,比如 Flash 的表现能力,丰富的媒体和离线能力等等.Flex 2.0 虽然在前台表现为 Flash,却是更多地面向开发者(developer),而不是设计者(designer).你只需要编写代码就 可以使用各种控件做出很漂亮的东西,这是许多缺少艺术细胞的开发人员向往的事情.而且 Flex 除去了 Flash 中一些令很多人费解的东西,比如帧,元件等(我本人