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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;为命名…