22、qt中的QXML


1、QXML通常与HTML相关联,HTML主要用来显示网页数据,而XML主要用来存储数据,Qt提供了一套操作xml的接口;

2、简单格式如下:

<?xml version='1.0' encoding='utf-8'?>   // 格式头
<日销售清单>         // 根节点 根元素
    <日期 date="2020-12-10">   // 子元素 子节点
        <时间 time="12-14-04">
            <厂家>二汽神龙</厂家>
            <品牌>毕加索</品牌>
            <报价>39</报价>
            <数量>1</数量>
            <金额>39</金额>
        </时间>
        <时间 time="12-14-22">
            <厂家>二汽神龙</厂家>
            <品牌>毕加索</品牌>
            <报价>39</报价>
            <数量>1</数量>
            <金额>39</金额>
        </时间>
    </日期>
    <日期 date="2020-12-11">
        <时间 time="12-16-18">
            <厂家>二汽神龙</厂家>
            <品牌>毕加索</品牌>
            <报价>39</报价>
            <数量>1</数量>
            <金额>39</金额>
        </时间>
        <时间 time="14-53-45">
            <厂家>二汽神龙</厂家>
            <品牌>毕加索</品牌>
            <报价>39</报价>
            <数量>1</数量>
            <金额>39</金额>
        </时间>
    </日期>
</日销售清单>
    
View Code

3、操作XML之前需要在工程文件下添加

QT += xml
// 主要包含的头文件:
#include <QDomDocument>  // 文档
#include <QDomProcessingInstruction>  // 标题头
#include <QDomElement>  // 元素
#include <QTextStream>  // 借助文本流保存数据
#include <QStringList>

4、创建XML文件

void domXML::createXML(QString filePath)
{
    QFile file(filePath);
    if(true == file.exists()) // 文件存在
    {
        qDebug() << "文件已经存在";
        return;
    }else{  // 文件不存在才创建
       bool isok = file.open(QIODevice::WriteOnly);
       if(true == isok)
       {//  创建文件成功
            QDomDocument doc;
            // 创建XML头部格式 <?xml version='1.0' encoding='utf-8'?>
            QDomProcessingInstruction ins;
            ins = doc.createProcessingInstruction("xml","version=\'1.0\' encoding=\'utf-8\'");
            // 追加元素
            doc.appendChild(ins);
            // 根节点元素
            QDomElement root = doc.createElement("日销售清单");
            doc.appendChild(root);  // 和上面的是平级的
            // 保存 借助文本流
            QTextStream stream(&file);   // 文本流与文件关联
            doc.save(stream,4);  // 文件中4字节缩进
            // 关闭文件
            file.close();

       }else{
           // 创建文件失败
           qDebug() << "文件创建失败";
           return;
       }
    }
}

5、XML文件中添加数据

 // xml文件中添加数据 list 厂家、 品牌、报价、数量、金额
void domXML::appendXML(QString filePath, QStringList list)
{
    QFile file(filePath);
    bool isok = file.open(QIODevice::ReadOnly);
    if(true == isok){   // 打开文件ok
        // file文件和xml文档对象关联
        QDomDocument doc;
        isok = doc.setContent(&file);
        if(isok == true){  // 关联成功 相当于把file的内容已经读入了doc中
            file.close();
            //1、 获取根节点元素
            QDomElement root = doc.documentElement(); // 默认获取根节点元素
            // 获取当前时间
            QDateTime date = QDateTime::currentDateTime();
            QString dateStr = date.toString("yyyy-MM-dd");  // 2020-10-9
            // 2、判断根节点有没有子节点
            if(root.hasChildNodes()){  // 有子节点
                // 查找最后一个子节点
                QDomElement lastElm = root.lastChildElement();
                //
                if(lastElm.attribute("date") == dateStr)   // 判断是否有当天的日期
                {  // 有当天日期

                    // 写入有效数据
                    writeXML(doc,lastElm,list);
                }else{ // 没有当天日期
                    // 创建日期子节点
                    QDomElement dateElm = doc.createElement("日期");
                    // 创建date属性
                    QDomAttr dateAttr = doc.createAttribute("date");
                    // 设置属性值
                    dateAttr.setNodeValue(dateStr);
                    // 节点和属性关联
                    dateElm.setAttributeNode(dateAttr);
                    // 日期节点追加到根节点
                    root.appendChild(dateElm);

                    // 写有效数据
                    writeXML(doc,dateElm,list);
                }
            }else{ // 没有子节点,创建子节点
                // 创建日期子节点
                QDomElement dateElm = doc.createElement("日期");
                // 创建date属性
                QDomAttr dateAttr = doc.createAttribute("date");
                // 设置属性值
                dateAttr.setNodeValue(dateStr);
                // 节点和属性关联
                dateElm.setAttributeNode(dateAttr);
                // 日期节点追加到根节点
                root.appendChild(dateElm);

                // 写有效数据
                writeXML(doc,dateElm,list);
            }
            // 保存文件 数据还在doc中
            isok = file.open(QIODevice::WriteOnly);
            if(true == isok){
                QTextStream stream(&file);
                doc.save(stream,4);
            }else{
                qDebug() << "文件打开失败";
            }


        }else{   // 关联失败
            qDebug() << "关联文档失败";
        }
    }else{ // 打开文件err
        qDebug() << "打开文件失败";
        return;
    }
}

6、写入有效数据

// 写入有效数据
void domXML::writeXML(QDomDocument &doc, QDomElement &root, QStringList list)
{
    // 获取当前时间
    QDateTime time = QDateTime::currentDateTime();
    QString timeStr = time.toString("hh-mm-ss");  // 18:34:23
    // 创建时间节点元素
    QDomElement timeElm = doc.createElement("时间");
    // 创建时间节点对应的属性
    QDomAttr timeAttr = doc.createAttribute("time");
    // 给属性设定值
    timeAttr.setNodeValue(timeStr);
    // 时间节点与时间属性关联起来
    timeElm.setAttributeNode(timeAttr);
    // 时间节点追加到日期节点后面
    root.appendChild(timeElm);

    // 创建元素
    QDomElement factory = doc.createElement("厂家");
    QDomElement brand = doc.createElement("品牌");
    QDomElement price = doc.createElement("报价");
    QDomElement num = doc.createElement("数量");
    QDomElement total = doc.createElement("金额");

    // 上面元素中的文本
    QDomText text = doc.createTextNode(list.at(0));
    factory.appendChild(text);
    text = doc.createTextNode(list.at(1));
    brand.appendChild(text);
    text = doc.createTextNode(list.at(2));
    price.appendChild(text);
    text = doc.createTextNode(list.at(3));
    num.appendChild(text);
    text = doc.createTextNode(list.at(4));
    total.appendChild(text);

    timeElm.appendChild(factory);
    timeElm.appendChild(brand);
    timeElm.appendChild(price);
    timeElm.appendChild(num);
    timeElm.appendChild(total);
}

7、从XML文档中读取有效数据

void domXML::readXML(QString filePath, QStringList &fList, QStringList &bList, QStringList &pList, QStringList &nList, QStringList &tList)
{
    QFile file(filePath);
    bool  isok = file.open(QIODevice::ReadOnly);
    if(true == isok)
    {  // 打开文件成功
        QDomDocument doc;
        isok = doc.setContent(&file);   //  与文档关联
        if(true == isok){  // 关联成功
            file.close();
            // 获取当前日期
            QDateTime date = QDateTime::currentDateTime();
            QString dateStr = date.toString("yyyy-MM-dd");
            // 获取根节点
            QDomElement root = doc.documentElement();
            if(root.hasChildNodes()){// 有子节点
                // 找最后一个元素
                QDomElement lastElm = root.lastChildElement();
                if(lastElm.attribute("date") == dateStr) // 判断有没有当天的数据
                {
                    // 找出当天下的所有时间子节点
                    QDomNodeList list = lastElm.childNodes();
                    for(int i=0;i<list.size();i++){
                        // 转换为元素,找到节点下所有子节点  工厂、品牌
                        QDomNodeList subList = list.at(i).childNodes();
                        // factory
                        QString factory = subList.at(0).toElement().text();  // 转换为文本
                        fList.append(factory);

                        QString brand = subList.at(1).toElement().text();  // 转换为文本
                        bList.append(brand);

                        QString price = subList.at(2).toElement().text();  // 转换为文本
                        pList.append(price);

                        QString num = subList.at(3).toElement().text();  // 转换为文本
                        nList.append(num);

                        QString total = subList.at(4).toElement().text();  // 转换为文本
                        tList.append(total);

                    }
                }else{  // 不存在党的日期

                }
            }else{  // 没有子节点

            }
        }else{ // 关联失败

        }
    }else{ // 打开文件失败

    }
}

8、其他

// 声明
 // 创建xml文件
    static void createXML(QString filePath);
    // xml文件中添加数据 list 厂家、 品牌、报价、数量、金额
    static void appendXML(QString filePath,QStringList list);
    static void writeXML(QDomDocument &doc,QDomElement &root,QStringList list);
    static void readXML(QString filePath,
                        QStringList &fList,
                        QStringList &bList,
                        QStringList &pList,
                        QStringList &nList,
                        QStringList &tList);

// 测试
// 创建xml文件
    domXML::createXML("../xmldata.xml");
    //添加日期新节点
    QStringList list;
    list <<"二汽神龙"<< "毕加索"<< "39" << "1" << "39";
    domXML::appendXML("../xmldata.xml",list);

    QStringList fList;
    QStringList bList;
    QStringList pList;
    QStringList nList;
    QStringList tList;
    domXML::readXML("../xmldata.xml",fList,bList,pList,nList,tList);
    for(int i=0;i<nList.size();i++)
    {
        QString str = QString("%1:%2卖出了%3,单价为:%4,总价:%5")
                .arg(fList.at(i))
                .arg(bList.at(i))
                .arg(nList.at(i))
                .arg(pList.at(i))
                .arg(tList.at(i));
        qDebug() << str;
    }
View Code

 

 








//写入有效数据
voiddomXML::writeXML(QDomDocument&doc,QDomElement&root,QStringListlist)
{
//获取当前时间
QDateTimetime=QDateTime::currentDateTime();
QStringtimeStr=time.toString("hh-mm-ss");//18:34:23
//创建时间节点元素
QDomElementtimeElm=doc.createElement("时间");
//创建时间节点对应的属性
QDomAttrtimeAttr=doc.createAttribute("time");
//给属性设定值
timeAttr.setNodeValue(timeStr);
//时间节点与时间属性关联起来
timeElm.setAttributeNode(timeAttr);
//时间节点追加到日期节点后面
root.appendChild(timeElm);
 
//创建元素
QDomElementfactory=doc.createElement("厂家");
QDomElementbrand=doc.createElement("品牌");
QDomElementprice=doc.createElement("报价");
QDomElementnum=doc.createElement("数量");
QDomElementtotal=doc.createElement("金额");
 
//上面元素中的文本
QDomTexttext=doc.createTextNode(list.at(0));
factory.appendChild(text);
text=doc.createTextNode(list.at(1));
brand.appendChild(text);
text=doc.createTextNode(list.at(2));
price.appendChild(text);
text=doc.createTextNode(list.at(3));
num.appendChild(text);
text=doc.createTextNode(list.at(4));
total.appendChild(text);
 
timeElm.appendChild(factory);
timeElm.appendChild(brand);
timeElm.appendChild(price);
timeElm.appendChild(num);
timeElm.appendChild(total);
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM