当前位置: 首页 > 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.lryc.cn/news/430022.html

相关文章:

  • 科研软件 | Diamond 4.6 安装教程
  • 利用keepalived达成服务高可用
  • Dumpy:一款针对LSASS数据的动态内存取证工具
  • TinyEngine是什么?
  • FPGA跨时钟域处理
  • 【Docker深入浅出】Docker镜像
  • “LOCAL_LISTENER”参数导致业务无法连接数据库,文末附Oracle连接故障检查监听的排查流程
  • Vmware虚拟机接入物理机路由器网络
  • yolov8旋转框+关键点检测
  • Qt-QWidget的windowTitle属性(13)
  • RCE编码绕过--php://filter妙用
  • FactoryBean 与 BeanFactory
  • 【迅为RK3568开发板】OpenHarmony学习开发系列教程(第2期 南向基础篇一)
  • 编程修炼之Hibernate--- springboot启动初始化ddl过程与如何自定义修改 table 字段长度
  • TOMCAT入门到精通
  • Android笔试面试题AI答之Kotlin(18)
  • Linux基础知识学习(五)
  • 股票买卖的思路与代码
  • Eureka Server与Eureka Client详解:服务注册与发现的交互机制
  • php-fpm 如何查看哪个正在执行死循环 并终止
  • 电脑硬盘坏了怎么恢复数据?
  • cdga|某大型企业数据治理的成功转型:构建数据驱动的竞争力新引擎
  • C#使用 ModeBusTCP读取汇川Easy521PLC
  • PostgreSQL的postgres主进程
  • Java实现K个排序链表的高效合并:逐一合并、分治法与优先队列详解
  • Xinstall揭秘:高效App推广背后的黑科技
  • 星巴克VS瑞幸,新王、旧王之争给新CEO带来哪些启示
  • C语言 | Leetcode C语言题解之第354题俄罗斯套娃信封问题
  • 大型俄罗斯国际展览会介绍
  • CST软件仿真案例:圆极化平板天线仿真02