QT调用Tinyxml2库解析XML结构文件

在学习SVG结构的时候,发现SVG结构可以通过以XML文件直接解析,所以就去了解了Tinyxml2库的使用,相关教程也比较多。
个人感觉Tinyxml2库比官方的XML解析库更好用,这里做个技术总结,记录Tinyxml2库解析XML文件结构的简单使用。

目录导读

    • Tinyxml2库 介绍(文言一心)
    • 使用CMAKE 和 MSVC 2017 编译 Tinyxml2库
    • QT 调用 **tinyxml2.lib** 解析XML
      • 遍历所有节点
      • 将XML节点 加载到QTreeWidget 控件上
      • 其他TinyXML2库操作XML示例:

Tinyxml2库 介绍(文言一心)

TinyXML-2 是一个简单、小巧且功能强大的C++ XML解析库,它是TinyXML的改进和扩展版本。该库专注于易用性和性能,提供了对XML文档的读取、修改和创建功能。以下是TinyXML-2的主要特点:

  • DOM风格API: TinyXML-2采用了Document Object Model(DOM)风格的API,允许开发者以树形结构的方式操作XML数据。这意味着开发者可以轻松地遍历、查询和修改XML文档。
  • 轻量级: TinyXML-2的代码量小,不依赖外部库,因此非常适合嵌入式系统和移动设备。由于其小巧的体积和高效的实现,它在处理XML文档的速度上表现出色。
  • 易于使用: TinyXML-2的API设计直观、简洁,类和方法命名直观(如XMLNode、XMLElement等),使得学习成本较低,易于理解和集成到项目中。
  • 错误处理: TinyXML-2提供了一套全面的错误检查机制。如果遇到无效的XML格式,它会抛出异常或返回错误代码,帮助开发者快速定位问题。
    支持解析和生成:TinyXML-2支持从字符串或文件中解析XML文档,并且可以生成格式良好的XML文本。它能够处理各种节点类型,如元素、属性、文本、注释等。
  • 跨平台: TinyXML-2完全基于标准C++编写,可以在多种操作系统和编译器环境下运行,包括Windows、Linux、Mac OS X等。

总的来说,TinyXML-2是一个功能强大、易于使用且跨平台的C++ XML解析库,适用于各种需要处理XML数据的场景。

Github: https://github.com/leethomason/tinyxml2

使用CMAKE 和 MSVC 2017 编译 Tinyxml2库

参考:xml开发笔记(一):tinyXml2库介绍、编译和工程模板
下载最新GitHub的项目通过CMAKE编译:
Configure选择MSCV2017编译器和X64平台:
请添加图片描述
直接ConfigureGenerate生成VS2017项目,可能是编译器或版本文件没有出现任何异常…
在这里插入图片描述
项目工程直接生成 tinyxml2.lib 没有了dll文件。
xmltest.cpp 文件为调用示例,建议参考。
在这里插入图片描述

QT 调用 tinyxml2.lib 解析XML

将项目中的 tinyxml2.htinyxml2.cpptinyxml2.lib 放在项目目录下。
在这里插入图片描述

#include "tinyxml2/tinyxml2.h"using namespace tinyxml2;
using namespace std;//! tinyxml2.lib 绝对路径
#pragma comment(lib,"E:\\data-bank\\Git\\Qt_XML_Lanalysis\\Qt_XML_Lanalysis\\XML_LAnalysis_UI\\tinyxml2\\tinyxml2.lib")

遍历所有节点

加载XML文件遍历所有节点,并输出节点中的所有属性值
参考:tinyxml/tinyxml2遍历所有节点

#include <QDebug>
#include <QObject>
#include <QFileInfo>#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <wchar.h>void Lib_XmlReadWrite::GetEleValue(XMLElement * element)
{for (XMLElement* currentele = element->FirstChildElement(); currentele; currentele = currentele->NextSiblingElement()){XMLElement* tmpele = currentele;if (currentele->Name() != NULL||currentele->GetText() != NULL)qDebug() <<"-->" << currentele->Name() << ":" << currentele->GetText() ;if(tmpele->FirstAttribute()!=NULL){//! 输出所有属性值for (const XMLAttribute* var =tmpele->FirstAttribute(); var;var=var->Next()) {qDebug()<<"---->" <<var->Name()<<" : "<<var->Value();}}//! 有子节点继续加载if (!tmpele->NoChildren())GetEleValue(tmpele);}
}void Lib_XmlReadWrite::LoadXML(QString xml)
{QFileInfo info("C:\\Users\\admin\\Desktop\\textxml\\text_xml5.xml");qDebug()<< "LoadXML -->"<<info.exists();XMLDocument doc;doc.LoadFile(info.absoluteFilePath().toStdString().c_str());qDebug()<<doc.ErrorIDToName(doc.ErrorID());qDebug()<< doc.FirstChild()->FirstChildElement()->Name();qDebug()<<doc.RootElement()->Name();qDebug()<<"-----------------------------------";GetEleValue(doc.RootElement());}

将XML节点 加载到QTreeWidget 控件上

通过 QTreeWidgetItem 结构将XML相关结构显示到 QTreeWidget 控件上。
值得注意的是 如果一个文件有多个根节点可以通过
for (XMLElement* root = doc.RootElement(); root; root = root->NextSiblingElement())
遍历所有根节点。


bool Lib_XmlReadWrite::LoadTreeWidget(QString xmlpath,QTreeWidgetItem* & item,QString& ErrorStr)
{//! 判断文件是否存在!QFileInfo xmlInfo(xmlpath);if(!xmlInfo.exists()){ErrorStr=("文件["+QString(xmlpath)+"]不存在!");return false;}//! 加载xml格式文件doc.Clear();;doc.LoadFile(xmlInfo.absoluteFilePath().toStdString().c_str());if(doc.ErrorID()!=XML_SUCCESS){ErrorStr=("解析失败:"+QString(doc.ErrorStr()));return false;}//! 添加文件根目录item=new QTreeWidgetItem(QStringList()<<QString(xmlInfo.baseName())<<""<<xmlInfo.absoluteFilePath());//! 不一定只有一个节点for (XMLElement* root = doc.RootElement(); root; root = root->NextSiblingElement()){//! XML子节点QTreeWidgetItem* rootitem=new QTreeWidgetItem(QStringList()<<QString(root->Name())<<""<<root->GetText(),QTreeWidgetItem::UserType);RecursionElement(root,rootitem);item->addChild(rootitem);}return true;
}void Lib_XmlReadWrite::RecursionElement(XMLElement * element,QTreeWidgetItem* & item)
{//! 查找当前 element 子节点for (XMLElement* currentele = element->FirstChildElement(); currentele; currentele = currentele->NextSiblingElement()){XMLElement* tmpele = currentele;QTreeWidgetItem* childitem=new QTreeWidgetItem(QStringList()<<tmpele->Name()<<""<<tmpele->GetText());if(tmpele->FirstAttribute()!=NULL){//! 添加属性值for (const XMLAttribute* var =tmpele->FirstAttribute(); var;var=var->Next()) {QTreeWidgetItem* attritem=new QTreeWidgetItem(QStringList()<<""<<var->Name()<<var->Value(),QTreeWidgetItem::UserType);attritem->setToolTip(2,var->Value());childitem->addChild(attritem);}}//! 查找 tmpele 子节点if (!tmpele->NoChildren())RecursionElement(tmpele,childitem);item->addChild(childitem);}
}/*!
//! 调用
void MainWindow::LoadXMLStructure(QString text)
{ui->treeWidget->clear();ui->treeWidget->setHeaderLabels(QStringList()<<"节点"<<"属性"<<"业务值");ui->treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);if(text=="")return;QString ErrorStr;QTreeWidgetItem* item;bool isbol=Lib_XmlReadWrite::LoadTreeWidget(text,item,ErrorStr);if(!isbol){qDebug()<<"[ErrorStr] "<<ErrorStr;ui->statusBar->showMessage(ErrorStr,0);}else{ui->treeWidget->addTopLevelItem(item);ui->treeWidget->expandAll();}
}
*/

效果:
在这里插入图片描述

其他TinyXML2库操作XML示例:

TinyXML2库解析xml感觉比Qt的QXmlStreamReader这种更好用,
但是不适合用来解析HTML文件,HTML文件中,像<link>这种节点会直接解析失败。
参考:

  • TinyXML2使用方法及示例
  • 官方示例 xmltest.cpp 文件

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

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

相关文章

【Linux取经路】一个简单的日志模块

文章目录 一、可变参数的使用二、Log2.1 日志打印2.1.1 时间获取2.1.2 日志分块打印 2.2 打印模式选择2.3 Log 使用样例2.4 Log 完整源码 三、结语 一、可变参数的使用 int sum(int n, ...) {va_list s; // va_list 本质上就是一个指针va_start(s, n); int sum 0;while(n){su…

计算机毕业设计 | node.js(Express)+vue影院售票商城 电影放映购物系统(附源码+论文)

1&#xff0c;绪论 1.1 项目背景 最近几年&#xff0c;我国影院企业发展迅猛&#xff0c;各大电影院不断建设新的院线&#xff0c;每年新投入使用的荧幕数目逐年显著上升。这离不开人们的观影需求及对观影的过程要求的不断进步。广大观影消费者需要知道自己的空闲时间&#x…

Django中使用Celery(通用方案、官方方案)

Django中使用Celery&#xff08;通用方案、官方方案&#xff09; 目录 Django中使用Celery&#xff08;通用方案、官方方案&#xff09;通用方案场景前置准备完整代码 Celery官方方案【1】注册celery配置【2】创建celery文件【3】init注册【4】添加任务【5】启动worker异步任务…

设计模式六大原则之依赖倒置原则

文章目录 概念逻辑关系 小结 概念 依赖倒置原则指在设计代码架构时&#xff0c;高层模块不应该依赖底层模块&#xff0c;二者都应该依赖抽象。抽象不应该依赖于细节&#xff0c;细节应该依赖于抽象。 逻辑关系 如上图所示&#xff0c;逻辑应该就是这样&#xff0c;高层依赖于…

解决Wordpress中Cravatar头像无法访问问题

一、什么是Cravatar Gravatar是WordPress母公司Automattic推出的一个公共头像服务&#xff0c;也是WordPress默认的头像服务。但因为长城防火墙的存在&#xff0c;Gravatar在中国时不时就会被墙一下&#xff0c;比如本次从2021年2月一直到8月都是不可访问状态。 在以往的时候&…

R语言:单细胞pcoa降维和去批次

#生成随机颜色 > randomColor <- function() { paste0("#",paste0(sample(c(0:9, letters[1:6]), 6, replace TRUE),collapse "")) } # 生成100个随机颜色 > randomColors <- replicate(100,randomColor()) > seuratreadRDS("seu…

前端javascript包管理,npm升级用pnpm

一 pnpm 介绍 pnpm&#xff08;Package Manager&#xff09;是一个快速、节省磁盘空间的 JavaScript 包管理器&#xff0c;它是 Node.js 生态系统中 npm 的一个替代品。pnpm 解决了传统包管理工具在处理依赖时的一些痛点&#xff0c;特别是关于存储空间使用和依赖地狱的问题。…

如何将Google Search Console添加到WordPress和GA4

您想知道如何将 Google Search Console 添加到您的 Google Analytics 帐户和 WordPress 网站吗&#xff1f; 作为网站主&#xff0c;Google Search Console 是一款不能不使用的工具。对于任何想要确保其网站在 Google 搜索结果中表现良好的人来说&#xff0c;这绝对是一个必不…

leetCode-hot100-数组专题之区间问题

数组专题之区间问题 知识点&#xff1a;解决思路&#xff1a;例题56.合并区间57.插入区间253.会议室 Ⅱ485.无重叠区间 数组区间问题是算法中常见的一类问题&#xff0c;它们通常涉及对数组中的区间进行排序、合并、插入或删除操作。无论是合并区间、插入区间还是删除重复空间&…

【HarmonyOS尝鲜课】- 下载、安装DevEco Studio以及配置环境、创建运行HarmonyOS项目

下载、安装开发工具 进入DevEco Studio下载官网&#xff0c;单击“立即下载”进入下载页面。 这里以Windows为例进行安装&#xff0c;可以根据操作系统选择对应的版本进行下载。 下载完成后解压一下&#xff0c;进入文件里&#xff0c;双击应用程序&#xff0c;打开安装向导&a…

Redis主从、哨兵、集群讲解

一、Redis主从 大家在面试中可能经常会被问到Redis的高可用问题。Redis高可用回答包括两个层面&#xff0c;一个就是数据不能丢失&#xff0c;或者说尽量减少丢失 ;另外一个就是保证Redis服务不中断 。 对于尽量减少数据丢失&#xff0c;可以通过AOF和RDB保证。 对于保证服务…

linux---线程控制

线程和进程 以前我们要同时跑多个程序&#xff0c;可以通过fork()多个子进程&#xff0c;然后通过系统函数进行程序的替换&#xff0c;但是创建进程代价大&#xff0c;不仅要拷贝一份父进程的地址空间&#xff0c;页表&#xff0c;文件表述符表等。但是线程不需要因为是进程的…

windows docker desktop 更换镜像存储目录

windows docker desktop 更换镜像存储目录 方法&#xff1a;如图&#xff0c;Browse浏览一个新的目录并选中&#xff0c;确定后&#xff0c;程序会开始stop&#xff0c;在stop完成前&#xff0c;会持续迁移原有镜像到新的位置&#xff0c;你会发现目标位置的磁盘占用空间越来越…

Mac网线连接windows本【局域网互传文件】

Mac网线连接windows本【局域网互传文件】 两台电脑网线互联 Mac->网络->USP TCP/IP 手动配置IP&#xff0c;子网掩码&#xff0c;路由器 windows 网络和Internet配置->更改适配器选项->以太网->Internet协议版本4&#xff08;TCP/IPv4&#xff09;->属性 …

K8S/ hpa分享

在 Kubernetes 中&#xff0c;HorizontalPodAutoscaler 自动更新工作负载资源 &#xff08;例如 Deployment 或者 StatefulSet&#xff09;&#xff0c; 目的是自动扩缩工作负载以满足需求。 hpa的使用本身还是很简单的 示例如下&#xff1a; 官网示例 apiVersion: apps/v1 k…

NetCore发布的时候怎么去除生成的多余的语言文件夹cs,de...,Microsoft.CodeAnalysis语言资源文件

1、问题&#xff1a; .NetCore 3.1 发布出来的publish目录一大堆杂七杂八的文件夹如下图&#xff1a; 2、产生原因 由Microsoft.VisualStudio.Web.CodeGeneration.Design包导致 3、解决方法&#xff1a; 如果确实需要某种语言资源文件&#xff0c;可以这样&#xff0c;右键编…

压摆率SR、增益带宽积GBP、开环增益Aol

运放的选型对运放电路的实际效果非常关键&#xff0c;一定要理解运放重要参数的概念。下面几天将对运放的选型进行系统学习并做实验 运放的压摆率&#xff08;Slew Rate&#xff0c;简称SR&#xff09;是指闭环放大器在输入为阶跃信号时&#xff0c;输出电压时间变化率的平均值…

vue打包部署到springboot,通过tomcat运行

tomcat默认端口 8080springboot端口 9132vue 端口 9131 框架 项目是基于SpringBootVue前后端分离的仓库管理系统 后端&#xff1a;SpringBoot MybatisPlus前端&#xff1a;Node.js Vue element-ui数据库&#xff1a;mysql 一. 打包Vue项目 cmd中输入命令 npm run build 后…

深度学习之基于YoloV5-Deepsort人物识别与追踪项目

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与目标 本项目旨在利用深度学习技术&#xff0c;结合YoloV5和Deepsort算法&#xff0c;开发一个高效、…

前端:音频可视化(H5+js版本)

一、效果展示 HTML5JS实现一个简单的音频可视化 二、代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>音频可视化</title><style></style></head><body><divs…