C++ xml 解析器
C++的xml解析器有很多,这个知乎回答里有一个列表:https://www.zhihu.com/question/32046606
下面使用其中的RapidXml试试。
官方地址: https://link.zhihu.com/?target=http%3A//rapidxml.sourceforge.net/
Manual地址:http://rapidxml.sourceforge.net/manual.html
这里有个例子:https://www.cnblogs.com/lancidie/p/3304089.html
上面代码是在ubuntun下是编译不过的,我作了小的更改:
编译环境:Ubuntu 16.04 、 gcc version 5.4.0
下载了上面rapidxml 1.13版本,这个版本在此环境下,仍需要打一个补丁,其实就是在rapidxml_print.hpp开头加了以下几行声明,放在类内部开始即可。
template<class OutIt, class Ch> inline OutIt print_children(OutIt out, const xml_node<Ch> *node, int flags, int indent);
template<class OutIt, class Ch> inline OutIt print_element_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);
template<class OutIt, class Ch> inline OutIt print_data_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);
template<class OutIt, class Ch> inline OutIt print_cdata_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);
template<class OutIt, class Ch> inline OutIt print_declaration_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);
template<class OutIt, class Ch> inline OutIt print_comment_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);
template<class OutIt, class Ch> inline OutIt print_doctype_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);
template<class OutIt, class Ch> inline OutIt print_pi_node(OutIt out, const xml_node<Ch> *node, int flags, int indent);
整个代码如下:
#include "rapidxml/rapidxml.hpp"
#include "rapidxml/rapidxml_print.hpp"
#include "rapidxml/rapidxml_utils.hpp" #include <string>
#include <iostream>
#include <fstream> using namespace rapidxml;
using namespace std; void WriteXml1()
{
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",NULL);
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",""));
size->append_node(doc.allocate_node(node_element,"y",""));
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, ); std::cout<<text<<std::endl; std::ofstream out("config.xml");
out << doc;
} void WriteXml2()
{
xml_document<> doc; //是解析器
char a[] = "<top>"//如果单独传, 就不能加上xml的头部信息,
//否则会报错
"<name>tangqiang</name>"
"<age>22</age>"
"</top>";
char* p = a;
doc.parse<>(p); xml_node<>* node = doc.first_node();//去顶级结点
cout << (node->name())<< endl;
node = node->first_node();
while (node) {
cout << node->name() << node->value() << endl;//name() value()返回的字符串不会去掉首尾的空白字符
node = node->next_sibling();
} ofstream out("test.xml");//ofstream 默认时,如果文件存在则会覆盖原来的内容,不存在则会新建
out << doc;//doc 这样输出时在目标文件中不会有xml 头信息---<?xml version='1.0' encoding='utf-8' >
out.close();
} void ReadXml()
{
file<> fdoc("config.xml");
std::cout<<fdoc.data()<<std::endl;
xml_document<> doc;
doc.parse<>(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; //! 添加之后再次保存
//需要说明的是rapidxml明显有一个bug
//那就是append_node(doc.allocate_node(node_element,"h","0"));的时候并不考虑该对象是否存在!
xml_node<>* size = root->first_node("size");
size->append_node(doc.allocate_node(node_element,"w",""));
size->append_node(doc.allocate_node(node_element,"h","")); std::string text;
rapidxml::print(std::back_inserter(text),doc,); std::cout<<text<<std::endl; std::ofstream out("config.xml");
out << doc;
} void DeleteXml()
{
file<> fdoc("config.xml");
xml_document<> doc;
doc.parse<>(fdoc.data()); std::string text;
rapidxml::print(std::back_inserter(text), doc, );
std::cout<<text<<std::endl; xml_node<>* root = doc.first_node(); xml_node<>* sec = root->first_node(); root->remove_node(sec); //移除根节点下的sec结点(包括该结点下所有结点)
text="删除一个节点\r\n";
rapidxml::print(std::back_inserter(text), doc, );
std::cout<<text<<std::endl; root->remove_all_nodes(); //移除根节点下所有结点
text="删除所有节点\r\n";
rapidxml::print(std::back_inserter(text), doc, );
std::cout<<text<<std::endl; std::ofstream out("test.xml");
out<<doc;
} void EditXml()
{
file<> fdoc("config.xml");
std::cout<<fdoc.data()<<std::endl;
xml_document<> doc;
doc.parse<>(fdoc.data()); std::cout<<doc.name()<<std::endl; //! 获取根节点
xml_node<>* root = doc.first_node();
xml_node<>* delnode = root->first_node("color");
root->remove_node(delnode);//先删除address节点
//
xml_node<>* lnode = root->first_node("size");//找到post节点
xml_node<>* mynode=doc.allocate_node(node_element,"address","河北");
root->insert_node(lnode,mynode); std::string text;
rapidxml::print(std::back_inserter(text),doc,); std::cout<<text<<std::endl; std::ofstream out("version.xml");
out << doc;
} void TravelsalXml()
{
file<> fdoc("config.xml");
//std::cout<<fdoc.data()<<std::endl;
xml_document<> doc;
doc.parse<>(fdoc.data()); //std::cout<<doc.name()<<std::endl; //! 获取根节点
xml_node<>* root = doc.first_node(); for(rapidxml::xml_node<char> * node = root->first_node();
node != NULL;
node = node->next_sibling())
{
std::cout<<(node->name())<<" "<<(node->value())<<endl;
} std::cout<<"travesal from size node"<<std::endl;
for(rapidxml::xml_node<char> * node = root->first_node("size");
node != NULL;
node = node->next_sibling())
{
std::cout<<(node->name())<<" "<<(node->value())<<endl;
}
} void TravelsalAttrXml()
{
file<> fdoc("config.xml");
xml_document<> doc;
doc.parse<>(fdoc.data()); //! 获取根节点
xml_node<>* root = doc.first_node();
xml_node<>* subroot = root->first_node("mode"); for(rapidxml::xml_attribute<char> * attr = subroot->first_attribute("fullscreen");
attr != NULL;
attr = attr->next_attribute())
{
//char * value = attr->value(); cout<<(attr->name())<<" "<<(attr->value())<<endl;
}
} int main()
{
//WriteXml1();
//WriteXml2();
//ReadXml();
//DeleteXml();
//EditXml(); //TravelsalXml();
TravelsalAttrXml(); return ;
}
总结:以上代码演示了写XML、读XML、删除某一个节点、遍历所有的节点、遍历所有的属性。
RapidXml可以说,使用起来非常方便。
C++ xml 解析器的更多相关文章
- Duilib源码分析(三)XML解析器—CMarkup
上一节介绍了控件构造器CDialogBuilder,接下来将分析其XML解析器CMarkup: CMarkup:xml解析器,目前内置支持三种编码格式:UTF8.UNICODE.ASNI,默认为UTF ...
- tinyxml一个优秀的C++ XML解析器
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解 ...
- TinyXML:一个优秀的C++ XML解析器
//-------------------------------------------------------------------------------------------------- ...
- 转:TinyXM--优秀的C++ XML解析器
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解 ...
- XML解析器(转)
常见C/C++ XML解析器有tinyxml.XERCES.squashxml.xmlite.pugxml.libxml等等,这些解析器有些是支持多语言的,有些只是单纯C/C++的.如果你是第一次接触 ...
- XML 解析器
所有现代浏览器都内建了供读取和操作 XML 的 XML 解析器.解析器把 XML 转换为 XML DOM 对象 - 可通过 JavaScript 操作的对象. 解析 XML 文档为DOM对象 方法一: ...
- TinyXML:一个优秀的C++ XML解析器[转]
TinyXML:一个优秀的C++ XML解析器 读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似 ...
- Java XML解析器
使用Apache Xerces解析XML文档 一.技术概述 在用Java解析XML时候,一般都使用现成XML解析器来完成,自己编码解析是一件很棘手的问题,对程序员要求很高,一般也没有专业厂商或者开源组 ...
- Xml的转义字符--约束-xml解析器
XML解析器:Dom适合增删改查(crud),缺点就是内存消耗大: Sax:内存消耗非常小,解析速度快,但是不适合增删改:
- CDATA(不应由XML解析器进行解析的文本数据)、CDATA的使用场景
1.1. CDATA: CDATA(Unparsed Character Data)指的是不应由XML解析器进行解析的文本数据. 因为XML解析器会将“<”(新元素的开始)和“&”(字符 ...
随机推荐
- dedecms--在后台增加会员添加
最近在研究dedecms需要前台页面不允许会员注册,而会员帐号是管理员在后台添加的,首先我们得在后台的栏目选项中有会员添加这一栏目: 1:在dede/inc的文件夹下面找到inc_memu.php;找 ...
- MongoDB管理与监控
https://blog.csdn.net/Chen_Victor/article/details/74855050 https://www.cnblogs.com/zhangyinguang/p/5 ...
- AC日记——爱情之路 codevs 2070
2070 爱情之路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description yh非常想念他的女朋友小y,于是他 ...
- Database | SQL
Basic of MySQL 创建数据库: mysql> create database xxj; Query OK, row affected (0.00 sec) 列举数据库: mysql& ...
- 这道js面试题号称99%的人会做错
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 【jQuery】方法和选择器的双重使用详解
1.jQuery选择直接子节点+除了某个元素 1>方法 $(".begon").children(".row:not(.moreDetail)") 2&g ...
- iOS -- 设置label的自适应
- (void)AutoLabel { //准备工作 self.font = [UIFont systemFontOfSize:]; self.textColor = [UIColor whiteCo ...
- Please configure Spring facet or use 'Create Default Context' to add one including all unmapped files.
有时候我们刚进入 Intellij IDEA时会出现这样一个情况,原因是IDEA没有找到spring的配置文件,我们需要添加spring文件给idea管理 参考: 1.https://www.jetb ...
- OpenGL - Tessellation Shader 【转】
http://blog.sina.com.cn/s/blog_8c7d49f20102v4qm.html Patch is just an ordered list of vertices (在tes ...
- phonegap工程搭建基础(一)
官网:http://cordova.apache.org 一.环境配置 1. 安装Cordova on OS X and Linux: $ sudo npm install -g cord ...