Qt學習第6天:xml 【筆記】

xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 有頭有尾:開始標籤,閉合標籤 -->
<!-- 配置文件常用xml -->

<info>
	<stu id="1">
		<name>mike</name>
		<sex>female</sex>
		<score>18</score>
	</stu>
	
	<stu id="2">
		<name>jack</name>
		<sex>male</sex>
		<score>20</score>
	</stu>
</info>

實現如下效果:

<?xml version='1.0' encoding='utf-8'?>
<日銷售清單>
    <日期 date="2020-05-19">
        <時間 time="10-30-58">
            <廠家>二汽神龍</廠家>
            <品牌>畢加索</品牌>
            <報價>39</報價>
            <數量>1</數量>
            <金額>39</金額>
        </時間>
    </日期>
</日銷售清單>

直接上代碼:
domxml.h

#ifndef DOMXML_H
#define DOMXML_H
#include <QString>
#include <QStringList>
#include <QDomDocument>
#include <QDomElement>


class DomXml
{
public:
    DomXml();
    static void createXML(QString filePath);//創建xml文件
    //list.at(0) = 二汽神龍
    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);
};

#endif // DOMXML_H

domxml.cpp

#include "domxml.h"
#include <QFile>
#include <QDomDocument>//文件
#include <QDomProcessingInstruction>//格式頭部
#include <QDomElement>  //元素
#include <QTextStream> //文本流
#include <QDateTime>
#include <QDebug>

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

DomXml::DomXml()
{

}


//創建xml空文件
void DomXml::createXML(QString filePath)
{
    QFile file(filePath);//關聯文件名字
    if(true == file.exists())//如果存在就不創建
    {
        cout << "文件已經存在";
        return;
    }
    else
    {
        //不存在才創建
        //只寫方式打開文件
        bool isOk = file.open(QIODevice::WriteOnly);
        if(true == isOk)//如果打開成功
        {
            //創建xml文檔對象
            QDomDocument doc;

            //創建xml頭部格式
            QDomProcessingInstruction ins;
            //注意,要有反斜槓轉義
            //<?xml version="1.0" encoding="UTF-8"?>
            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
        {
            cout << "WriteOnly error!";
            return;
        }
    }

}

void DomXml::appendXML(QString filePath, QStringList list)
{
    QFile file(filePath);
    bool isOk = file.open(QIODevice::ReadOnly);
    if(true == isOk)//打開成功
    {
        //file和xml文檔對象關聯
        QDomDocument doc;
        isOk = doc.setContent(&file);
        if(isOk)//如果關聯成功
        {
            file.close();//關閉文件

            //獲取根節點元素
            QDomElement root = doc.documentElement();

            //獲取當前時間
            QDateTime date = QDateTime::currentDateTime();
            QString dateStr = date.toString("yyyy-MM-dd");

            //判斷根節點下有沒有子節點
            if(root.hasChildNodes())//如果有子節點
            {
                //查找最後一個子節點
                QDomElement lastEmt = root.lastChildElement();

                if(lastEmt.attribute("date") == dateStr)
                {
                //有無當天日期,如果有
                    //寫有效數據
                    writeXML(doc,lastEmt,list);
                }
                else//如果沒有,創建新的
                {
                    //創建日期子節點元素
                    QDomElement dateEmt = doc.createElement("日期");
                    //創建date屬性
                    QDomAttr dateAttr = doc.createAttribute("date");
                    //設置屬性的值
                    dateAttr.setNodeValue(dateStr);
                    //節點和屬性關聯
                    dateEmt.setAttributeNode(dateAttr);

                    //把日期節點追加到根節點上
                    root.appendChild(dateEmt);

                    //寫有效數據
                    writeXML(doc,dateEmt,list);
                }


            }
            else //沒有子節點
            {
                //創建日期子節點元素
                QDomElement dateEmt = doc.createElement("日期");
                //創建date屬性
                QDomAttr dateAttr = doc.createAttribute("date");
                //設置屬性的值
                dateAttr.setNodeValue(dateStr);
                //節點和屬性關聯
                dateEmt.setAttributeNode(dateAttr);

                //把日期節點追加到根節點上
                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!";
    }


}


void DomXml::writeXML(QDomDocument &doc, QDomElement &root, QStringList list)
{
    //當前時間獲取
    QDateTime time = QDateTime::currentDateTime();
    QString timeStr = time.toString("hh-mm-ss"); //16:05:22

    //創建時間節點元素
    QDomElement timeEmt = doc.createElement("時間");
    //創建屬性
    QDomAttr timeAttr = doc.createAttribute("time");
    //給屬性設置值
    timeAttr.setNodeValue(timeStr);
    //時間節點元素和屬性關聯
    timeEmt.setAttributeNode(timeAttr);
    //把時間節點追加到日期節點下
    root.appendChild(timeEmt);

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

}




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)//打開成功
    {
        //file和xml文檔對象關聯
        QDomDocument doc;
        isOk = doc.setContent(&file);
        if(isOk)//如果關聯成功
        {
                file.close();
                //獲取根節點
                QDomElement root = doc.documentElement();

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

                       }
                    }
                    else {
                        cout << "沒有當前日期";
                        return;
                    }
                }
         }
         else
        {
                cout << "setContentt error";
                return;
        }

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

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "domxml.h"
#include <QDebug>

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

    DomXml::createXML("../demo.xml");

    QStringList list;
    list << "二汽神龍" << "畢加索" << "39" << "1" << "39";
    DomXml::appendXML("../demo.xml",list);


    QStringList fList,bList,pList,nList,tList;
    DomXml::readXML("../demo.xml",fList,bList,pList,nList,tList);
    for (int i = 0;i < fList.size(); i++)
    {
        QString str = QString("%1:%2:賣出了%3,單價:%4,總價:%5")
                .arg(fList.at(i))
                .arg(bList.at(i))
                .arg(pList.at(i))
                .arg(nList.at(i))
                .arg(tList.at(i));

        qDebug() << str;
    }
}

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

實用技巧

  • 新加入的類或者模塊,如果方法或類不顯示高亮,close All然後重新打開一下即可刷新
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章