Windows下用CMake编译PugiXML及配置测试

news2024/11/25 8:20:38

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

PugiXML是什么?

       PugiXML 是一个用于解析和操作 XML 文档的 C++ 库。它提供了简单易用的接口,能够高效地加载、解析和修改 XML 数据。PugiXML 的主要特点包括:

  1. 轻量级和高效性: PugiXML 被设计成一个轻量级的库,具有高效的性能。它采用了一种基于指针的数据结构,能够快速地解析和操作 XML 文档。

  2. 简单易用的接口: PugiXML 提供了简单易用的 API,使得 XML 文档的操作变得容易和直观。它采用了类似于 DOM(文档对象模型)的数据结构,允许用户通过节点、属性和文本内容来访问和修改 XML 文档的各个部分。

  3. 跨平台性: PugiXML 被设计成一个跨平台的库,可以在各种操作系统上运行,包括 Windows、Linux 和 macOS 等。

  4. 开源和免费: PugiXML 是一个开源项目,采用 MIT 许可证发布,可以免费用于商业和非商业项目。

       总的来说,PugiXML 是一个简单、高效且易于使用的 C++ XML 解析库,适用于各种类型的应用程序,包括游戏开发、图形界面程序、数据处理等领域。

下载与编译

       1)网站:https://pugixml.org/,下载PugiXML压缩包。

       2)解压后如下图所示,还需要用CMake进行编译。

CMake安装和配置参考:Windows下配置CMake(入门级教程,适合新人收藏学习)_window cmake-CSDN博客

       3)安装好CMake后,按Win+R打开运行,输入cmd打开命令运行窗,输入cmake-gui,中间无空格,会出现cmake界面。source输入PugiXML的文件路径,build可以在其路径下创建个build文件夹,如下图所示。勾选advanced。

       4)点击configure配置,我是vs2017 x64,点确定就开始运行了。

​       5)configure第一次后应该要进行一次配置。BUILD_SHARED_ILBS打钩,为了后面生成库;CMAKE_INSTALL_PREFIX设置生成库的路径,建议是在其目录下创建个bin文件。

​       6)然后再次点击configure,只要有红色就再点,等没有红色后点击generate,生成完毕后build文件如下所示。点击sln进入项目。

       7)进入build文件夹,点击sln项目工程文件;选中ALL_BUILD,选择release/debug,再点击生成ALL_BUILD,此时会进行一段时间的编译操作;再选中INSTALL,点击仅生成,等待结束去看之前设置的bin文件夹,分别是DLL、头文件和LIB。

       8)至此,PugiXML库的编译已经结束。

配置与测试

       1)编辑环境变量,输入bin文件路径。

​       2)创建一个VS项目,可以单项目配置也可以全局配置,我喜欢每个项目独立开,各配置各的,就这样演示了。在项目设置中,包含目录中放include路径,库目录放lib路径。

​       3)链接器-输入-附加依赖项-lib名字。

       4)接下来,开始测试,输入下方代码,看看VS有没有异常提示,如果没有就直接运行,就ok啦。

#include <algorithm>
#include <chrono>
#include <ctime>
#include <direct.h>
#include <functional>
#include <fstream>
#include <iostream>
#include <io.h>
#include <map>
#include <numeric>
#include <omp.h>
#include <random>
#include <regex>
#include <stdio.h>
#include <sstream>
#include <string>
#include <set>
#include <time.h>
#include <thread>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
#include <Windows.h>
#include <pugixml.hpp>

using namespace std;

// Structure to hold node data
struct NodeData {
	std::string name;
	std::unordered_map<std::string, std::string> attributes;
	std::vector<NodeData> children;
	std::string text;

	// 根据节点名获取子节点
	NodeData* getChildNode(const std::string& nodeName) 
	{
		for (auto& child : children) 
		{
			if (child.name == nodeName) 
			{
				return &child;
			}
		}
		return nullptr; // 未找到匹配的子节点
	}

};

// 递归函数,将XML节点转换为NodeData结构体
NodeData parseNode(const pugi::xml_node& xmlNode) 
{
	NodeData nodeData;

	// 提取节点名称
	nodeData.name = xmlNode.name();

	// 提取节点属性
	for (const auto& attr : xmlNode.attributes()) 
	{
		nodeData.attributes[attr.name()] = attr.value();
	}

	// 提取节点文本
	nodeData.text = xmlNode.text().get();

	// 递归处理子节点
	for (const auto& child : xmlNode.children()) 
	{
		nodeData.children.push_back(parseNode(child));
	}

	return nodeData;
}


// 显示
void displayNodeData(const NodeData& node, int depth = 0)
{
	// Display current node
	cout << string(depth * 4, ' ') << "Name: " << node.name << endl;
	cout << string(depth * 4, ' ') << "Attributes:" << endl;
	for (const auto& attr : node.attributes)
	{
		cout << string(depth * 4, ' ') << "  " << attr.first << " : " << attr.second << endl;
	}
	if (!node.text.empty())
	{
		cout << string(depth * 4, ' ') << "Text: " << node.text << endl;
	}

	// Display child nodes recursively
	for (const auto& child : node.children)
	{
		displayNodeData(child, depth + 1);
	}
}

int main()
{
	pugi::xml_document doc;
	pugi::xml_parse_result result = doc.load_file("test.xml");
	if (!result)
	{
		std::cerr << "Error: " << result.description() << std::endl;
		return 1;
	}
	// 将根节点转换为结构体
	NodeData rootNode = parseNode(doc.root());

	// 显示
	displayNodeData(rootNode);

	cout << "end." << endl;
	return 0;
}
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <person>
        <name>John Doe</name>
        <age>30</age>
        <city>New York</city>
    </person>
    <person>
        <name>Jane Smith</name>
        <age>25</age>
        <city>Los Angeles</city>
    </person>
</root>

已编译好的库

百度云地址:

链接:https://pan.baidu.com/s/14i8kCZqig7ki77d8PHLUjg 
提取码:cz0q 

       PugiXML是我用着比较舒服的库,特此推荐给大家,TinyXML也不错,可惜不支持utf-16。

TinyXML教程:

Windows下编译TinyXML(XML文件解析)-CSDN博客

       以上就是“Windows下用CMake编译PugiXML及配置测试”的过程。 

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

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

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

相关文章

Spring IoCDI(2)

IoC详解 通过上面的案例, 我们已经知道了IoC和DI的基本操作, 接下来我们来系统地学习Spring IoC和DI的操作. 前面我们提到的IoC控制反转, 就是将对象的控制权交给Spring的IoC容器, 由IoC容器创建及管理对象. (也就是Bean的存储). Bean的存储 我们之前只讲到了Component注解…

C 练习实例97 - 读磁盘 写磁盘

题目&#xff1a;从键盘输入一些字符&#xff0c;逐个把它们送到磁盘上去&#xff0c;直到输入一个‘#’为止 在桌面新建一个hello.txt文件&#xff0c;内容示例&#xff1a; 代码&#xff1a; #include <stdio.h> #include <stdlib.h>int main() {FILE *fp; //文…

PetaLinux 去除自动获取 IP 地址

问题&#xff1a;系统启动的时候会自动检测 IP 地址&#xff0c;如不需要这个功能&#xff08;该过程需耗时十几秒&#xff09;。可以自定义 IP 地址&#xff0c;去掉这一步。 操作步骤如下&#xff1a; 所有命令均需在非管理员模式下执行 1. 初始化 PetaLinux 运行环境 运行…

新手学python还是c?

考虑到个人情况和职业规划是非常重要的。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在后台发给你。 Python作为初学者入门语言…

isaacgym 渲染黑屏

问题描述&#xff1a; isaacgym安装完IsaacGym_Preview_4_Package.tar.gz之后&#xff0c;运行python joint_monkey.py没有任何内容现实&#xff0c;但是终端还是正常输出信息。 环境是ubuntu22服务器&#xff0c;python3.8&#xff0c;nvidia Driver Version: 515.65.01 CUDA…

IP代理池赋能Python网络爬虫

文章目录 什么是IP代理池代理服务器IP代理池的作用IP代理池的构建IP代理池的管理 相关案例IP代理在爬虫中的运用IP代理在数据收集中的运用IP代理在反爬虫中的运用 结语 什么是IP代理池 IP代理池是一个存储了多个可用代理IP地址的资源池&#xff0c;用于在网络爬虫、数据采集、…

【实战项目】某考务成绩查询小程序

熊猫开发记录 – QQ&#xff1a;1040375575 【实战项目】某考务成绩查询小程序 一、项目功能二、项目涉及三、部分代码四、程序实现 一、项目功能 实现通过身份证号、手机号、手机验证码三层进行后台成绩获取&#xff0c;并输出提示。 二、项目涉及 项目涉及前端开发&#x…

B树,红黑树,LR,RL

红黑树来源于多叉树–>234树4阶B树 红黑树&#xff1a;每个节点不是红色就是黑色&#xff0c;根节点一定是黑色&#xff0c;叶子节点是黑色的&#xff0c;一个红色节点的子节点一定是黑色的&#xff0c;从根节点到根节点都会经过相同数量的黑色节点&#xff0c;从根节点到任…

RK3568 学习笔记 : 独立修改与编译 u-boot

前言 开发板&#xff1a;【正点原子】ATomPi-CA1 开发板&#xff0c;配置&#xff1a;RK3568&#xff0c;4GB DDRAM 64GB emmc 开发板资料给了 u-boot 与 Linux kernel 源码&#xff0c;尝试手动编译。 本篇记录 收到编译 RK3568 平台 u-boot 的方法 环境搭建 由于 RK 平台…

“探秘数据结构:栈的奇妙魔力“

每日一言 兰有秀兮菊有芳&#xff0c;怀佳人兮不能忘。 —刘彻- 栈 栈的概念及结构 栈(Stack) &#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守…

软件资源分享六:EPLAN Electric P8 2024 | Eplan 2024 中文版软件介绍+保姆级安装教程

原文链接&#xff1a;安装激活教程 EPLAN Electric P8 2024 | Eplan 2024 中文版软件介绍安装教程 EPLAN 2024是一款电气设计软件&#xff0c;它可以用于自动化系统的设计、文档编制和维护。EPLAN可以对电气设计的各个方面进行完整的支持&#xff0c;包括电气控制系统、机械设…

全栈的自我修养 ———— redux入门(看这么一篇就够了!!!)

redux时react中负责状态管理的工具 一、下载二、配置1、目录2、store配置3、redux中index.js配置4、启动类中index.js配置 三、使用1、调用store的数据2、调用store里面的方法3、改变store里面的值 一、下载 npm I reduxjs/toolkit react-redux二、配置 1、目录 modules里面…

Pygame基础9-射击

简介 玩家用鼠标控制飞机&#xff08;白色方块&#xff09;移动&#xff0c;按下鼠标后&#xff0c;玩家所在位置出现子弹&#xff0c;子弹匀速向右飞行。 代码 没有什么新的东西&#xff0c;使用两个精灵类表示玩家和子弹。 有一个细节需要注意&#xff0c;当子弹飞出屏幕…

6、Cocos Creator 2D 渲染组件:​Sprite 组件​

Sprite 组件 Sprite&#xff08;精灵&#xff09;是 2D/3D 游戏最常见的显示图像的方式&#xff0c;在节点上添加 Sprite 组件&#xff0c;就可以在场景中显示项目资源中的图片。 属性功能说明Type渲染模式&#xff0c;包括普通&#xff08;Simple&#xff09;、九宫格&#x…

【云呐】公司资产怎么盘点,如何做好资产盘点?

固定资产盘点是一个复杂的过程&#xff0c;需要充分的计划、准备和组织。确保盘点团队具备足够的专业知识和技能&#xff0c;并与相关部门和人员进行充分的沟通和协作。  盘点公司的固定资产是确保资产准确性并管理资产风险的重要过程。下面是一般性的指导步骤&#xff0c;供…

Outlook邮箱后缀是什么?如何改邮箱后缀?

Outlook邮箱后缀可以更改吗&#xff1f;微软有哪些后缀的邮箱&#xff1f; 对于许多刚接触Outlook邮箱的新手来说&#xff0c;了解Outlook邮箱后缀是必不可少的一步。那么&#xff0c;Outlook邮箱后缀究竟是什么呢&#xff1f;接下来&#xff0c;AokSend就来详细探讨一下这个问…

element-ui badge 组件源码分享

今日简单分享 badge 组件的源码实现&#xff0c;主要从以下两个方面&#xff1a; 1、badge 组件页面结构 2、badge 组件属性 一、badge 组件页面结构 二、badge 组件属性 补充几个标签的用途&#xff1a; sub&#xff1a;下标、sup&#xff1a;上标、var 变量 代码如下&am…

YPay源支付V7开源版

YPay_V7版本即将停止维护更新&#xff0c;同时我们将开放最新版开源代码供学习和参考。虽然首批阶段的【function_8.1.php文件是加密的】&#xff0c;但授权已经除去&#xff0c;该代码将在新版YPay上线时开放给大家。我们也会定期进行迭代更新&#xff0c;随后将创建对应仓库&…

算法系列--动态规划--背包问题(2)--01背包拓展题目

&#x1f495;"2024.3.28小米汽车发布"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–动态规划–背包问题(2)–01背包拓展题目 大家好,今天为大家带来的是算法系列--动态规划--背包问题(2)--01背包拓展题目 1.分割等和⼦集 链接: https:/…

风险与收益

风险与收益 影响资产需求的主要因素财富总量预期收益率资产的流动性影响流动性的主要因素 风险 如何降低风险系统风险和非系统风险机会集合与有效集合资产组合理论 影响资产需求的主要因素 影响资产需求的主要因素包括&#xff1a;财富总量、预期收益率、资产的流动性和风险。…