首页 > 其他分享 >Qt 读写XML文件

Qt 读写XML文件

时间:2023-07-10 11:25:08浏览次数:40  
标签:XML appendChild QDomElement Qt doc 读写 学生 节点

Qt 对 XML 的读写操作

1、简介

使用XML模块,在.pro文件中添加 QT += xml ,并加如相应的头文件

#include <QtXml>
#include <QDomDocument> 或者 #include <QXmlStreamReader>
QtXml模块提供了一个读写XML文件的流,解析方法包含DOM和SAX。


(1)DOM(Document ObjectModel):将XML文件表示成一棵树,便于随机访问其中的节点,但消耗内存相对多一些。


(2)SAX(Simple APIfor XML):一种事件驱动的XML API,接近于底层,速度较快,但不便于随机访问任意节点。

1、常用方法
1、创建节点

QDomElement element = doc.createElements();

2、设置节点的值

QDomText text = doc.createTextNode("aaa");

element.appendChild(text);

3、创建并添加属性

QDomAttr attr = doc.createAttribute("attrName");

attr.setValue("value");

element.setAttributeNode(attr);

4、获取第一个子节点

QDomNode node = element.firstChild();

5、获取下一个节点

QDomNode nextNode = node.nextSibling();

2、示例
2.1、写文件

// 写 XML 文件
void wirteXml()
{
    // 文件路径
    QString fileName = "test.xml";
    QFile file(fileName);
    if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
    {
        return;
    }
 
    QTextStream out(&file);
    QDomDocment doc;
    // 文件头
    QDomProcessingInstruction instruction = doc.createProcessingInstruction("xml", "version = \'1.0\' encoding = \'UTF-8\'")
    doc.appendChild(instruction);
 
    // 添加一级节点 (学生集合)
    QDomElement studentsElement = doc.createElement("Students");
    // 添加学生集合的属性
    QDomAttr attr = doc.createAttribute("bool");
    attr.setValue("true");
    doc.setAttributeNode(attr);
 
    doc.appendChild(ScenariosElement);
 
    // 添加学生1
    QDomElement studentElement1 = doc.createElement("Student");
    StudentsElement.appendChild(studentElement1);
 
    // 添加学生1的信息
    QDomElement id1 = doc.createElement("id");    // 学生编号
    QDomText idText1 = doc.createTextNode("1");    // 学生编号内容
    id1.appendChile(idText1);
    StudentElement1.appendChild(id1);
    QDomElement name1 = doc.createElement("name");    // 学生名称
    QDomText nameText1 = doc.createTextNode("小明");    // 学生编号内容
    name1.appendChile(nameText1);
    StudentElement1.appendChild(name1);
 
    // 添加学生2
    QDomElement studentElement2 = doc.createElement("Student");
    StudentsElement.appendChild(studentElement2);
 
    // 添加学生2的信息
    QDomElement id2 = doc.createElement("id");    // 学生编号
    QDomText idText2 = doc.createTextNode("2");    // 学生编号内容
    id2.appendChile(idText2);
    StudentElement2.appendChild(id2);
    QDomElement name2 = doc.createElement("name");    // 学生名称
    QDomText nameText2 = doc.createTextNode("小红");    // 学生编号内容
    name2.appendChile(nameText2);
    StudentElement2.appendChild(name2);
 
    // 每下一级,前面多两个空格
    doc.save(out, 2)
}

会生成以下 xml 文件:

<?xml version = '1.0' encoding = 'UTF-8'?>
<Studnets>
  <Student>
    <id>1</id>
    <name>小明</name>
  </Student>
  <Student>
    <id>2</id>
    <name>小红</name>
  </Student>
</Students>

2.2、读文件

定义结构体

// 定义学生结构体
struct Student
{
    QString id;    // 学生编号
    QString name;    // 学生名称
}

读文件:

// 读 XML 文件
std::vector<Student> readXml()
{
    // 学生集合 (返回值)
    std::vector<Student> students;
 
    // 创建 QDomDocument 对象
    QDomDocment doc;
    // 指定读取的 xml 文件路径
    QFile file("test.xml");
    // xml 文件以只读的方式打开
    if(!file.open(QIODevice::ReadOnly))
    {
        return students;
    }
 
    if(!doc.setContent(&file))
    {
        file.close();
        return students;
    }
    file.close();
 
    // 获取 doc 中的 QDomElement 对象 (学生集合)
    QDomElement studentsElement = doc.documentElement();
    
    // 获取二级节点(学生节点)
    QDomNode studentNode = studentsElement.firstChild();
 
    // 循环学生节点
    while (!studentNode .isNull())
    {
        Student student;    // 学生
        QDomElement studentElement = studentNode.toElement();
        QDomNode idNode = studentElement.firstChild();    // 获取第一个子节点(编号)
        student.id = idNode.toElement().text();
 
        QDomNode nameNode = idNode.nextSibling();    // 获取编号的下一个节点(名称)
        student.name = nameNode.toElement().text();
        
        students.push_back(student);
        studentNode = studentElement.nextSibling();    // 循环获取下一个学生
    }
    return studnets
}

转载:https://blog.csdn.net/louxiaofei_java/article/details/127744483

标签:XML,appendChild,QDomElement,Qt,doc,读写,学生,节点
From: https://www.cnblogs.com/wjblog666/p/17540448.html

相关文章

  • ekf 扩展卡尔曼滤波定位 qt仿真程序 粒子滤波定位
    ekf扩展卡尔曼滤波定位qt仿真程序粒子滤波定位YID:6830622857944996......
  • Qt源码阅读(五)-deleteLater
    QtdeleteLater作用及源码分析个人经验总结,如有错误或遗漏,欢迎各位大佬指正......
  • Qt/C++原创项目作品精选(祖传原创/性能凶残)
    00前言说明从事Qt开发十年有余,一开始是做C#.NET开发的,因为项目需要,转行做嵌入式linux开发,在嵌入式linux上做可视化界面开发一般首选Qt,当然现在可选的方案很多比如安卓,但是十多年前那时候板子性能低,安卓在这个上面跑的话卡成屎,当时的内存大概是128MB左右,Qt也是主要用QWidget,刚出......
  • 解决高可用集群篇(三)-- MySQL主从复制&ShardingSphere读写分离分库分表的具体操作步
    高可用集群篇(三)--MySQL主从复制&ShardingSphere读写分离分库分表1.什么是MySQL主从复制?MySQL主从复制是指将一个MySQL数据库服务器作为主服务器,其他MySQL服务器作为从服务器,通过将主服务器上的数据变更同步到从服务器上,实现数据的复制和同步的过程。主从复制的实现方式主......
  • Qt使用过程中的一些问题
    1.qt.gui.imageio:libpngwarning:iCCP:knownincorrectsRGBprofile在Qt开发过程中使用了一些png图片导致报了这个信息,是因为这些png图片中嵌入了icc颜色管理模块导致。解决方法:下载JQTools工具,然后点击“Qt相关”->“PNG告警消除”,选择图片进行转换便可以消除告警。......
  • python: PyQt5 beginner
     fromPyQt5.QtWidgetsimportQWidget,QApplication,QMainWindow,QLabel,QPushButtonfromPyQt5importQtCore,QtGuiimportsysimportosdefclick():print("HyButtonisclicked!")#Pressthegreenbuttonintheguttertorunthescri......
  • Delphi12支持全屏显示启动界面的styles.xml
    <resourcesxmlns:android="http://schemas.android.com/apk/res/android"><stylename="AppTheme"parent="@android:style/Theme.Material.Light.NoActionBar"><itemname="android:navigationBarColor&qu......
  • mybatis: 正确使用mybatis中的mapperLocations配置多个xml扫描路径
    <!--myBatis文件--><beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean"><propertyname="dataSource"ref="dataSource"/><!--自动扫描entity目录,省掉Configu......
  • 如何实现Java mqtt 客户端,收到自己发出消息的具体操作步骤
    实现JavaMQTT客户端收到自己发出的消息介绍在本文中,我将教会你如何使用Java实现一个MQTT(MessageQueuingTelemetryTransport)客户端,以接收自己发出的消息。MQTT是一个轻量级的消息协议,广泛应用于物联网和实时通信领域。我们将使用EclipsePaho库来实现这个功能。整体流程下面......
  • 学习 Qt 编程的好书推荐
    最近一段时间,陆陆续续给大家更新了不少基于Qt开发的不错的书籍,可以说每本都不错。不过放在这一堆大家也不知道先看哪个,后看哪个?所以这块给大家列举一下学习的顺序:由浅入深。大家也可以根据自己对于Qt方面的热衷程度与想要学习的深度来决定该看到哪本书籍。1、《QtCreator快......