Qt 實現對XML的讀寫操作實現信息管理

1.在菜單中打開xml,把內容讀取到 tablewidget進行顯示:

1.本程序實現了xml讀取、xml寫入、檢索

    讀取:

{
    QDomDocument doc;
    QFile file(_xmlFilePath);
    //QTextCodec *vCodec = QTextCodec::codecForName("UTF-8");
    //QByteArray encodedString;
    //QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
    if(!file.open(QIODevice::ReadOnly))
    {
        QMessageBox msgBox;
        msgBox.setText("error.");
        msgBox.setInformativeText("Do you know ?");
        msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
        msgBox.setDefaultButton(QMessageBox::Cancel);
        int ret = msgBox.exec();
        switch (ret)
        {
          case QMessageBox::Ok:
              return;
              break;
          case QMessageBox::Cancel:
              return;
              break;
          default:
              return;
              break;
        }
    }
    if(!doc.setContent(&file))
    {
        file.close();
        return ;
    }
    file.close();
    QDomNode firstNode = doc.firstChild();//第一個節點
    qDebug() << "Node name "<<qPrintable(firstNode.nodeName())
             << "value "<<qPrintable(firstNode.nodeValue())  ;
    //返回跟元素
    QDomElement docElem = doc.documentElement();
    //返回根節點的第一個節點
    QDomNode n = docElem.firstChild();
    int line = 0;
    int row  = 0;
    while(!n.isNull())  // 節點不爲空則轉到下個節點
    {
        //如果節點是元素
        if(n.isElement())
        {
            //將結點轉換爲元素
            QDomElement e = n.toElement();
            //返回元素標記的id屬性值
            qDebug()<<"student"<<qPrintable(e.tagName())
                    <<"<-->id"<<qPrintable(e.attribute("sid"));
            tablemViewmodel->setItem(line,row ,  new QStandardItem(e.attribute("sid")));
            tablemViewmodel->item(line,row)->setForeground(QBrush(QColor(88,88,255)));
            //獲得元素e節點的所有子節點列表
            //row++;//列 ++
            QDomNodeList listNum = e.childNodes();
            for(int i = 0 ;i<listNum.count() ; ++i)
            {
                QDomNode node = listNum.at(i);
                if(node.isElement())
                {
                    //qPrintable()
                    qDebug()<<"read編碼name:"<<node.toElement().tagName()
                            <<"<-->text:"<<node.toElement().text(); // qPrintable()
                    tablemViewmodel->setItem(line,i+1 ,  new QStandardItem(node.toElement().text()));
                    tablemViewmodel->item(line,i+1)->setForeground(QBrush(QColor(88,88,255)));
                }
            }
        }
        //轉到下一個兄弟節點
        n = n.nextSibling();
        line++;//hang ++
    }
}

    寫入:

QFile file(_xmlFilePath);
   if(!file.open(QIODevice::ReadOnly))
   {
       return;
   }
   QDomDocument doc;
   if(!doc.setContent(&file))
   {
       file.close();
       return;
   }
   file.close();
   qDebug() << "updateToXmlFile ok " ;
   //一標籤名進行查找
   QDomNodeList doclist = doc.elementsByTagName(QString("sid"));
   for(int i=0; i < doclist.count() ;i++)
   {
        QDomElement e = doclist.at(i).toElement();//得到標籤的對象
        if(e.attribute(QString("sid")) == strId ) // 找到strId
        {
            //如果元素的編號屬性與我們的相同
            QDomNodeList child = doclist.at(i).childNodes();
            child.at(0).toElement().firstChild().setNodeValue(strId);//id 不可以改變
            child.at(1).toElement().firstChild().setNodeValue(strName);
            child.at(2).toElement().firstChild().setNodeValue(strAge);
            child.at(3).toElement().firstChild().setNodeValue(strSex);
            //用於保存update
            QFile file(_xmlFilePath);
            if(!file.open(QIODevice::WriteOnly  | QIODevice::Truncate))
            {
                return;
            }
            QTextStream out(&file);//文本流
            doc.save(out,4);//設置上面去
            file.close();
        }
   }
    檢索:

    

{
    QFile file(_xmlFilePath);
    if(!file.open(QIODevice::ReadOnly))
        return;
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        return;
    }
    file.close();
    clearVectorVector();//清除查找結果
    QDomNode firstNode = doc.firstChild();//第一個節點
    //返回跟元素
    QDomElement docElem = doc.documentElement();
    //返回根節點的第一個節點
    QDomNode n = docElem.firstChild();
    while(!n.isNull())  // 節點不爲空則轉到下個節點
    {
        QVector<QString> vec;
        //如果節點是元素
        if(n.isElement())
        {
            //將結點轉換爲元素
            QDomElement e = n.toElement();
            qDebug()<<"find<-->id"<<qPrintable(e.attribute("sid"));
            //獲得元素e節點的所有子節點列表
            vec.append(e.attribute("sid"));
            QDomNodeList listNum = e.childNodes();
            for(int i = 0 ;i<listNum.count() ; ++i)
            {
                QDomNode node = listNum.at(i);
                if(node.isElement())
                {
                    qDebug()<<"findread編碼name:"<<node.toElement().tagName()
                            <<"find<-->text:"<<node.toElement().text();
                    vec.append(node.toElement().text());
                }
            }
            VecVec.append(vec);
        }
        //轉到下一個兄弟節點
        n = n.nextSibling();
    }
    showVector2Info();
    findDateToTableView(strData);
}

2.通過修改tablewidget選中項可以操作保存功能:

    2.1 保存所有的更改的信息

    2.2 保存刪除信息

    2.3 保存更新的信息

    2.4 保存增加的信息

3.可以通過界面操作撤銷的功能:

    3.1 撤銷全部的修改

    3.2 撤銷更改

    3.3 撤銷刪除

    3.4 撤銷增加

源代碼:點擊打開鏈接











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章