【QT XML 写入】

首先我们需要一份XML文件,或者需要我们知道需要写的内容

<?xml version='1.0' encoding='UTF-8'?>
<日销售清单>
    <日期 date="2022-02-14">
        <时间 time="09-43-09">
            <厂家>奥迪</厂家>
            <品牌>a6</品牌>
            <报价>39</报价>
            <数量>1</数量>
            <金额>39</金额>
        </时间>
        <时间 time="09-43-24">
            <厂家>奥迪</厂家>
            <品牌>a6</品牌>
            <报价>39</报价>
            <数量>1</数量>
            <金额>39</金额>
        </时间>
    </日期>
</日销售清单>

下面是我们写的代码


```cpp
//写XML文档

1、首先创建一个XML文档类
    //创建三个静态函数,方便调用
    1):创建 createXML(QString filePath)来创建xml空文件,仅添加头部格式和文档根节点
            用QFile file(filePath)函数来读取文件来检测文件是否存在,如果存爱就返回
            如果不存在
                bool isOk = file.open(QIODevice::WriteOnly);//以只写方式打开文件 isOk用来判断是否打开成功
                打开成功的话:
                第一步:创建XML文档对象,包含头文件#include <QDomDocument>  //文件
                    QDomDocument doc;
                第二部:创建xml头部格式  <?xml version="1.0" encoding="UTF-8"?> 包含头文件#include <QDomProcessingInstruction> 
                     QDomProcessingInstruction ins;
                    ins = doc.createProcessingInstruction("xml","version=\'1.0\' encoding=\'UTF-8\'");
                第三步:将头部格式对象追加给它的父节点,也就是xml文档对象doc
                     doc.appendChild(ins);
                第四步:添加文档的根节点元素
                    QDomElement root = doc.createElement(QObject::tr("日销售清单"));
                    doc.appendChild(root);
                第五步:将文档对象元素保存到XML文件中去,保存前先将文本流和文件进行关联,并设置字符缩进
                    QTextStream stream(&file);  //文本流关联文件
                    doc.save(stream,4); //4 缩进字符
                第六步:将打开的文件进行关闭
                    file.close();
    2):创建appendXML(QString filepath,QStringList list);用来给创建好的根节点来追加子节点
            用QFile file(filePath)函数来打开已存在的文件,并设置标志位 isOk 来判断是否打开成功
                QFile file(filepath);
                bool isOk = file.open(QIODevice::ReadOnly);
            如果打开成功
                第一步:将打开的file文件和文档对象进行关联,并设置标志位 isOk 来判断是否关联成功
                    QDomDocument doc;
                    isOk =doc.setContent(&file);
                第二步:在关联成功情况下,将打开文件关闭,并获取根节点元素
                    file.close();
                    //获取根节点元素
                    QDomElement root = doc.documentElement();
                额外一步:
                    待会在插入节点元素之前,获取当日时间,作为标签的属性
                     //获取当前时间
                    QDateTime date = QDateTime::currentDateTime();
                    QString dateStr = date.toString("yyyy-MM-dd");
                第三步:判断当前根节点是否有子节点,分为有和没有两种情况
                    有子节点,直接执行写入XML的封装函数
                         if(lastEmt.attribute("date") == dateStr)
                        {
                            //在当天下面再添加一个
                            writeXML(doc,lastEmt,list);
                        }
                        此处再进行一层判断,如上面的if语句,如果不存在相同日期节点元素,在后面进行添加
                            //创建日期子节点元素标签名
                        QDomElement dateEmt = doc.createElement("日期");
                        //创建日期属性名为date
                        QDomAttr dateAttr = doc.createAttribute("date");
                        //设置属性值
                        dateAttr.setNodeValue(dateStr);
                        //结点和属性关联
                        dateEmt.setAttributeNode(dateAttr);
                        //把新节点添加到根节点
                        root.appendChild(dateEmt);
                        //有效写入数据
                        writeXML(doc,dateEmt,list);
                    如果没有子节点,则创建子节点,然后执行写入操作
                        //创建日期子节点元素标签名
                        QDomElement dateEmt = doc.createElement("日期");
                        //创建日期属性名为date
                        QDomAttr dateAttr = doc.createAttribute("date");
                        //设置属性值
                        dateAttr.setNodeValue(dateStr);
                        //结点和属性关联
                        dateEmt.setAttributeNode(dateAttr);
                        //把新节点添加到根节点
                        root.appendChild(dateEmt);
                        //有效写入数据
                        writeXML(doc,dateEmt,list);
                
                第四步:封装一个写入XML的函数writeXML
                    步骤同上,直接给出代码:
                        //获取当前时间
                        QDateTime time = QDateTime::currentDateTime();
                        QString timeStr = time.toString("hh-mm-ss");

                        //创建时间结点元素
                        QDomElement timeEmt = doc.createElement("时间");
                        //创建属性
                        QDomAttr timeAttr = doc.createAttribute("time");
                        //给属性设置值
                        timeAttr.setNodeValue(timeStr);
                        //时间结点和属性相关联
                        timeEmt.setAttributeNode(timeAttr);
                        //把时间结点追加到时间结点下面
                        root.appendChild(timeEmt);
                第五步:在writeXML中,为当前操作的节点添加文本信息
                    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);

                    timeEmt.appendChild(factory);
                    timeEmt.appendChild(brand);
                    timeEmt.appendChild(price);
                    timeEmt.appendChild(num);
                    timeEmt.appendChild(total);

最后,如果你有更好的办法,请您留言,希望大家共同进步。谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值