pugixml XML格式处理库的介绍和使用(面向业务编程-格式处理)

介绍

pugixml是一个轻量级的C++ XML处理库。它的特点:

  • 类似dom的界面,具有丰富的遍历/修改功能

  • 非常快速的非验证XML解析器

  • 它从XML文件/缓冲区构造DOM树用于复杂数据驱动

  • 支持树查询的XPath 1.0

  • 实现Unicode接口变体和自动编码转换的完整Unicode支持

开源仓库地址:https://github.com/zeux/pugixml

XML格式介绍

有很多配置文件的格式也是XML格式的,而且有些GUI也可以依据XML规则去执行一些渲染。

  • 结构化强,适合UI表达:类似HTML、XAML也是基于XML的。总之XML是一种结构化很强的语言。
  • 程序处理解析简单:因为有较强的结构化,所以基本上程序解析起来比较简单,不容易出错。
  • 基本单元是标签:有一般标签和自闭合标签,并且可以给标签加各种属性。

注释:XML支持注释,学过HTML的就知道,注释格式如下

<!-- 这是一条注释 -->

以<!--开始,并以-->结束

使用方式

引入头文件

pugixml的使用很简单,只需要引入头文件,然后就可以开始用了

#include "pugixml.hpp"
using namespace pugi;

从XML文件中读取数据

准备XML文件(input.xml)内容如下

<platform>
<ip>192.168.1.2</ip>
<port>50000</port>
<key>keyvalue</key>
</platform>

读取XML文件解析数据

(main.cpp) 如下

int parseXMLfromFile() {
pugi::xml_document doc;
pugi::xml_parse_result result = doc.load_file("input.xml");
if(!result)
return -1;
cout << "parse result: " << endl;
xml_node root_node = doc.child("platform");
xml_node ip_node = root_node.child("ip");
xml_node port_node = root_node.child("port");
xml_node key_node = root_node.child("key");
cout << ip_node.text().as_string() << endl;
cout << port_node.text().as_int() << endl;
cout << key_node.text().as_string() << endl;
return 0;
}

我们可以用迭代器访问列表,如下

    for (auto node : doc.child("Document").children("Data")) {
#if STRING_TYPE
string item = node.text().as_string();
cout << item << endl;
#else
int out = node.text().as_int();
cout << out << endl;
#endif
}

XPath树访问

pugixml支持XPath 1.0,通过XPath可以快速对节点操作

XPath 是一门在 XML 文档中查找信息的语言,内容较为复杂,这里不展开讲了。有兴趣自行学习

int parseXMLUseXpathfromFile() {
// 正常读取解析,和上面一样
pugi::xml_document doc;
pugi::xml_parse_result result = doc.load_file("input.xml");
if(!result)
return -1;
//使用XPath访问
pugi::xpath_node key_node = doc.select_node("/platform/key");
cout << key_node.node().text().as_string() << endl;
return 0;
}

将数据录入xml文件

int saveXMLtoFile() {
pugi::xml_document doc;
pugi::xml_node node_dec = doc.prepend_child(pugi::node_declaration);
node_dec.append_attribute("version") = "1.0";
node_dec.append_attribute("encoding") = "utf-8";
pugi::xml_node node_comm = doc.append_child(pugi::node_comment);
node_comm.set_value("this is a comment");
pugi::xml_node root_node = doc.append_child("root");
pugi::xml_node sub_node = root_node.append_child("key");
// 添加一个属性
sub_node.append_attribute("attribute").set_value("attributeValue");
// 设置空标签内部值
sub_node.append_child(pugi::node_pcdata).set_value("keyValue");
doc.save_file("./output.xml");
return 0;
}

以库的形式添加到项目中

以第三方库的形式添加到项目中

本文为作者原创文章,转载请注明出处:https://www.cnblogs.com/nbtech/p/use_pugixml_library.html

首先我们下载pugixml源代码

mkdir UsePugixmlProject && cd UsePugixmlProject
git clone https://github.com/zeux/pugixml.git
vim CMakeLists.txt

CMakeLists.txt内容如下

# 下面3行是我们正常一个文件的CMake写法
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(pugixml-test LANGUAGES CXX)
add_executable(xml_test main.cpp)
# 添加pugixml库,1、包含头文件目录;2、添加库的源文件,声明这个库;3、将这个库链接到上面的目标文件中
include_directories(pugixml/src)
add_library(pugixml
STATIC
pugixml/src/pugixml.cpp
)
target_link_libraries(xml_test pugixml)

main.cpp文件就是我们上面小节的示例代码

// https://www.cnblogs.com/nbtech/p/use_pugixml_library.html
int main() {
return parseXMLfromFile();
}

写完之后创建目录并编译

mkdir build && cd build
cmake .. && make

在我们项目中,用CMake添加pugixml库操作如上

如果想改成共享库,只需要把CMakeLists.txt的STATIC改成SHARED即可

交叉编译?

有时候我们希望它可以跨平台,那么只需要在cmake配置的时候指定交叉编译工具即可

cmake -D CMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ ..

pugixml XML格式处理库的介绍和使用(面向业务编程-格式处理)的更多相关文章

  1. 前端常用的库和实用技术之JavaScript面向切面编程

    Aspect Oriented Programming(AOP)面向切面编程是一个比较热门的话题. AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程 中的某个步骤或阶段,以 ...

  2. Python常用的库简单介绍一下

    Python常用的库简单介绍一下fuzzywuzzy ,字符串模糊匹配. esmre ,正则表达式的加速器. colorama 主要用来给文本添加各种颜色,并且非常简单易用. Prettytable ...

  3. professional cuda c programming--CUDA库简单介绍

    CUDA Libraries简单介绍   上图是CUDA 库的位置.本文简要介绍cuSPARSE.cuBLAS.cuFFT和cuRAND.之后会介绍OpenACC. cuSPARSE线性代数库,主要针 ...

  4. Go语言标准库log介绍

    Go语言标准库log介绍 无论是软件开发的调试阶段还是软件上线之后的运行阶段,日志一直都是非常重要的一个环节,我们也应该养成在程序中记录日志的好习惯. log Go语言内置的log包实现了简单的日志服 ...

  5. BeautifulSoup解析库的介绍和使用

    ### BeautifulSoup解析库的介绍和使用 ### 三大选择器:节点选择器,方法选择器,CSS选择器 ### 使用建议:方法选择器 > CSS选择器 > 节点选择器 ## 测试文 ...

  6. C语言处理xml文件的库

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解 ...

  7. ArUco----一个微型现实增强库的介绍及视觉应用(二)

    ArUco----一个微型现实增强库的介绍及视觉应用(二) 一.第一个ArUco的视觉应用 首先介绍第一个视觉应用的Demo,这个应用场景比较简单,下面具体介绍: 1. 应用场景 主线程:通过摄像头检 ...

  8. ArUco----一个微型现实增强库的介绍及视觉应用(一)

    ArUco----一个微型现实增强库的介绍及视觉应用(一) 一.ArUco简介 ArUco是一个开源的微型的现实增强库,目前好像已经集成在OpenCV3.0以上的版本内了,它除了用于现实增强,还很用于 ...

  9. STL学习系列之一——标准模板库STL介绍

    库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每 ...

  10. c/c++ 标准库 pair 介绍

    标准库 pair 介绍 问题:map里的元素由key和value组成,这个key和value的组合是什么类型呢??? 答案:pair类型 pair介绍: 它是模板 有2个公有成员可供访问. first ...

随机推荐

  1. WDA学习(24):Context Menu使用

    1.17 UI Element:Context Menu使用 本实例测试创建Context Menu. 1.创建Component,View: V_CONTEXT_MENU; 2.创建Context节 ...

  2. Django 之 ORM2

    1. 多表操作 1.1 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者 ...

  3. Oracle 数据库升级过程中的主要步骤

    Oracle 数据库升级包括六个主要步骤. Oracle 数据库的升级步骤工作流 步骤 1:准备升级 Oracle 数据库 熟悉 Oracle 数据库新版本的特性. 确定新版本的升级路径. 选择升级方 ...

  4. Docker学习——Kubernetes(八)

    在线阅读:GitBook 下载:pdf Kubernetes 是 Google 团队发起并维护的基于 Docker 的开源容器集群管理系统,它不仅支持常见的云平台,而且支持内部数据中心. 建于 Doc ...

  5. c++基础代码练习考试必备(冒泡,求3*3矩阵对角线元素的积,求素数,密码验证)

    1.求1-100之间的素数 int j; int i; for (i=2; i <= 100; i++) { for (j=2; j <= i; j++) { if (i%j == 0) ...

  6. 训练题——OLED部分

    训练题OLED部分 实现目标 通过IIC通信控制OLED屏幕显示出一串字符串 名词介绍 OLED屏: OLED(Organic Light-Emitting Diode),又称为有机电激光显示.有机发 ...

  7. APP性能测试——冷启动耗时测试

    冷启动耗时: 即后台没有该应用的进程(我们使用am force-stop命令结束app运行),打开软件,直到进入到首页activity页面,并计算耗时. 示例代码: import os import ...

  8. Windows10 Docker报错 ERROR: Couldn't connect to Docker daemon - you might need to run `docker-machine start default`.

    问题描述:Windows10 家庭版 docker确认已启动,但是执行 docker-compose up -d 时报错,提示需启动docker: ERROR: Couldn't connect to ...

  9. 中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告4

    中国人民公安大学 Chinese people' public security university 网络对抗技术 实验报告   实验四 恶意代码技术     学生姓名 陈禹 年级 2018 区队 ...

  10. 笔记:map函数方法映射

    ------------恢复内容开始------------ map函数可以对后端接口返回一个数组 map存在一个参数时: map存在三个参数时: 语法: array.map(function(cur ...