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.pswp.cn/diannao/13865.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13865.shtml
英文地址,請注明出處:http://en.pswp.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…

為什么以太網適配器不是192.168而是196.254【筆記】

為什么以太網適配器不是192.168而是196.254【筆記】 前言版權為什么以太網適配器不是192.168而是196.254最后 前言 2024-03-12 22:55:34 公開發布于 2024-5-22 00:20:35 以下內容源自《【筆記】》 僅供學習交流使用 版權 禁止其他平臺發布時刪除以下此話 本文首次發布于CS…

Linux: tools: crash: not a supported file format

這個原因是,通過比對每個format的magic數值,或者其他的信息,來看是否屬于某個format,如果都不符合,就會出現這個錯誤。說明kernel的coredump文件,dump的有些問題。 main (argc=3, argv=0x7fffffffda88) at main.c:496 496 } else if (is_compressed…

Java高級面試精粹:問題與解答集錦(一)

Java 面試問題及答案 1. 什么是Java中的多態&#xff0c;它是如何實現的&#xff1f; 答案&#xff1a; 多態是Java中的一個核心概念&#xff0c;它允許不同類的對象對同一消息做出響應&#xff0c;但具體的行為會根據對象的實際類型而有所不同。多態主要通過以下兩種方式實現…

git命令行指引

命令行指引 您還可以按照以下說明從計算機中上傳現有文件。 Git 全局設置 git config --global user.name "lizhijun" git config --global user.email "oldgunqfhotmail.com"創建一個新倉庫 git clone gitfiles.tfedu.net:aigk985-gaokao/Folder-watc…

計算機畢業設計 | 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月都是不可訪問狀態。 在以往的時候&…

Java_IO流學習

IO流 概念 I – in – 輸入(讀) O – out – 輸出(寫) 流 – 一點一點的像水流一樣去傳輸數據 注意&#xff1a;站在程序的角度去看待輸入還是輸出 分類 按照方向分流&#xff1a;輸入流、輸出流 按照單位分流&#xff1a;字節流、字符流 按照功能分流&#xff1a;基礎流/節點…

R語言:單細胞pcoa降維和去批次

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

RAG系統(四)手撕基于向量檢索的 RAG

RAG系統&#xff08;一&#xff09;系統介紹與向量檢索 RAG系統&#xff08;二&#xff09;文檔的加載與分段 RAG系統&#xff08;三&#xff09;向量數據庫 完整代碼需要依賴前邊三章中的代碼&#xff0c;本節主要展示整合后的RAG系統&#xff0c;及運行示例。 from MyVec…

前端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保證。 對于保證服務…

2024年中青杯數學建模思路+建模過程+視頻講解

A 題&#xff1a;人工智能視域下養老輔助系統的構建 隨著全球人口老齡化的加劇&#xff0c;養老問題已經成為一個世界性的社會問題。它不僅 關系到每個家庭、每個個體的未來福祉&#xff0c;也關系到國家的社會穩定和可持續發展。根 據聯合國的相關數據顯示&#xff0c;全球 65…

linux---線程控制

線程和進程 以前我們要同時跑多個程序&#xff0c;可以通過fork()多個子進程&#xff0c;然后通過系統函數進行程序的替換&#xff0c;但是創建進程代價大&#xff0c;不僅要拷貝一份父進程的地址空間&#xff0c;頁表&#xff0c;文件表述符表等。但是線程不需要因為是進程的…

搜索引擎新特性與未來展望

多元化大模型支持: 本搜索引擎具備卓越的兼容性和靈活性,支持多種大模型(LLMs)。無論是本地部署的llama3、gemma、mistral等模型,還是云服務提供的OpenAI/gpt4-o、Groq/Llama3等,都能輕松接入,為用戶提供豐富的智能搜索體驗。現代化技術棧構建: 項目采用業界領先的Next…