【qt】【xml】xml读,存,增,删操作参考模板

读取,初始化xml参考模板

void EmapEditWindow::initXml()
{
    bool flagtmp=0;
    QDomDocument doc;
    QFile inputFile("test.xml");
    if(!inputFile.open(QFile::ReadOnly))
    {
        qDebug() << "inputFile.open(QFile::ReadOnly) error!\n";
        inputFile.close();
        flagtmp=1;//说明文档里没有东西

    }
    if(!flagtmp)
    {
        //xml里已经有东西
        if(!doc.setContent(&inputFile))
        {
            qDebug() << "setContent error!\n";
            inputFile.close();return;
        }
        inputFile.close();
        
        //读入对应信息并存储
        mapNum=0;
        mapInfoList.clear();
        QDomElement root=doc.documentElement();
        QDomNodeList list=doc.elementsByTagName("map"); 
        for(int i=0;i<list.count();i++)
        {
            QDomElement m = list.at(i).toElement();
            QString _mapPath = m.attribute("path");
            mapNum+=1;
            MyMapList _a;
            _a.init();
            _a.mapPath = _mapPath;
            mapInfoList.append(_a);
        }
        

        if(!inputFile.open(QFile::WriteOnly|QFile::Truncate)) //先读进来,再重写,如果不用truncate就是在后面追加内容,就无效了
        {
            qDebug() << "add last open error!\n";return;
        }

        QTextStream ts(&inputFile);
        doc.save(ts,4);
        inputFile.close();

        return;
    }
    inputFile.close();

    //如果xml没有东西
    QFile file("test.xml"); //相对路径、绝对路径、资源路径都可以
    if(!file.open(QFile::WriteOnly|QFile::Truncate))return;

    QDomDocument doc1;
    //写入xml头部
    QDomProcessingInstruction instruction; //添加处理命令
    
    //利用系统时间,组成一个QString
    SYSTEMTIME sys;
    GetLocalTime( &sys );
    QString t_str = QString::number(sys.wYear)+"."+QString::number(sys.wMonth)+
            "."+QString::number(sys.wDay)+"-"+QString::number(syxifuchuangs.wHour)+":"+QString::number(sys.wMinute);
    //instruction建议一点都不要改!setContent error很可能就是这里的问题;
    instruction=doc1.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
    doc1.appendChild(instruction);
    //添加根节点
    QDomComment comment = doc1.createComment(t_str);
    doc1.appendChild(comment);

    QDomElement root1 = doc1.createElement("Central");
    root1.setAttribute("update_time", t_str);  // 属性
    root1.setAttribute("mapNum",0);
    doc1.appendChild(root1);

    //输出到文件
    QTextStream out_stream(&file);
    doc1.save(out_stream,4); //缩进4格
    file.close();
    initmap_flag=1;
}

 

 

 

删除/添加子节点参考模板

QDomDocument doc;
    QFile inputFile("test.xml");//相对路径里面test.xml
    if(!inputFile.open(QFile::ReadOnly))
    {
        qDebug() << "inputFile.open(QFile::ReadOnly) error!\n";
        inputFile.close();
        return;
    }

    if(!doc.setContent(&inputFile))
    {
        qDebug() << "setContent error!\n";
        inputFile.close();return;
    }
    inputFile.close();

    QDomElement root=doc.documentElement();
    QDomNodeList list=doc.elementsByTagName("map"); //由标签名定位

        for(int i=0;i<list.count();i++)
        {
           QDomElement e=list.at(i).toElement();//map
            if(e.attribute("row")==QString::number(ans_num))  
            {
                //删除原来子节点
                QDomNodeList listAllNodes = e.childNodes();
                while (listAllNodes.size() > 0) {
                         e.removeChild(listAllNodes.at(0));
                         //qDebug()<<"a child had been deleted";
                }
                //增加节点
                for(int j=0;j<btnList.size();j++)
                {
                     QDomElement child = doc.createElement("detector");
                     child.setAttribute("x",btnList[j]->pos().x());
                     e.appendChild(child);
                     // qDebug()<<"add a detector in xml"<<j;
                 }
                break;
            }

        }

    if(!inputFile.open(QFile::WriteOnly|QFile::Truncate)) 
        //先读进来,再重写,如果不用truncate就是在后面追加内容,就无效了
    {
        qDebug() << "add last open error!\n";return;
    }

    QTextStream ts(&inputFile);
    doc.save(ts,4);
    inputFile.close();

 

posted @ 2021-02-04 14:31  carrotmvp  阅读(267)  评论(0编辑  收藏  举报