QT XML操作实例

22 篇文章 0 订阅

domXml.h

#ifndef DOMXML_H
#define DOMXML_H

#include <QFile>
#include <QDomComment>
#include <QDomElement>//元数
#include <QString>
#include <QDomProcessingInstruction>//格式头
#include <QStringList>

class DomXml
{
public:
    DomXml();

    static void createXml(QString filePath);
    static void appendXml(QString filePath,QStringList list);
    static void readXml(QString filePath, 
                        QStringList &fList, 
                        QStringList &bList, 
                        QStringList &pList, 
                        QStringList &nList,
                        QStringList &tList, 
                        QStringList &testList);
    static void writeXml(QDomDocument &doc,QDomElement &root,QStringList &list);
};

#endif // DOMXML_H

domXml.cpp

#include "domxml.h"
#include <QDebug>
#include <QTextStream>
#include <QIODevice>
#include <QDateTime>

#define cout qDebug()<<"["<<__FILE__<<":"<<__LINE__<<"]"

DomXml::DomXml()
{

}

void DomXml::createXml(QString filePath)
{
    QFile file(filePath);
    if(true == file.exists()){
        //如果文件不存在就不创建
        cout<<"file is exist";
        return;

    }else{
        //如果文件存在就是直接创建
        bool isOk = file.open(QIODevice::WriteOnly);
        if(isOk == true){
            //创建文档对象
            QDomDocument doc;
            //创建xml头部格式
            QDomProcessingInstruction ins;
            ins = doc.createProcessingInstruction("xml"," version=\"1.0\" encoding=\"UTF-8\"");
            //追加元数
            doc.appendChild(ins);
            //根节点元数
            QDomElement root = doc.createElement("日销售清单");
            doc.appendChild(root);
            //保存
            QTextStream out(&file);
            doc.save(out,4);
            file.close();

        }else{
            cout<<"Write error";
            return;
        }

    }
}

void DomXml::appendXml(QString filePath, QStringList list)
{
    QFile file(filePath);
    bool isOk = file.open(QIODevice::ReadOnly);
    if(true == isOk){
        //关联dom
        QDomDocument doc;
        isOk =  doc.setContent(&file);
        if(isOk == true){
            file.close();

            //获取根节点的元数
            QDomElement root = doc.documentElement();

            //获取当前时间
            QDateTime date = QDateTime::currentDateTime();
            QString dateStr = date.toString("yyyy-MM-dd");
            //判断根节点有无子节点
            if(root.hasChildNodes()){
                //查找最后一个子节点
                QDomElement lastElem = root.lastChildElement();
                if(lastElem.attribute("date") == dateStr){//有有当天日期
                    writeXml(doc,lastElem,list);
                }else{
                    //没有当天日期
                    //创建
                    QDomElement dateEmt = doc.createElement("日期");
                    //创建date属性
                    QDomAttr dateAtrr = doc.createAttribute("date");
                    //设置属性的值
                    dateAtrr.setNodeValue(dateStr);
                    //节点与属性关联
                    dateEmt.setAttributeNode(dateAtrr);
                    //把日期节点追加的根节点上
                    root.appendChild(dateEmt);

                    //写有效数据
                    writeXml(doc,dateEmt,list);

                }
            }
            else{//没有子节点
                //创建
                QDomElement dateEmt = doc.createElement("日期");
                //创建date属性
                QDomAttr dateAtrr = doc.createAttribute("date");
                //设置属性的值
                dateAtrr.setNodeValue(dateStr);
                //节点与属性关联
                dateEmt.setAttributeNode(dateAtrr);
                //把日期节点追加的根节点上
                root.appendChild(dateEmt);

                //写有效数据
                writeXml(doc,dateEmt,list);

            }

            isOk = file.open(QIODevice::WriteOnly);
            if(isOk)
            {
                QTextStream stream(&file);
                doc.save(stream,4);
                file.close();
            }
        }else{
            cout << "setContent error";
            return;
        }

    }else{
         cout << "ReadOnly error";
         return;
    }
}

void DomXml::writeXml(QDomDocument &doc, QDomElement &root, QStringList &list)
{
    //获取当前时间
    QDateTime date = QDateTime::currentDateTime();
    QString dateStr = date.toString("hh:mm:ss");

    //创建时间节点元数
    QDomElement timeEmt = doc.createElement("时间");
    //创建属性
    QDomAttr timeAtrr = doc.createAttribute("time");
    //给属性设置值
    timeAtrr.setNodeValue(dateStr);

    //关联
    timeEmt.setAttributeNode(timeAtrr);

    root.appendChild(timeEmt);

    //一堆里面的元数
    QDomElement factory = doc.createElement("厂家");
    QDomElement brand = doc.createElement("品牌");
    QDomElement price = doc.createElement("报价");
    QDomElement num = doc.createElement("数量");
    QDomElement total = doc.createElement("金额");
    QDomElement test = doc.createElement("test");

    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);

    text = doc.createTextNode(list.at(5));
    test.appendChild(text);


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



}
void DomXml::readXml(QString filePath, QStringList &fList, QStringList &bList, QStringList &pList, QStringList &nList, QStringList &tList,QStringList &testList)
{
    QFile file(filePath);
    bool isOk = file.open(QIODevice::ReadOnly);
    if(true == isOk) //打开成功
    {
        //file和xml文档对象关联
        QDomDocument doc;
        isOk = doc.setContent(&file);

        if(isOk) //如果关联成功
        {
            //获取根节点
            QDomElement root = doc.documentElement();
            file.close();

            QDateTime date = QDateTime::currentDateTime();
            QString dateStr = date.toString("yyyy-MM-dd");


            if(root.hasChildNodes()) //有没有子节点
            {
                //找最后一个节点元素
                QDomElement lastEmt = root.lastChildElement();
                if(lastEmt.attribute("date") == dateStr)//判断有没有当天日期
                {
                    //找出当前日期下所有时间子节点
                    QDomNodeList list = lastEmt.childNodes();
                    for(int i = 0; i < list.size(); i++)
                    {
                        //list.at(0).toElement();
                        //转换为元素,找到时间节点下的所有子节点
                        QDomNodeList subList = list.at(i).toElement().childNodes();
                        //厂家
                        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);

                        QString test = subList.at(5).toElement().text();
                        testList.append(test);
                    }


                }
                else
                {
                    cout << "has not this cur day";
                    return;
                }


            }
            else
            {
                cout << "not child";
                return;
            }


        }
        else
        {
            cout << "setContent error";
            return;
        }
    }
    else
    {
        cout << "ReadOnly error";
        return;
    }

}

mainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "domxml.h"
#include <QDebug>

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

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


void MainWindow::on_pushButton_clicked()
{
    DomXml::createXml("./test2.xml");


    QStringList list;
    list << "二汽神龙" << "毕加索" << "39" << "1" << "39"<<"20";
    DomXml::appendXml("./test2.xml", list);


    QStringList fList;
    QStringList bList;
    QStringList pList;
    QStringList nList;
    QStringList tList;
    QStringList testList;
    DomXml::readXml("./test2.xml", fList, bList, pList, nList, tList, testList);
    for(int i = 0; i < fList.size(); i++)
    {
        QString str = QString("%1:%2:卖出了%3,单价:%4, 总价: %5,test: %6")
                .arg(fList.at(i))
                .arg(bList.at(i))
                .arg(nList.at(i))
                .arg(pList.at(i))
                .arg(tList.at(i))
                .arg(testList.at(i));

        qDebug() << str.toUtf8().data();
    }
}

run:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值