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

作者:翟天保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 nodesreturn;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 whitespacesif (!textContent.empty()) {nodeData.text = textContent;}}}child = child->NextSibling();}
}// Function to display node data recursively
void displayNodeData(const NodeData& node, int depth = 0) 
{// Display current nodecout << 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 recursivelyfor (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 dataNodeData rootNodeData;rootNodeData.name = root->Value();rootNodeData.attributes = parseAttributes(root);// Parse child nodesparseChildNodes(root, rootNodeData);// Display all node datadisplayNodeData(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.hqwc.cn/news/587492.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用tcpdump和wireshark进行服务器抓包分析

目录 前言 1.tcpdump简介 2.Wireshark简介 3.实际案例 4.代码示例 5.总结 前言 服务器抓包分析是一种非常常见和有效的网络故障排查和性能优化手段。通过捕获服务器上的网络流量&#xff0c;可以帮助我们深入了解服务器与其它设备之间的通信情况&#xff0c;发现问题并进…

应用方案 | 内置ALC的音频前置放大器D2538A和D3308芯片

一、应用领域 D2538A和D3308是芯谷科技推出的两款内置ALC&#xff08;音频限幅器&#xff09;的前置音频放大器芯片&#xff0c;其中D2538A为单通道&#xff0c;D3308为双通道&#xff0c;它特别适用于胎心仪、个人医疗防护、立体声收录机、盒式录音机等涉及音频放大与限幅的产…

微软云学习环境

微软公有云 - Microsoft Azure 本文介绍通过微软学习中心Microsoft Learn来免费试用Azure上的服务&#xff0c;也不需要绑定信用卡。不过每天只有几个小时的时间。 官网 https://docs.microsoft.com/zh-cn/learn/ 实践 比如创建虚拟机&#xff0c;看到自己的账号下多了Learn的…

【代码】C语言|保留小数点后n位并四舍五入,便于处理运算和存储不善的浮点数

前言 有个人跟我说浮点数运算起来非常麻烦&#xff0c;总是算着算着丢失精度&#xff0c;导致计算结果取int的时候取不准。毕竟系统也没有自动根据这个数的精度四舍五入的功能。 比如int(2.999999999999999)2&#xff0c;但是float(2.999999999999999)3.000000。 我觉得这个问…

2024最新软件测试【测试理论+ 抓包与网络协议】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段&#xff1a;需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样&#xff0c;之后我们会有一个需求澄清会议&#xff0c; …

升级一下电脑,CPU换I5-14600K,主板换华硕B760M

刚给自己电脑升级了一下&#xff0c;CPU从 AMD R5 5600X 换成 Intel I5-14600K&#xff0c;主板换成了华硕的 TUF GAMING B760M-PLUS WIFI D4。 因为我现有的两根内存是DDR4的&#xff0c;所有我选了个支持DDR4内存的主板。 我发现用AMD处理器时将系统从Win10升级到Win11后变…

【论文阅读】Transformer 论文逐段精读

Transformer 论文逐段精读【论文精读】 文章目录 Transformer 论文逐段精读【论文精读】&#x1f4dd;摘要&#x1f4dc;结论&#x1f4cc;引言⏱️相关工作⭐模型Overview3.1 Encoder and Decoder Stacks3.2 Attention3.2.1 Scaled Dot-Product Attention3.3.2 Multi-head att…

详解人工智能(概念、发展、机遇与挑战)

前言 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门新兴的技术科学&#xff0c;是指通过模拟、延伸和扩展人类智能的理论、方法、技术和应用系统&#xff0c;以实现对人类认知、决策、规划、学习、交流、创造等智能行为的模拟、延伸和扩展…

最优算法100例之22-变态跳台阶

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 题解报告 …

视频汇聚/安防监控/EasyCVR平台播放器EasyPlayer更新:新增【性能面板】

视频汇聚/安防监控/视频存储平台EasyCVR基于云边端架构&#xff0c;可以在复杂的网络环境中快速、灵活部署&#xff0c;平台视频能力丰富&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云…

ctf_show笔记篇(web入门---jwt)

目录 jwt简介 web345&#xff1a; web346&#xff1a; web347&#xff1a; web348: web349&#xff1a; web350&#xff1a; jwt简介 JSON Web Token&#xff08;JWT&#xff09;通常由三部分组成 Header&#xff08;头部&#xff09;&#xff1a;包含了两部分信息&…

【性能调优】Java服务端性能优化与实战

一、背景 降本增效&#xff1a;随着公司业务的发展和用户规模的增加&#xff0c;当前服务的QPS已经远远不能满足业务需求&#xff0c;需要申请更多CPU资源&#xff0c;来提升QPS&#xff0c;满足业务发展&#xff0c;但是公司硬件资源有限&#xff0c;额外申请多余资源&#x…