当前位置: 首页 > news >正文

【QT文件操作】---xml文件读取

XML(可扩展标记语言,eXtensible Markup Language)是一种用于存储和传输数据的文本格式,广泛用于配置文件、数据交换和文档表示。XML 文件具有明确的结构和标记,这使得它能够描述复杂的层次结构和数据关系。

xml和html的区别?

  1. xml标签和属性可自定义,html标签和属性固定不可自定义
  2. xml注重在数据的本身作为数据承载一个标签的定义就是为了承载一个数据,HTML注重的是数据的显示方式,一个标签的使用是为了页面的结构化和需求

XML 文件的基本结构

  1. 声明(可选)
    XML 文件通常以一个 XML 声明开始,指示 XML 版本和字符编码:
<?xml version="1.0" encoding="UTF-8"?>
  1. 根元素
    XML 文件必须有一个唯一的根元素,所有其他元素都包含在这个根元素中:
<root><!-- 子元素 -->
</root>
  1. 元素
    元素是 XML 的基本组成部分,每个元素都有一个开始标签和一个结束标签,标签之间的内容为元素的内容:
<element>内容</element>
  1. 属性
    元素可以有属性,属性提供了额外的信息,并位于开始标签中:
<element attribute="value">内容</element>
  1. 嵌套元素
    元素可以嵌套其他元素,形成层次结构:
<parent><child>内容</child>
</parent>
  1. 注释
    注释可以添加到 XML 文件中,以提供额外的信息或说明,但不会影响 XML 的处理:
<!-- 这是一个注释 -->

QT设置xml常用类

处理XML的主要类是QDomDocument、QDomElement、QDomNode、QXmlStreamReader和QXmlStreamWriter。这些类分别用于读取、写入、解析和操作XML文档。

1. QDomDocument

用途: 用于处理和操作整个 XML 文档的 DOM(文档对象模型)结构。
QDomDocument 以树形结构读取、修改和创建 XML 文档。

主要功能:
  • 解析 XML 文档字符串或文件,生成一个 DOM 树。
  • 提供访问和操作 XML 文档节点的方法。
  • 支持创建新节点、修改现有节点以及保存 XML 文档到文件。

示例代码:

QDomDocument doc;
QFile file("example.xml");
if (file.open(QIODevice::ReadOnly) && doc.setContent(&file)) {// 处理 XML 文档
}

2. QDomElement

用途: 代表 XML 文档中的一个元素节点。它是 DOM 树中节点的一个具体类型,用于访问和操作元素的属性和文本内容。

主要功能:
  • 获取和设置元素的属性。
  • 获取元素的子元素、文本内容等。
  • 通过 QDomElement 对象可以修改 XML 元素的内容和属性。

示例代码:

QDomElement element = doc.documentElement(); // 获取根元素
QString value = element.attribute("attributeName"); // 获取属性值

3. QDomNode

用途: 代表 XML 文档中的一个节点。QDomNode 是一个通用的节点类,可以表示元素节点、属性节点、文本节点等。

主要功能:
  • 提供节点的类型、父节点、子节点等通用操作。
  • 通过 QDomNode 可以访问不同类型的节点,但要将其转换为具体类型(如 QDomElement、QDomText)才能进一步操作。

示例代码:

QDomNode node = doc.firstChild();
if (node.isElement()) {QDomElement element = node.toElement();
}

4. QXmlStreamReader

用途: 用于逐步读取 XML 数据,适用于处理大规模的 XML 数据,因为它以流式方式解析 XML 文件,不需要将整个文件加载到内存中。

主要功能:
  • 按顺序读取 XML 文档中的节点。
  • 适用于从头到尾逐个处理 XML 数据流,节省内存。
  • 只提供读取操作,不支持修改 XML 数据。

示例代码:

QXmlStreamReader reader(&file);
while (!reader.atEnd()) {if (reader.readNext() == QXmlStreamReader::StartElement) {QStringRef name = reader.name();// 处理元素}
}

5. QXmlStreamWriter

用途: 用于逐步写入 XML 数据,适用于生成或修改 XML 文件。与 QXmlStreamReader 配合使用可以有效地处理 XML 数据流。

主要功能:
  • 提供逐步写入 XML 元素、属性、文本等功能。
  • 可以逐个构建 XML 文档,适用于内存受限或需要动态生成 XML 文件的场景。

示例代码:

QXmlStreamWriter writer(&file);
writer.setAutoFormatting(true);
writer.writeStartDocument();
writer.writeStartElement("root");
writer.writeTextElement("child", "value");
writer.writeEndElement();
writer.writeEndDocument();

使用QDomDocument进行XML读写

读取数据:
#include <QDomDocument>
#include <QFile>
#include <QTextStream>bool readXml(const QString &fileName) {QFile file(fileName);if (!file.open(QIODevice::ReadOnly)) {qWarning("Failed to open file for reading");return false;}QDomDocument doc;if (!doc.setContent(&file)) {file.close();qWarning("Failed to parse XML");return false;}file.close();//返回根节点QDomElement root = doc.documentElement();//返回 root 元素下所有名称为 "item" 的子元素QDomNodeList items = root.elementsByTagName("item");//遍历 items 中的所有元素for (int i = 0; i < items.count(); ++i) {QDomElement element = items.at(i).toElement();QString name = element.attribute("name"); //从 element 中获取名为 "name" 的属性值QString value = element.text();qDebug() << "Item:" << name << value;}return true;
}
写入数据:
#include <QDomDocument>
#include <QFile>
#include <QTextStream>bool writeXml(const QString &fileName) {QDomDocument doc;//文档对象创建一个标签QDomElement root = doc.createElement("root");doc.appendChild(root);QDomElement item = doc.createElement("item");//为标签添加属性item.setAttribute("name", "example");item.appendChild(doc.createTextNode("This is an example item"));//为root添加子标签root.appendChild(item);QFile file(fileName);if (!file.open(QIODevice::WriteOnly)) {qWarning("Failed to open file for writing");return false;}//保存文件QTextStream stream(&file);stream << doc.toString();file.close();return true;
}

http://www.mrgr.cn/news/3493.html

相关文章:

  • 火山引擎AI创新巡展:豆包比友商便宜98%,行业落地探索,2000人座无虚席,PPT值得拍照收藏
  • CSS的:host伪类:精确定位于Web组件的指南
  • 谷歌浏览器-network中请求的query string parmeters和request payload的区别
  • 如何为PDF文件设置打开密码以保护文档安全
  • HarmonyOS NEXT - 数据持久化存储(key,value进行AES加密处理)
  • Linux内核实践(一)驱动DS18B20传感器的完整流程解析(涵盖字符设备、单总线、设备树等)
  • 国外代理IP选择:IP池的大小有何影响
  • 面试高频-深拷贝和浅拷贝
  • C/C++控制台贪吃蛇游戏的实现
  • esbuild中的Base64 Loader:轻松将文件编码为Base64字符串并嵌入代码
  • linux(arm)移植 macchanger
  • 有了这4款工具,你就知道电脑怎么录屏了!
  • CTRL-C论文解析
  • JS(三)——更改html内数据
  • MySQL 重复数据操作
  • 微服务多个模块启动,端口被占用,yml配置文件读不到
  • 【48 Pandas+Pyecharts | 2024年巴黎奥运会奖牌数据分析可视化】
  • 废品回收小程序,开启上门回收模式
  • 【ARM Hypervisor And SMMU 系列 5 -- SMMU 和 IOMMU技术】
  • 计算机基础之Cache的缓存命中率不随其容量线性增加的原理