Qt 读写XML文件

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

posted @   wjblog666  阅读(1292)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
点击右上角即可分享
微信分享提示