Windows下编译TinyXML(XML文件解析)

news2024/11/26 12:28:01

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

TinyXML是什么?

       TinyXML是一个轻量级的C++ XML解析器,它提供了一种简单的方法来解析和操作XML文档。TinyXML被设计为易于使用和集成到C++项目中,并且非常适合处理小型XML文件。

       以下是TinyXML的一些主要特点和优点:

  1. 轻量级: TinyXML的设计目标之一是保持代码库的小巧简洁,因此它非常适合用于嵌入式系统或具有资源限制的环境。

  2. 简单易用: TinyXML提供了简单直观的API,使得解析和操作XML文档变得容易。它的API设计使得开发人员可以快速上手并完成XML处理任务。

  3. 跨平台性: TinyXML是跨平台的,可以在各种操作系统上运行,包括Windows、Linux和Mac OS等。

  4. 开源: TinyXML是开源的,可以在许可证允许的情况下免费使用和修改。

  5. 支持XML解析和生成: TinyXML支持解析XML文档,并且可以将XML数据写入到文件或内存中。

  6. 适用于小型XML文件: 尽管TinyXML可以解析和处理XML文件,但它更适用于处理小型XML文件,因为它的设计目标之一是保持简洁和高效。

       虽然TinyXML功能不如一些更复杂的XML库,但它的简单性和轻量级使得它成为处理小型XML任务的良好选择。

下载与编译

       1)网站:TinyXML download | SourceForge.net,下载TinyXML压缩包。

我下载了一版,百度云地址:

链接:https://pan.baidu.com/s/1ZF1GPuFiv_BJK8RIsmVMgw 
提取码:dvfe 

       2)把这六个文件拿出来就可以用了。两个h,四个cpp。

       3)按我的习惯,我调用第三方库喜欢用动态库或静态库而不是源码,如果你不需要编译库,就不用往下看了。压缩包里提供了sln项目文件,打开可以编译,但是我试了一下发现只能编译32位。因此,打开VS重新创建一个空项目TinyXML。把那几个文件拖过来,并在项目中添加现有项。

       4)项目属性,改为lib,编译静态库。

​       5)点击生成解决方案,提示成功即可。

​       6)创建一个文件夹,把头文件和lib放进去,库就编译好了。

配置与测试

​       1)配置头文件路径。

​       2)配置lib路径。

​​       3)链接lib。

​​       4)测试代码+测试xml文件(自己创建一个xml就可以了)+测试效果。

#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 <tinyxml.h>

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;
};

// Function to parse attributes from an XML node
std::unordered_map<std::string, std::string> parseAttributes(const TiXmlElement* theNode) {
	std::unordered_map<std::string, std::string> attributes;

	const TiXmlAttribute* attribute = theNode->FirstAttribute();
	while (attribute) 
    {
		std::string attrName = attribute->Name();
		std::string attrValue = attribute->Value();
		attributes[attrName] = attrValue;
		attribute = attribute->Next();
	}

	return attributes;
}

// Function to parse child nodes
void parseChildNodes(const TiXmlNode* theNode, NodeData& nodeData) {
	if (!theNode->FirstChild()) // Check if the node has child nodes
		return;

	const TiXmlNode* child = theNode->FirstChild();
	while (child) 
    {
		if (child->Type() == TiXmlNode::TINYXML_ELEMENT) 
        {
			const TiXmlElement* element = child->ToElement();
			NodeData childNodeData;
			childNodeData.name = element->Value();
			childNodeData.attributes = parseAttributes(element);
			parseChildNodes(child, childNodeData);
			nodeData.children.push_back(childNodeData);
		}
		else if (child->Type() == TiXmlNode::TINYXML_TEXT) 
        {
			const char* text = child->ToText()->Value();
			if (text) 
            {
				std::string textContent = text;
				textContent.erase(textContent.find_last_not_of(" \n\r\t") + 1); // Trim trailing whitespaces
				if (!textContent.empty()) 
                {
					nodeData.text = textContent;
				}
			}
		}
		child = child->NextSibling();
	}
}

// Function to display node data recursively
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()
{
	TiXmlDocument doc("test.xml");
	if (!doc.LoadFile()) 
    {
		std::cerr << "Failed to load XML file!" << std::endl;
		return 1;
	}

	const TiXmlElement* root = doc.RootElement();
	if (!root) 
    {
		std::cerr << "Root element not found!" << std::endl;
		return 1;
	}

	// Create structure to hold root node data
	NodeData rootNodeData;
	rootNodeData.name = root->Value();
	rootNodeData.attributes = parseAttributes(root);

	// Parse child nodes
	parseChildNodes(root, rootNodeData);

	// Display all node data
	displayNodeData(rootNodeData);

	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>

       以上就是“Windows下编译TinyXML(XML文件解析)”的过程。 

       TinyXML挺好用的,不过有个缺陷就是不支持utf-16格式的XML解析,所以我最后选用了pugixml。

PugiXML教程:

Windows下用CMake编译PugiXML及配置测试-CSDN博客

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

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

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

相关文章

深入解析实时数仓Doris:Rollup上卷表与查询

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 一、基本概念二、Aggregate 和 Unique 模型中的 ROLLUP三、Duplicate 模型中的 ROLLUP四、ROLLUP 调整前缀索引五、ROLLUP使…

图解·Linux系统安装,手把手教你搞定操作系统!

这里博主使用了 VMware Workstation 16 Pro 版本&#xff08;不同版本可能略有差别&#xff09;从头到尾用图文搭配的模式给大家演示如何进行 Linux系统 的安装&#xff01;内容十分详尽&#xff0c;细节基本也到位了&#xff0c;可以说是保姆级教学了&#xff0c;希望对大家有…

工业数学模型——钢坯力学性能预测(二)

1、工业场景 无论使用什么样的钢材&#xff0c;其机械性能都非常重要&#xff0c;主要性能通常是屈服强度和抗拉强度、延伸率和断面收缩率。力学性能可以通过试验室试验评估&#xff0c;使用钢材成品试样在类似的轧制条件下进行拉力试验。本文旨在利用数学模型构建了一种基于工…

生活篇——关于分期贷或信用贷的等额本息、先息后本、月利率、年利率、年利率单利的个人理解

首先我先就年利率的理解问一下各位读者2个问题。 问题1&#xff1a;假设你要借100000元&#xff0c;借一年&#xff0c;月利息0.2%&#xff0c;等额本息&#xff0c;那么你觉得你总共需要还多少利息&#xff1f;它的实际年利率约为多少&#xff1f; A.2400&#xff0c;2.4% …

智能资产管理:RFID技术与国产WMS系统的融合之路

随着信息技术的飞速发展&#xff0c;企业对于资产管理的需求也日益增长。传统的资产管理方法已无法满足现代企业的管理需求&#xff0c;因此&#xff0c;一种结合了RFID技术与国产WMS系统的智能资产管理方案应运而生。 RFID&#xff0c;即无线射频识别技术&#xff0c;通过无…

断裂重生:记忆是如何形成的

当形成长期记忆时&#xff0c;一些脑细胞会经历强烈的电活动&#xff0c;以至于使其DNA断裂。3月27日&#xff0c;一项发表于《自然》的小鼠研究表明&#xff0c;炎症反应开始起作用&#xff0c;修复这种损伤并帮助巩固记忆。 神经元在记忆形成过程中修复断裂的DNA。图片来源…

(4)(4.5) Underwater Sonar (Analog)

文章目录 前言 1 推荐硬件 2 连接和配置 3 参数说明 前言 本页详细介绍了低成本模拟水下声纳&#xff08;又称"探鱼器"&#xff09;和数字转换器的设置&#xff0c;数字转换器可将模拟读数转换成 NMEA 0183&#xff0c;供 ardupilot 读取。这种设置可以测量船下…

如何在CentOS安装StackEdit Markdown编辑器并实现无公网IP远程访问使用

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安…

CODESYS开发教程14-指针使用

在写完《长字符串处理》以后&#xff0c;好长时间也没想到写什么内容好&#xff0c;前几天发现好像没有介绍过指针&#xff0c;那么今天我们的教程重点是介绍CODESYS中指针的使用。指针可以说算是C语言的精髓之一&#xff0c;有很多的优点和方便之处&#xff0c;但是同时也是个…

普通Java工程可执行JAR两种打包方式探讨

文章目录 一、需求概述二、代码结构三、运行结果四、打包设置1. 一体化可执行包2. 带外部依赖lib的可执行包 五、打包运行1. 源码放送2. 打包执行3. 打包结果 一、需求概述 普通Java工程 docker-show 实现了定时打印docker应用信息&#xff0c;现在需要将其打包成可执行Jar部署…

SSM学习——Spring AOP与AspectJ

Spring AOP与AspectJ 概念 AOP的全称为Aspect-Oriented Programming&#xff0c;即面向切面编程。 想象你是汉堡店的厨师&#xff0c;每一份汉堡都有好几层&#xff0c;这每一层都可以视作一个切面。现在有一位顾客想要品尝到不同风味肉馅的汉堡&#xff0c;如果按照传统的方…

【LeetCode热题100】17. 电话号码的字母组合(回溯)

一.题目要求 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 二.题目难度 中等 三.输入样例 示例 1&#xff1a; 输入…

团体程序设计天梯赛-练习集 (L1-025 - L1-036)

天梯赛题解合集 团体程序设计天梯赛-练习集 &#xff08;L1-001 - L1-012&#xff09; 团体程序设计天梯赛-练习集 &#xff08;L1-013 - L1-024&#xff09; 团体程序设计天梯赛-练习集 &#xff08;L1-025 - L1-036&#xff09; 团体程序设计天梯赛-练习集 &#xff08;L1-03…

树与二叉树的应用试题

01&#xff0e;在有n个叶结点的哈夫曼树中&#xff0c;非叶结点的总数是( A ). A. n-1 B. n C. 2n-1 D.2n解析&#xff1a;哈夫曼树中只有度为0和2的结点&#xff0c;在非空二…

67、yolov8目标检测和旋转目标检测算法batchsize=1/6部署Atlas 200I DK A2开发板上

基本思想:需求部署yolov8目标检测和旋转目标检测算法部署atlas 200dk 开发板上 一、转换模型 链接: https://pan.baidu.com/s/1hJPX2QvybI4AGgeJKO6QgQ?pwd=q2s5 提取码: q2s5 from ultralytics import YOLO# Load a model model = YOLO("yolov8s.yaml") # buil…

spring boot3登录开发-3(2短信验证登录/注册逻辑实现)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 上文衔接 内容简介 功能分析 短信验证登录实现 1.创建交互对象 用户短信登录/注册DTO 创建用户登录VO…

harmonyOS的客户端存贮

什么是客户端存贮 在harmonyOS中,客户端存贮是指将数据存贮在本地设备以供应用程序使用; 注: 和feaureAblity搭配使用,content上下文的获取依赖该API如下: // 引入: import featureAbility from ohos.ability.featureAbility;// 使用: let content featureAbility.getConten…

Git Fork后的仓库内容和原仓库保持一致

Git Fork后的仓库内容和原仓库保持一致 ①Fork原仓库内容到自己仓库 ②将项目内容下载到本地 ③使用git命令获取原仓库内容&#xff0c;将原仓库的最新内容合并到自己的分支上并推送 下面从第三步开始演示~ 这里以码云上的若依项目为演示项目 ③使用git命令获取原仓库内容 …

NLP重要知识点:预训练模型【核心且详细】

本资料是NLP核心知识点的ppt!!!【文章较长,建议收藏】 本节课我们学习预训练模型。 前言 我们在学习词向量的时候,应该知道了多个产生词向量的方法,包括基于矩阵(词-词共现矩阵)分解的方法、基于语言模型(word2vec)的方法、以及结合二者优点的Glove模型等其他产生词…

10kV配电室在线监控改造技术方案

摘要&#xff1a;目前&#xff0c;我国经济高速发展&#xff0c;社会在不断进步&#xff0c;国家加大了农村低压配电网络改造升级投入&#xff0c;低压配电网供电可靠性及供电质量得到明显提升&#xff0c;但低压配电网络自动化运维水平及农村电网用电安全尚处于较低水平。低压…