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