Qt 读写XML文件

目录

1、常用方法

2、示例

2.1、写文件

2.2、读文件

Qt 对 XML 的读写操作

 1、简介

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

#include  
#include   或者  #include 

 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 文件:



  
    1
    小明
  
  
    2
    小红
  

2.2、读文件

定义结构体:

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

读文件:

// 读 XML 文件
std::vector readXml()
{
    // 学生集合 (返回值)
    std::vector 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
}

你可能感兴趣的:(QT,c++,qt,qt5,xml)