Qt之XML读写操作——含Demo

目录

前言

1、XML写操作

2、XML读操作

3、运行结果

4、Demo下载


前言

        QtXml模块提供了一个读写XML文件的流,解析方法包含DOM和SAX。DOM(Document ObjectModel):将XML文件表示成一棵树,便于随机访问其中的节点,但消耗内存相对多一些。SAX(Simple APIfor XML):一种事件驱动的XML API,接近于底层,速度较快,但不便于随机访问任意节点。
       使用XML模块,在.pro文件中添加QT += xml,并加如相应的头文件#include <QDomDocument>

        参考博客:[QT操作XML]QT读写XML文件,QT修改XML文件icon-default.png?t=M4ADhttps://blog.csdn.net/weixin_40355471/article/details/106524574?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165384780716782425157275%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165384780716782425157275&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-3-106524574-null-null.142^v11^pc_search_result_control_group,157^v12^control&utm_term=Qt++xml&spm=1018.2226.3001.4187

1、XML写操作

        QDomDocument类代表整个的XML文件。概念上讲:它是文档树的根节点,并提供了文档数据的基本访问方法。由于元素、文本节点、注释、指令执行等等不可能脱离一个文档的上下文,所以文档类也包含了需要用来创建这些对象的工厂方法。被创建的节点对象有一个ownerDocument()函数,它将对象与对象常见的文档上下文环境关联起来。DOM类中最常使用的是QDomNode、QDomDocument、QDomElement和QDomText。

void QtXmlDemo::writeXml(){
    QDomDocument domDoc;
    QDomProcessingInstruction version = 
        domDoc.createProcessingInstruction("xml", "version = \"1.0\" encoding = \"GB2312\"");
    domDoc.appendChild(version);

    QDomElement domRootElement = domDoc.createElement("Fantast");   //创建顶节点
    domDoc.appendChild(domRootElement);
    QDomElement itemRootElement = domDoc.createElement("teacher");  //创建父节点
    {
        QDomElement node1 = domDoc.createElement("tearchName");           //创建子结点
        QDomText domText1 = domDoc.createTextNode("tearchName");
        domText1.setData(ui.writeTearchName->text());             //设置子结点数据
        node1.appendChild(domText1);                                //将子节点数据绑定
        itemRootElement.appendChild(node1);                         //将子节点帮到父节点

        QDomElement node2 = domDoc.createElement("schoolName");
        QDomText domText2 = domDoc.createTextNode("schoolName");
        domText2.setData(ui.writeSchoolName->text());
        node2.appendChild(domText2);
        itemRootElement.appendChild(node2);

        QDomElement node3 = domDoc.createElement("tearchYear");
        QDomText domText3 = domDoc.createTextNode("tearchYear");
        domText3.setData(QString::number(ui.wirteTearchYear->text().toInt()));
        node3.appendChild(domText3);
        itemRootElement.appendChild(node3);

        QDomElement node4 = domDoc.createElement("course");
        QDomText domText4 = domDoc.createTextNode("course");
        domText4.setData(ui.writeCourse->text());
        node4.appendChild(domText4);
        itemRootElement.appendChild(node4);

        QDomElement node5 = domDoc.createElement("grade");
        QDomText domText5 = domDoc.createTextNode("grade");
        domText5.setData(ui.writeGrade->text());
        node5.appendChild(domText5);
        itemRootElement.appendChild(node5);

        QDomElement node6 = domDoc.createElement("cityName");
        QDomText domText6 = domDoc.createTextNode("cityName");
        domText6.setData(ui.writeCity->text());
        node6.appendChild(domText6);
        itemRootElement.appendChild(node6);
    }
    domRootElement.appendChild(itemRootElement);                        //绑定到顶结点

    QFile m_file;
    m_file.setFileName("ReadWrite.xml");
    if (m_file.open(QIODevice::ReadWrite | QFile::Text)) {
        m_file.write(domDoc.toString().toLocal8Bit().data());
        m_file.close();
    }
}

2、XML读操作

        解析后的XML文件在内部是通过一个对象树来表示的,对象树可以使用各种QDom类进行访问。所有的QDom类只引用内部树上的对象。一旦最后一个DOM树的QDom对象和QDocument本身被删除掉时,DOM树上的所有内部对象会被删除掉。元素、文本节点等的创建是通过使用类提供的各种工厂方法完成的。使用QDom类的缺省构造函数只会生成空的对象,这些空的对象不能操作,也不能写入到文档中。

        QDomDocument::setContent()完成XML文档的设置,他从QFile对象中读取XML数据并检测XML文档的编码。setContent()有几种重载形式,可以分别从QByteArray、QString、QIODevice、QXmlInputSource中读取XML数据。

void QtXmlDemo::readXml() {
    QFile m_file;
    m_file.setFileName("ReadWrite.xml");
    if (m_file.open(QIODevice::ReadWrite | QFile::Text)) {
        QDomDocument doc;

        if (!doc.setContent(&m_file))
        {
            m_file.close();
            qDebug() << " Read Open Xml false";
            return;
        }
        qDebug() << " Read Open Xml true";

        QDomElement root = doc.documentElement();           //读取根节点
        QDomNode node = root.firstChild();                  //读取第一个父节点

        while (!node.isNull())
        {
            QDomNodeList sonNodeList = node.childNodes();       //读取子结点集合
            QString rootName = node.toElement().tagName();  //读取父节点名字
            if (rootName.compare("teacher") == 0)
            {//将子结点集合传进去读取子结点数据
                for (int sonNode = 0; sonNode < sonNodeList.size(); sonNode++)
                {
                    QDomElement sonElement = sonNodeList.at(sonNode).toElement();       //获取子结点
                    if (sonElement.toElement().tagName().compare("tearchName") == 0)          //与取出子结点进行对比
                    {
                        ui.readTearchName->setText(sonElement.text());
                    }
                    else if (sonElement.toElement().tagName().compare("schoolName") == 0)
                    {
                        ui.readSchoolName->setText(sonElement.text());
                    }
                    else if (sonElement.toElement().tagName().compare("tearchYear") == 0)
                    {
                        ui.readTearchYear->setText(QString::number(sonElement.text().toInt()));
                    }
                    else if (sonElement.toElement().tagName().compare("course") == 0)
                    {
                        ui.readCourse->setText(sonElement.text());
                    }
                    else if (sonElement.toElement().tagName().compare("grade") == 0)
                    {
                        ui.readGrade->setText(sonElement.text());
                    }
                    else if (sonElement.toElement().tagName().compare("cityName") == 0)
                    {
                        ui.readCity->setText(sonElement.text());
                    }
                }
            }
            node = node.nextSibling();                      //读取下一父节点
        }
    }

    m_file.close();
}

3、运行结果

        在左图填入教师信息,点击【写入xml文件】将其写入文件,点击右边【读取xml文件】,将内容读取到,解析出来。

4、Demo下载

        可直接去下载demo,尝试运行。

        CSDN 0积分下载:Qt之xml读写操作Demo-C++文档类资源-CSDN文库https://download.csdn.net/download/ManagerUser/85496434

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值