Qt文件:XML文件

XML文件

  • 1. XML文件結構
    • 1.1 基本結構
    • 1.2 XML 格式規則
    • 1.3 XML vs HTML
  • 2. XML文件操作
    • 2.1 DOM 方式(QDomDocument)
      • 讀取 XML
      • 寫入XML
    • 2.2 SAX 方式(QXmlStreamReader/QXmlStreamWriter)
      • 讀取XML
      • 寫入XML
    • 2.3 對比分析
  • 3. 使用場景
    • 3.1 存儲配置信息
    • 3.2 數據交換與存儲
    • 3.3 界面布局與資源定義
    • 3.4 網絡通信與 API 交互
    • 3.5 插件與擴展系統
    • 3.6 國際化(i18n)與翻譯文件

1. XML文件結構

XML(eXtensible Markup Language,可擴展標記語言)是一種用于存儲和傳輸數據的標記語言,具有平臺無關性、結構清晰、易于閱讀和編寫等特點。

1.1 基本結構

一個標準的 XML 文件通常包含以下部分:

  1. XML 聲明(可選):指定 XML 版本、編碼方式(如 UTF-8)等信息。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
version:必填,指定 XML 版本(常用1.0)。
encoding:可選,指定字符編碼(默認UTF-8,需與文件實際編碼一致)。
standalone:可選,指定是否為獨立文件(yes表示不依賴外部 DTD / 模式,no表示依賴)。
  1. 文檔類型定義(DTD,可選):定義 XML 文檔的結構和元素規則(可引用外部 DTD 或內嵌)。
<!DOCTYPE root-element SYSTEM "filename.dtd">
root-element:根元素名稱。
SYSTEM:引用外部 DTD 文件。
<!DOCTYPE books [<!ELEMENT books (book+)><!ELEMENT book (title, author)><!ATTLIST book id CDATA #REQUIRED>
]>
  1. 根元素:XML 文檔的頂級元素,所有內容必須包含在根元素內。
<root><!-- 子元素 -->
</root>
<books><book id="1"><title>Qt編程</title></book>
</books>
  1. 元素(標簽):由開始標簽()、結束標簽()和內容(可選)組成。
    規則:
    • 標簽名區分大小寫(如和是不同標簽)。
    • 必須正確嵌套,不能交叉。
    • 空元素可使用自閉合標簽(如<-img src=“image.jpg” />)。
<book id="1"><title>XML入門</title><author>John Doe</author>
</book>
  1. 屬性:為元素提供額外信息(鍵值對形式)。
    規則:
    • 屬性值必須用雙引號(")或單引號(')包裹。
    • 同一元素中屬性名唯一。
<book id="1" category="technology"><title>XML實戰</title>
</book>
  1. 文本內容:元素內部的文本內容,可包含轉義字符或 CDATA 節。
    在這里插入圖片描述
    CDATA 節:用于包含無需轉義的原始文本(如代碼片段),語法:
<description><![CDATA[內容不轉義 <script>...</script>]]></description>

1.2 XML 格式規則

  1. 嚴格區分大小寫:標簽名、屬性名、屬性值均區分大小寫(如和<title>是不同標簽)。
  2. 正確閉合標簽:每個開始標簽必須有對應的結束標簽,空元素需自閉合(如<‘’br />)。
  3. 唯一根元素:每個 XML 文檔必須有且僅有一個根元素,所有其他元素都是根元素的子元素。
  4. 正確嵌套標簽:標簽必須逐層嵌套,不能交叉。例如:
<!-- 正確嵌套 -->
<parent><child>內容</child>
</parent><!-- 錯誤(交叉嵌套) -->
<parent><child>內容
</parent>
</child>
  1. 屬性值必須加引號:屬性值必須用單引號或雙引號包裹,例如:
<book id='1' name="XML教程" />
  1. 禁止使用特殊字符:文本內容中不能直接使用<、>、&等特殊字符,需用轉義代碼或 CDATA 節處理。

1.3 XML vs HTML

特性XMLHTML
設計目標存儲和傳輸數據展示數據和定義網頁結構
標簽定義自定義標簽(可擴展)預定義標簽(如
,

語法嚴格性嚴格(必須正確閉合、嵌套)相對寬松(部分瀏覽器可容錯)
用途配置文件、數據交換、API 返回格式等網頁內容呈現
<?xml version="1.0" encoding="UTF-8"?>
<students><student id="S001"><name>Alice</name><age>20</age><courses><course name="Math" score="90" /><course name="Physics" score="85" /></courses></student><student id="S002"><name>Bob</name><age>21</age><courses><course name="Programming" score="95" /></courses></student>
</students>

2. XML文件操作

在 Qt 中處理 XML 文件主要有兩種方式:DOM 方式(使用QDomDocument)和SAX 方式(使用QXmlStreamReader和QXmlStreamWriter)。

2.1 DOM 方式(QDomDocument)

特點:

  1. 將整個 XML 文檔加載到內存中,形成樹形結構。
  2. 支持隨機訪問和修改節點。
  3. 適合處理小型 XML 文件。

讀取 XML

#include <QFile>
#include <QDomDocument>
#include <QDebug>void readXmlWithDom() {QFile file("example.xml");if (!file.open(QIODevice::ReadOnly)) {qDebug() << "Failed to open file!";return;}QDomDocument doc;if (!doc.setContent(&file)) {qDebug() << "Failed to parse XML!";file.close();return;}file.close();// 獲取根節點QDomElement root = doc.documentElement();qDebug() << "Root tag:" << root.tagName();// 遍歷子節點QDomNode node = root.firstChild();while (!node.isNull()) {if (node.isElement()) {QDomElement element = node.toElement();qDebug() << "Tag:" << element.tagName()<< "Text:" << element.text();}node = node.nextSibling();}
}

寫入XML

void writeXmlWithDom() {QDomDocument doc;// 添加XML聲明QDomProcessingInstruction instruction = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");doc.appendChild(instruction);// 創建根節點QDomElement root = doc.createElement("books");doc.appendChild(root);// 添加子節點QDomElement book1 = doc.createElement("book");book1.setAttribute("id", "1");QDomElement title1 = doc.createElement("title");title1.appendChild(doc.createTextNode("Qt Programming"));book1.appendChild(title1);root.appendChild(book1);// 保存到文件QFile file("output.xml");if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {QTextStream stream(&file);stream << doc.toString();file.close();}
}

2.2 SAX 方式(QXmlStreamReader/QXmlStreamWriter)

特點

  1. 流式解析,逐行讀取 XML,不加載整個文檔。
  2. 內存占用小,適合處理大型 XML 文件。
  3. 只支持順序訪問,不支持隨機修改。

讀取XML

#include <QFile>
#include <QXmlStreamReader>
#include <QDebug>void readXmlWithStream() {QFile file("example.xml");if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {qDebug() << "Failed to open file!";return;}QXmlStreamReader xml(&file);while (!xml.atEnd() && !xml.hasError()) {QXmlStreamReader::TokenType token = xml.readNext();if (token == QXmlStreamReader::StartElement) {if (xml.name() == "book") {QString id = xml.attributes().value("id").toString();qDebug() << "Book ID:" << id;} else if (xml.name() == "title") {qDebug() << "Title:" << xml.readElementText();}}}if (xml.hasError()) {qDebug() << "XML error:" << xml.errorString();}file.close();
}

寫入XML

void writeXmlWithStream() {QFile file("output.xml");if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {qDebug() << "Failed to open file!";return;}QXmlStreamWriter xml(&file);xml.setAutoFormatting(true);  // 自動格式化XMLxml.writeStartDocument();xml.writeStartElement("books");xml.writeStartElement("book");xml.writeAttribute("id", "1");xml.writeTextElement("title", "Qt Programming");xml.writeEndElement();  // </book>xml.writeEndElement();  // </books>xml.writeEndDocument();file.close();
}

2.3 對比分析

場景推薦類優點
小型 XML 文件,需隨機修改QDomDocument操作簡單,支持 DOM 樹遍歷
大型 XML 文件,僅需讀取QXmlStreamReader內存占用低,解析速度快
生成 XML 文件QXmlStreamWriter代碼簡潔,性能高
需要 XPath 查詢QXmlQuery支持 XPath 表達式
Qt Quick 應用XmlListModel直接集成到 QML 中
  1. 命名空間處理:
    DOM 方式:使用QDomNode::namespaceURI()獲取命名空間。
    流方式:使用QXmlStreamReader::namespaceUri()。
  2. 錯誤處理:
    DOM 方式:檢查QDomDocument::setContent()的返回值。
    流方式:檢查QXmlStreamReader::hasError()。
  3. 性能考慮:
    處理大型文件時,優先選擇 SAX 方式,避免內存溢出。

3. 使用場景

在 Qt 應用開發中,XML 文件常用于存儲配置信息、交換數據、定義界面結構等場景。Qt 提供了多種處理 XML 的類和工具,使 XML 文件成為應用程序與外部數據交互的重要載體。

3.1 存儲配置信息

XML 文件可用于保存應用程序的配置參數,如窗口尺寸、用戶偏好等。通過讀取和寫入 XML 配置文件,實現應用狀態的持久化。

<!-- config.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<config><window><width>800</width><height>600</height><maximized>true</maximized></window><appearance><theme>dark</theme><font>Roboto</font><fontSize>12</fontSize></appearance>
</config>
  • 讀取文件:
#include <QFile>
#include <QXmlStreamReader>void loadConfig() {QFile file("config.xml");if (file.open(QIODevice::ReadOnly)) {QXmlStreamReader xml(&file);while (!xml.atEnd()) {if (xml.readNextStartElement()) {if (xml.name() == "window") {// 讀取窗口配置xml.readNextStartElement(); // <width>int width = xml.readElementText().toInt();xml.readNextStartElement(); // <height>int height = xml.readElementText().toInt();// 設置窗口大小...} else if (xml.name() == "appearance") {// 讀取外觀配置// ...}}}file.close();}
}

3.2 數據交換與存儲

XML 是一種通用的數據交換格式,可用于在 Qt 應用與其他系統(如 Web 服務、數據庫)之間傳輸數據。

<!-- books.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<books><book id="1"><title>Qt編程實戰</title><author>John Doe</author><price currency="CNY">89.00</price></book><book id="2"><title>C++ Primer</title><author>Stanley Lippman</author><price currency="USD">45.99</price></book>
</books>

解析數據:

#include <QFile>
#include <QXmlStreamReader>
#include <QDebug>struct Book {int id;QString title;QString author;double price;QString currency;
};QList<Book> parseBooks() {QList<Book> bookList;QFile file("books.xml");if (file.open(QIODevice::ReadOnly)) {QXmlStreamReader xml(&file);Book currentBook;while (!xml.atEnd()) {if (xml.readNextStartElement()) {if (xml.name() == "book") {currentBook.id = xml.attributes().value("id").toInt();} else if (xml.name() == "title") {currentBook.title = xml.readElementText();} else if (xml.name() == "author") {currentBook.author = xml.readElementText();} else if (xml.name() == "price") {currentBook.price = xml.readElementText().toDouble();currentBook.currency = xml.attributes().value("currency").toString();}} else if (xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == "book") {bookList.append(currentBook);}}file.close();}return bookList;
}

3.3 界面布局與資源定義

XML 可用于定義 Qt 應用的界面結構(如 Qt Designer 生成的.ui文件)或資源文件(如.qrc)。
UI文件片段:

<!-- mainwindow.ui (簡化版) -->
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>600</height></rect></property><widget class="QWidget" name="centralWidget"><layout class="QVBoxLayout" name="verticalLayout"><widget class="QLabel" name="label"><property name="text"><string>Hello Qt!</string></property></widget><widget class="QPushButton" name="pushButton"><property name="text"><string>Click Me</string></property></widget></layout></widget></widget>
</ui>

3.4 網絡通信與 API 交互

Qt 應用可通過 XML 格式與 Web 服務通信(如 SOAP 協議),或解析遠程 API 返回的 XML 數據。

#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QXmlStreamReader>void fetchRemoteXml() {QNetworkAccessManager manager;QNetworkRequest request(QUrl("https://api.example.com/data.xml"));QNetworkReply *reply = manager.get(request);QEventLoop loop;QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);loop.exec();if (reply->error() == QNetworkReply::NoError) {QXmlStreamReader xml(reply->readAll());// 解析XML數據...}reply->deleteLater();
}

3.5 插件與擴展系統

XML 可用于描述插件信息或應用擴展點,使應用支持動態加載插件。

<!-- plugin.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<plugin><id>com.example.texteditor</id><name>Text Editor Plugin</name><version>1.0.0</version><author>Example Inc.</author><class>TextEditorPlugin</class><dependencies><dependency>core</dependency></dependencies>
</plugin>

3.6 國際化(i18n)與翻譯文件

Qt 的翻譯文件(.ts)基于 XML 格式,用于存儲不同語言的翻譯文本。

<!-- translations.ts -->
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN"><context><name>MainWindow</name><message><source>File</source><translation>文件</translation></message><message><source>Edit</source><translation>編輯</translation></message></context>
</TS>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82297.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82297.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82297.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

day24Node-node的Web框架Express

1. Express 基礎 1.1 什么是Express node的web框架有Express 和 Koa。常用Express 。 Express 是一個基于 Node.js 的快速、極簡的 Web 應用框架,用于構建 服務器端應用(如網站后端、RESTful API 等)。它是 Node.js 生態中最流行的框架之一,以輕量、靈活和易用著稱。 …

uniapp實現的簡約美觀的票據、車票、飛機票模板

采用 uniapp 實現的一款簡約美觀的票據模板&#xff0c;純CSS、HTML實現&#xff0c;用戶完全可根據自身需求進行更改、擴展&#xff1b;支持web、H5、微信小程序&#xff08;其他小程序請自行測試&#xff09;&#xff0c; 可到插件市場下載嘗試&#xff1a; https://ext.dclo…

esp32+IDF V5.1.1版本編譯freertos報錯

error: portTICK_RATE_MS undeclared (first use in this function); did you mean portTICK_PERIOD_MS 解決方法: 使用命令 idf.py menuconfig 打開配置界面配置freeRtos 使能configENABLE_BACKWARD_COMPATIBLITY

vue 水印組件

Watermark.vue <script setup lang"ts"> import { ref, onMounted, onUnmounted, watch } from vue;interface Props {text?: string;fontSize?: number;color?: string;rotate?: number;zIndex?: number;gap?: number; }const props withDefaults(def…

hbuilder中h5轉為小程序提交發布審核

【注意】 [HBuilder] 11:59:15.179 此應用 DCloud appid 為 __UNI__9F9CC77 &#xff0c;您不是這個應用的項目成員。1、聯系這個應用的所有者&#xff0c;請求加入項目成員&#xff08;https://dev.dcloud.net.cn "成員管理"-"添加項目成員"&#xff09;…

QT之INI、JSON、XML處理

文章目錄 INI文件處理寫配置文件讀配置文件 JSON 文件處理寫入JSON讀取JSON XML文件處理寫XML文件讀XML文件 INI文件處理 首先得引入QSettings QSettings 是用來存儲和讀取應用程序設置的一個類 #include "wrinifile.h"#include <QSettings> #include <QtD…

道德經總結

道德經 《道德經》是中國古代偉大哲學家老子所著&#xff0c;全書約五千字&#xff0c;共81章&#xff0c;分為“道經”&#xff08;1–37章&#xff09;和“德經”&#xff08;38–81章&#xff09;兩部分。 《道德經》是一部融合哲學、政治、人生智慧于一體的經典著作。它提…

行為型:迭代器模式

目錄 1、核心思想 2、實現方式 2.1 模式結構 2.2 實現案例 3、優缺點分析 4、適用場景 1、核心思想 目的&#xff1a;將遍歷邏輯與數據存儲結構解耦 概念&#xff1a;提供一種機制來按順序訪問集合中的各元素&#xff0c;而不需要知道集合內部的構造 舉例&#xff1a;…

人臉識別技術合規備案最新政策詳解

《人臉識別技術應用安全管理辦法》將于2025年6月1日正式實施&#xff0c;該辦法從技術應用、個人信息保護、技術替代、監管體系四方面構建了人臉識別技術的治理框架&#xff0c;旨在平衡技術發展與安全風險。 一、明確技術應用的邊界 公共場所使用限制&#xff1a;僅在“維護公…

如何把vue項目部署在nginx上

1&#xff1a;在vscode中把vue項目打包會出現dist文件夾 按照圖示內容即可把vue項目部署在nginx上

奇好 PDF安全加密 + 自由拆分合并批量處理 OCR 識別

各位辦公小能手們&#xff0c;你們好呀&#xff01;今天我要給大家介紹一款超厲害的軟件——奇好PDF。它就像是一個PDF文檔處理的超級大管家&#xff0c;啥功能都有&#xff0c;格式轉換、編輯、提取、安全保護這些統統不在話下&#xff0c;不管是辦公、學習&#xff0c;還是設…

Docker-Harbor 私有鏡像倉庫使用指南

1.用戶管理 為項目創建專用用戶&#xff0c;并配置權限&#xff0c;確保該用戶能夠順利推送鏡像到 Harbor 倉庫&#xff0c;確保鏡像推送操作的安全性和便捷性。 創建完成后可以根據需要選擇是否設置為管理員 角色 權限描述 適用場景 系統管理員 擁有系統的完全控制權限 運維…

HomeAssistant開源的智能家居docker快速部署實踐筆記(CentOS7)

1. SGCC_Electricity 應用介紹 SGCC_Electricity 是一個用于將國家電網&#xff08;State Grid Corporation of China&#xff0c;簡稱 SGCC&#xff09;的電費和用電量數據接入 Home Assistant 的自定義集成組件。通過該應用&#xff0c;用戶可以實時追蹤家庭用電量情況&…

maven 3.0多線程編譯提高編譯速度

mvn package 默認只使用 單線程 來執行構建生命周期&#xff08;即順序地構建每一個模塊&#xff09;。 如果你使用的是多模塊項目&#xff0c;Maven 從 3.0 開始提供了**并行構建&#xff08;parallel build&#xff09;**的能力&#xff0c;但它不是默認開啟的。 如何啟用多…

python模塊管理環境變量

概要 在 Python 應用中&#xff0c;為了將配置信息與代碼分離、增強安全性并支持多環境&#xff08;開發、測試、生產&#xff09;運行&#xff0c;使用專門的模塊來管理環境變量是最佳實踐。常見工具包括&#xff1a; 標準庫 os.environ&#xff1a;直接讀取操作系統環境變量…

K8s 集群運行時:從 Docker 升級到 Containerd

一、背景&#xff1a;Kubernetes容器運行時演進史 自2020年Kubernetes 1.20版本宣布棄用Docker作為默認容器運行時以來&#xff0c;容器技術生態經歷了重大變革。作為CNCF畢業項目&#xff0c;Containerd憑借其輕量化架構、原生CRI支持和卓越性能表現&#xff0c;逐漸成為云原生…

30-消息隊列

一、消息隊列概述 隊列又稱消息隊列&#xff0c;是一種常用于任務間通信的數據結構&#xff0c;隊列可以在任務與任務間、 中斷和任務間傳遞信息&#xff0c;實現了任務接收來自其他任務或中斷的不固定長度的消息&#xff0c;任務能夠從隊列里面讀取消息&#xff0c;當隊列中的…

AI Agent開發第74課-解構AI偽需求的魔幻現實主義

開篇 ??在之前的系列中我們狂炫了AI Agent的各種高端操作(向量數據庫聯動、多模態感知、動態工作流等…),仿佛每個程序員都能用LLM魔法點石成金?。 但今天咱們要潑一盆透心涼的冷水——當企業把AI當成萬能膠水強行粘合所有需求時,連電風扇都能被玩出量子糾纏的魔幻現實…

低代碼AI開發新趨勢:Dify平臺化開發實戰

在人工智能快速發展的今天&#xff0c;AI應用的開發方式也在不斷演變。從傳統的手寫代碼到如今的低代碼甚至零代碼開發&#xff0c;技術的進步讓更多的非專業開發者也能輕松上手。本文將帶你走進Dify平臺化開發的世界&#xff0c;探索如何通過這一強大的低代碼AI開發平臺&#…

開發積累總結

export default 和export const 均用于從模塊導出函數、對象或原始值&#xff0c;區別在于&#xff1a; export default&#xff1a;一個文件中只能有一個&#xff0c;為默認導出&#xff0c;在引用時指定名字。 export const&#xff1a;一個文件中有多個&#xff0c;為命名…