Qt 实现对XML的读写操作实现信息管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuzhezhe111/article/details/79555247

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 撤销增加

源代码:点击打开链接











猜你喜欢

转载自blog.csdn.net/liuzhezhe111/article/details/79555247