使用Pugixml库,轻松处理XML文件

news2024/11/24 16:02:03

文章作者:里海
来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客


目录

1.介绍

2.Pugixml库

3.配置Visual Studio开发环境

4.节点

5.常见的节点类型

6.命名空间pugi  

7.xml_document装载整个XML文档结构

 8.xml_node文档节点

 9.xml_attribute 属性

10.例子

1.生成xml文件

2.读xml文件并解析

3.修改xml文件


1.介绍

        Pugixml是轻量级、简单、快速的 XML 解析器。Pugixml库仅由pugixml.cpp、pugixml.hpp和pugiconfig.hpp三个文件组成,非常容易使用。解析速度快,支持XPath表达式。

2.Pugixml库

        官网下载地址::pugixml.org - Home

        

3.配置Visual Studio开发环境

1. 创建项目并将“src"目录设置到“附加包含目录”:

2. 添加文件

3. 代码中包含头文件pugiconfig.hpp和pugixml.hpp头文件

#include <Windows.h>  
#include <iostream>  
#include <string>  
#include <pugiconfig.hpp> //包含头文件  
#include <pugixml.hpp>   //包含头文件
int main()
{
    
  
    std::cin.get();
    return 0;
}

4.节点

       树的根是文档本身,对应于C++类型 xml_document 。文档子节点,对应于C++类型 xml_node 。节点有不同的类型,对应于C++类型的 xml_attribute

5.常见的节点类型

  1. 文档节点 ( node_document ) - 这是树的根,由多个子节点组成。此节点对应于 xml_document 类;请注意,它是 xml_document 的 xml_node 子类,因此整个节点接口也可用。
  2. 元素/标记节点 ( node_element ) - 这是最常见的节点类型,表示 XML 元素。元素节点具有名称、属性集合和子节点集合(两者都可能为空)。该属性是一个简单的名称/值对。
  3. 纯字符数据节点 ( node_pcdata ) 表示 XML 中的纯文本。PCDATA 节点具有值,但没有名称或子节点/属性。请注意,纯字符数据不是元素节点的一部分,而是具有自己的节点;例如,一个元素节点可以有多个子 PCDATA 节点。

6.命名空间pugi  

        所有 pugixml 类和函数都位于命名空间中 pugi ;您必须使用显式名称限定(即 pugi::xml_node ),或者通过指令(即 using pugi::xml_node; 或 using namespace pugi; )访问 using 相关符号。

7.xml_document装载整个XML文档结构

        xml_document 是整个文档结构的所有者;销毁文档会销毁整棵树。的 xml_document 界面由加载功能、保存功能和整个 xml_node 界面组成,允许进行文档检查和/或修改。

 8.xml_node文档节点

        xml_node 是文档节点的句柄;它可以指向文档中的任何节点,包括文档本身。所有类型的节点都有一个通用接口。请注意,这只是 xml_node 实际节点的句柄,而不是节点本身 - 您可以有多个 xml_node 句柄指向同一基础对象。销毁 xml_node 句柄不会破坏节点,也不会将其从树中删除。

        xml_node 有一个特殊的类型值,称为空节点或空节点。它不对应于任何文档中的任何节点,因此类似于空指针。但是,所有操作都是在空节点上定义的;通常,操作不执行任何操作,并返回空节点/属性或空字符串作为其结果。这对于链接调用很有用;即,您可以像这样获取节点的祖父级: node.parent().parent() ;如果节点是空节点或没有父节点,则第一次 parent() 调用返回空节点;然后,第二次 parent() 调用也会返回 null 节点,因此您不必两次检查错误。可以通过隐式布尔转换来测试句柄是否为 null: if (node) { …​ } 或 if (!node) { …​ } 。

 9.xml_attribute 属性

        xml_attribute 是 XML 属性的句柄;它具有与 相同的 xml_node 语义,即可以有多个 xml_attribute 句柄指向相同的底层对象,并且有一个特殊的 null 属性值,该值传播到函数结果。

10.例子

例1.生成xml文件

#include <Windows.h>  
#include <iostream>
#include <fstream>  
#include <string>  
#include <pugiconfig.hpp> //包含头文件  
#include <pugixml.hpp>   //包含头文件

using namespace std;
using namespace pugi;

int main()
{
	// 创建一个XML文档对象  
	xml_document doc;

	// 添加根节点  
	xml_node root = doc.append_child("fruits");

	// 添加子节点  
	xml_node apple = root.append_child("fruit");
	apple.append_attribute("name").set_value("苹果");
	apple.append_attribute("color").set_value("红色");
	apple.append_attribute("taste").set_value("甜");

	xml_node banana = root.append_child("fruit");
	banana.append_attribute("name").set_value("香蕉");
	banana.append_attribute("color").set_value("黄色");
	banana.append_attribute("taste").set_value("甜");

	// 将XML内容写入文件  
	ofstream file("fruits.xml");
	doc.save(file);
	file.close();

	std::cin.get();
	return 0;
}

例2.读xml文件并解析

#include <Windows.h>  
#include <iostream>
#include <fstream>  
#include <string>  
#include <pugiconfig.hpp> //包含头文件  
#include <pugixml.hpp>   //包含头文件

using namespace std;
using namespace pugi;

int main()
{
	// 打开XML文件  
	ifstream file("fruits.xml");

	// 加载XML文档  
	xml_document doc;
	doc.load(file);

	// 获取根节点  
	xml_node root = doc.child("fruits");

	// 遍历子节点  
	for (xml_node fruit = root.first_child(); fruit; fruit = fruit.next_sibling()) {
		// 获取属性值  
		string name = fruit.attribute("name").as_string();
		string color = fruit.attribute("color").as_string();
		string taste = fruit.attribute("taste").as_string();

		// 输出属性值  
		cout << "Name: " << name << endl;
		cout << "Color: " << color << endl;
		cout << "Taste: " << taste << endl;
	}

	std::cin.get();
	return 0;
}

例3.修改xml文件

目的:将苹果修改为青色、不甜

#include <Windows.h>  
#include <iostream>
#include <fstream>  
#include <string>  
#include <pugiconfig.hpp> //包含头文件  
#include <pugixml.hpp>   //包含头文件

using namespace std;
using namespace pugi;

int main()
{
    // 打开XML文件  
    ifstream file("fruits.xml");

    // 加载XML文档  
    xml_document doc;
    doc.load(file);

    // 获取根节点  
    xml_node root = doc.child("fruits");

    // 遍历子节点  
    for (xml_node fruit = root.first_child(); fruit; fruit = fruit.next_sibling()) {
        // 获取属性值  
        string name = fruit.attribute("name").as_string();

        // 如果该子节点表示的是苹果  
        if (name == "苹果") {
            // 修改属性值  
            fruit.attribute("color").set_value("青色");
            fruit.attribute("taste").set_value("不甜");
            break; // 只修改第一个匹配的节点,退出循环  
        }
    }

    // 将修改后的XML内容写入文件  
    ofstream outfile("fruits.xml");
    doc.save(outfile);
    outfile.close();

	std::cin.get();
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1033932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WeCanStudio工具套件介绍

直接上视频,在超燃的《天马座幻想》的背景音乐下&#xff0c;再次了解一下该工具套件吧。 WeCanStudio开发套件介绍

setrlimit限制进程的cpu使用时间

linux可以用setrlimit进行资源限制&#xff0c;今天说的是setrlimit限制进程的cpu使用时间 代码如下&#xff1a; #include <sys/time.h> #include <sys/resource.h> #include <unistd.h>int main() {struct rlimit rlim;rlim.rlim_cur 10;rlim.rlim_max …

星际争霸之小霸王之小蜜蜂(十四)--资本家的眼泪

系列文章目录 星际争霸之小霸王之小蜜蜂&#xff08;十三&#xff09;--接着奏乐接着舞 星际争霸之小霸王之小蜜蜂&#xff08;十二&#xff09;--猫有九条命 星际争霸之小霸王之小蜜蜂&#xff08;十一&#xff09;--杀杀杀 星际争霸之小霸王之小蜜蜂&#xff08;十&#xf…

stm32无人机-飞行力学原理

惯性导航&#xff0c;是一种无源导航&#xff0c;不需要向外部辐射或接收信号源&#xff0c;就能自主进行确定自己在什么地方的一种导航方法。 惯性导航主要由惯性器件计算实现&#xff0c;惯性器件包括陀螺仪和加速度计。一般来说&#xff0c;惯性器件与导航物体固连&#xf…

阿里云2核2G服务器e系列租用优惠价格182元性能测评

阿里云服务器经济型e实例2核2G配置优惠价格182.04元一年&#xff0c;系统盘ESSD Entry盘20GB起&#xff0c;公网带宽默认按使用流量&#xff0c;也可以选择按固定带宽计费&#xff0c;带宽值从1M到100M可选&#xff0c;阿腾云分享阿里云服务器2核2G优惠价格、详细配置及e系列CP…

异常记录-VS

1.文件加载失败 无法找到指定路径 Frame GUID: a6c744a8-0e4a-4fc6- 886a-064283054674 Frame mode: VSFM_ MdiChild Error code: 0x80131515 未理会这个提示&#xff0c;可以打开运行项目&#xff0c;只是会跳出这个弹窗。 无法关闭这个异常的窗口。

CorelDraw是什么软件?好用吗

很多人都听过CorelDraw的名字&#xff0c;但不知道CorelDraw是什么样的软件。下面就让小编为大家详细介绍一下。 coreldraw是什么软件 CorelDraw是一款专业的图形设计软件。它的主要功能包括矢量图形和位图的编辑。用户可以利用其矢量图形编辑能力,设计各种图标、Logo等精细图…

《算法竞赛·快冲300题》每日一题:“矩阵”

《算法竞赛快冲300题》将于2024年出版&#xff0c;是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码&#xff0c;以中低档题为主&#xff0c;适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 质…

每日已开源的AI论文分享【2023920期】

目录 前言 3D语义场景补全 视频修复 3D人脸重建 视频线条检测 3D物体重建 尾言 前言 作者介绍&#xff1a;作者本人是一名人工智能炼丹师&#xff0c;目前在实验室主要研究的方向为生成式模型&#xff0c;对其它方向也略有了解&#xff0c;希望能够在CSDN这个平台上与同…

【TypeScript】类、类的属性及抽象类(七)

【TypeScript】类、类的属性及抽象类&#xff08;七&#xff09; 【TypeScript】类、类的属性及抽象类&#xff08;七&#xff09;一、前言二、语法及属性定义三、类的继承四、属性类型五、readonly修饰符六、static 静态属性七、存取器-get/set八、抽象类 一、前言 传统的Jav…

定制SQLmap和WAF绕过

1. SQLmap tamper 脚本编写 以sqli-lab第26关为例 输入?id1’ --&#xff0c;报错字符型注入 考虑闭合问题&#xff0c;输入?id1’ and 1&#xff0c;但是回显中and和空格消失了&#xff0c;可知and和空格被过滤了 因为and和or被过滤考虑使用双写绕过手段&#xff0c;空格使…

2023华为杯数学建模D题第三问——区域双碳目标情景设计样例

在第二问建立好预测模型的基础上&#xff0c;如何设计第三问所说的区域双碳路径&#xff0c;以对宏观政策进行指导&#xff01; 采用STIRPA的基本模型对中国碳达峰时间进行预测&#xff0c;对该模型公式两边取对数得到&#xff1a; 其中&#xff1a;P为人口&#xff0c;A为GDP…

NIO圣经:一次穿透NIO、Selector、Epoll底层原理

此pdf电子书&#xff0c;是尼恩架构团队持续升级、持续迭代的作品。 目标是&#xff0c;通过不断升级、持续迭代&#xff0c;为大家构筑一个超底层、超强悍的高性能技术内功。 原 &#xff1a;《九阳真经&#xff1a;彻底明白操作系统 select、epoll 核心原理》 改&#xff1…

2023年研赛华为杯选题人数发布

选题人数发布&#xff01;经过长达30个小时&#xff0c;各个平台的相关选题投票、相关文章阅读量等各项数据进行统计&#xff0c;利用之前的评估办法&#xff08;详见注释&#xff09;。在开赛后30小时&#xff0c;我们基本确定各个赛题选题人数&#xff0c;大致为 题号选题人数…

时间轮算法

思考 假如现在有个任务需要3s后执行&#xff0c;你会如何实现&#xff1f; 线程实现&#xff1a;让线程休眠3s 如果存在大量任务时&#xff0c;每个任务都需要一个单独的线程&#xff0c;那这个方案的消耗是极其巨大的&#xff0c;那么如何实现高效的调度呢&#xff1f; 时…

兰贡生物:打造生物医药研发“独角兽”

当我们站在医学科学的最前沿&#xff0c;探索着无尽的健康奥秘时&#xff0c;生物制药行业正经历着前所未有的变革和机遇。新的疾病不断涌现&#xff0c;现有的治疗方法也在不断演进&#xff0c;这需要有着创新精神和科学追求的企业来推动新药研发的进程。值此时代背景下&#…

网络安全—黑客技术—自学笔记

目录梗概 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来…

Linux常用命令—find命令大全

文章目录 一、find命令常用功能1、find命令的基本信息如下。2、按照文件名搜索3、按照文件大小搜索4、按照修改时间搜索5、按照权限搜索举例&#xff1a;6、按照所有者和所属组搜索7、按照文件类型搜索8、逻辑运算符 一、find命令常用功能 1、find命令的基本信息如下。 命令名…

力扣213打家劫舍2(简单动态规划)

题目描述&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 &#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋装有相互连通的防盗系统&#xff0c;如…

1790_给通过USB连接到树莓派的NTFS硬盘设置固定的挂载名称

全部学习汇总&#xff1a; GreyZhang/little_bits_of_raspberry_pi: my hacking trip about raspberry pi. (github.com) 我用过好几个树莓派形式的单板电脑&#xff0c;但是遇到过磁盘挂载位置不确定的时候。有些甚至不会自动挂载。这些行为跟对应的OS的行为是相关的&#xff…