QT中QDomDocument读写XML文件

一、XML文件

<?xml version="1.0" encoding="UTF-8"?>
<Begin>
    <Type name="zhangsan">
        <sex>boy</sex>
        <school>Chengdu</school>
        <age>18</age>
        <special>handsome</special>
    </Type>
    <Type name="lisi">
        <sex>boy</sex>
        <school>Xian</school>
        <age>19</age>
        <special>ugly</special>
    </Type>
</Begin>

<?xml version="1.0" encoding="UTF-8"?>版本说明与编号

“Begin”根节点,可以理解为一级目录

”TypeX“是子节点,可以理解为二级目录;”name“是属性,”zhangsan“是属性值

“sex”“school”等是三级节点,可以理解为三级目录;”girl“”“Xian”等是文本;

二、QT中的QDomDocument类

使用时需要添加xml模块。

qt帮助手册简单例子

三、实际代码操作读写操作

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFile>
#include <QDomDocument>
#include <QDebug>
#include <QMessageBox>
#include <QFileDialog>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private:
    void my_xml_read();
    void my_xml_write();
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //xml读写
    my_xml_read();
    my_xml_write();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::my_xml_read()
{
    QDomDocument doc("info");
    QFile file(":/info.xml");
    if (!file.open(QIODevice::ReadOnly))
      return;
    if (!doc.setContent(&file))//将文件与DomDocument关联
    {
      file.close();
      return;
    }
    file.close();

    QDomElement firstElem = doc.documentElement();//获取到了<begin>一级目录
    qDebug()<<"一级目录<begin>: "<<firstElem.nodeName();
    QDomNodeList secondList = firstElem.childNodes();//获取全部二级目录<Type1><Type2><Typ3>
    for (int i = 0; i < secondList.count(); ++i) {
        QString str = QString("      第 %1 个二级目录节点:").arg(i+1);
        qDebug()<<str.toUtf8().data()<<secondList.at(i).nodeName();//将QString转换成char *,使用qDebug输出没有引号
        QDomElement secondElem = secondList.at(i).toElement();//获取二级目录节点的属性值管理者domElement
        if(secondElem.hasAttribute("name")){
            //输出二级目录节点的属性值
            qDebug()<<"      "<<secondElem.nodeName().append("的属性值name为").toUtf8().data()<<secondElem.attribute("name");
        }
        else{
            qDebug()<<"      "<<secondElem.nodeName().append("该节点无属性值").toUtf8().data();
        }
        QDomNodeList thirdList = secondList.at(i).childNodes();//获取三级目录<具体值></具体值>
        for(int j = 0;j<thirdList.length();j++ ){
            QDomElement thirdElement=thirdList.at(j).toElement();
            QString str_1 = QString("            %1中第 %2 个三级目录节点 %3,他的文本值为 %4:")
                    .arg(secondList.at(i).nodeName(),QString::number(j+1),thirdList.at(j).nodeName(),thirdElement.text());
            qDebug()<<str_1.toUtf8().data();//将QString转换成char *,使用qDebug输出没有引号
        }
    }
}

void MainWindow::my_xml_write()
{
    //add instruction
    QDomDocument doc;
    QDomProcessingInstruction instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");//写xml中的第一行说明
    doc.appendChild(instruction);

    //add 第一级目录节点
    QDomElement firstNode = doc.createElement("Begin");
    doc.appendChild(firstNode);

    //add 第二级目录节点
    QDomElement secondNode = doc.createElement("Type");
    //为二级目录添加属性值
    QDomAttr secondAttr = doc.createAttribute("MyLover");
    secondAttr.setValue("lr");
    secondNode.setAttributeNode(secondAttr);
    firstNode.appendChild(secondNode);//一级目录下添加二级节点
    //add 第三级目录节点 添加text文本值
    QDomElement thirdNode_1 = doc.createElement("sex");
    secondNode.appendChild(thirdNode_1);
    QDomText t1 = doc.createTextNode("girl");
    thirdNode_1.appendChild(t1);
    QDomElement thirdNode_2 = doc.createElement("school");
    secondNode.appendChild(thirdNode_2);
    QDomText t2 = doc.createTextNode("Chengdu");
    thirdNode_2.appendChild(t2);
    QDomElement thirdNode_3 = doc.createElement("age");
    secondNode.appendChild(thirdNode_3);
    QDomText t3 = doc.createTextNode("28");
    thirdNode_3.appendChild(t3);
    QDomElement thirdNode_4 = doc.createElement("special");
    secondNode.appendChild(thirdNode_4);
    QDomText t4 = doc.createTextNode("beautiful");
    thirdNode_4.appendChild(t4);
    QString fileName = QFileDialog::getSaveFileName(this,"Save xml file",
                                                        "../my_xml","xml(*.xml)");
    if(fileName.isEmpty()){
        return;
    }
    QFile myFile(fileName);
    bool ret =myFile.open(QIODevice::WriteOnly|QIODevice::Text);
    if(!ret){
        QMessageBox::warning(this,"warning","保存文件失败!");
        return;
    }
    QTextStream stream(&myFile);//使用QTextStream类与文件关联进行保存xml!
    stream.setCodec("UTF-8");//编码格式
    doc.save(stream,4);//4代表的是缩进个数
    myFile.close();
    QMessageBox::information(this,"save tip","xml文件保存成功!");
}

四、项目运行

与写操作写的信息一致

好的,这是一个关于 Qt 的问题。QDomDocumentQt 用于读写 XML 文件的类。其主要功能是将 XML 文件解析成 DOM 树表示,从而可以方便地进行修改、查询和输出操作。 在 Qt 使用 QDomDocument 读写 XML 文件的步骤如下: 1. 创建 QDomDocument 对象,并设置 XML 文件的版本、编码和根节点。 2. 通过 QDomDocument 对象的 createElement() 方法创建节点,并通过 appendChild() 方法将其添加到 DOM。 3. 通过 QDomDocument 对象的 createTextNode() 方法创建文本节点,并通过 appendChild() 方法将其添加到 DOM。 4. 通过 QDomDocument 对象的 toByteArray() 方法将 DOM 树输出到字节数组,或通过 save() 方法将 DOM 树保存到 XML 文件。 以下是一个简单的示例代码,演示了如何使用 QDomDocument 读写 XML 文件: ```cpp #include <QFile> #include <QDomDocument> int main() { // 创建 QDomDocument 对象 QDomDocument doc; // 设置 XML 文件的版本和编码 doc.appendChild(doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"")); // 创建根节点 QDomElement root = doc.createElement("root"); doc.appendChild(root); // 创建子节点 QDomElement child = doc.createElement("child"); root.appendChild(child); // 创建文本节点 QDomText text = doc.createTextNode("Hello, world!"); child.appendChild(text); // 将 DOM 树输出到字节数组 QByteArray xml = doc.toByteArray(); // 将 DOM 树保存到 XML 文件 QFile file("test.xml"); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream out(&file); out << doc.toString(); file.close(); } return 0; } ``` 这段代码创建了一个名为 test.xmlXML 文件,其内容为: ```xml <?xml version="1.0" encoding="UTF-8"?> <root> <child>Hello, world!</child> </root> ``` 希望这个示例代码可以帮助你了解如何使用 QDomDocumentQt 读写 XML 文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值