美文网首页my-QT专栏
QT xml格式操作

QT xml格式操作

作者: c之气三段 | 来源:发表于2021-09-10 17:19 被阅读0次
    QT       += core xml
    

    写xml

        //打开或创建文件
           QFile file("C:/Users/xxx/Desktop/text.xml"); //相对路径、绝对路径、资源路径都可以
           if(!file.open(QFile::WriteOnly|QFile::Truncate)) //可以用QIODevice,Truncate表示清空原来的内容
               return;
    
           QDomDocument xmlDoc;
           //写入xml头部
           QDomProcessingInstruction instruction; //添加处理命令
           instruction=xmlDoc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
           xmlDoc.appendChild(instruction);
           //添加根节点
           QDomElement root=xmlDoc.createElement("paras");
           xmlDoc.appendChild(root);
    
           //添加第一个子节点即标签
           QDomElement firstNode = xmlDoc.createElement("para");
           firstNode.setAttribute("id",1); //方式一:创建属性  其中键值对的值可以是各种类型
           QDomAttr time = xmlDoc.createAttribute("time"); //方式二:创建属性 值必须是字符串
           time.setValue("2013/6/13");
           firstNode.setAttributeNode(time);
           QDomElement lable_1 = xmlDoc.createElement("value"); //创建子标签
           QDomText text; //设置括号标签中间的值
           text = xmlDoc.createTextNode("20");
           firstNode.appendChild(lable_1);
           lable_1.appendChild(text);
           QDomElement lable_2 = xmlDoc.createElement("value"); //创建子标签
           text = xmlDoc.createTextNode("30");
           lable_2.appendChild(text);
           firstNode.appendChild(lable_2);
           root.appendChild(firstNode);
    
           //添加第二个子节点及其子标签,部分变量只需重新赋值
           QDomElement secondNode = xmlDoc.createElement("para");
           secondNode.setAttribute("name","qt5");
           secondNode.setAttribute("id",2);
           secondNode.setAttribute("type","float");
           QDomElement leble_scon_1 = xmlDoc.createElement("selection");
           leble_scon_1.setAttribute("name","qchart");
           QDomText selec_text = xmlDoc.createTextNode("30.2");
           leble_scon_1.appendChild(selec_text);
           secondNode.appendChild(leble_scon_1);
           root.appendChild(secondNode);
    
           //输出到文件
           QTextStream out_stream(&file);
           xmlDoc.save(out_stream,4); //缩进4格
           file.close();
    
    image.png

    读xml,可以通过遍历获取到任意数据,也可进行数据更新

     //打开或创建文件
        QFile file("C:/Users/xxx/Desktop/text.xml"); //相对路径、绝对路径、资源路径都行不过需要重写一下
        if(!file.open(QFile::ReadOnly))
            return;
        
        QDomDocument xmlDoc;
        if(!xmlDoc.setContent(&file))
        {
            file.close();
            return;
        }
        file.close();
        
        QDomElement root=xmlDoc.documentElement(); //返回根节点
        QDomNode node=root.firstChild(); //获得第一个子节点
        while(!node.isNull())  //如果节点不空
        {
            if(node.isElement()) //如果节点是标签吗
            {
                //父节点
                QDomElement leble=node.toElement(); //获取此标签
                QString paraName = leble.tagName();//标签
                QString attribute;//属性
                QDomNamedNodeMap nodeMap =  leble.attributes();//遍历所有属性顺序是乱序的,也可以按属性名获取值
                for (int i = 0; i < nodeMap.size(); ++i)
                {
                    attribute.append(nodeMap.item(i).nodeName()).append(":").append(nodeMap.item(i).nodeValue()).append("  ");
                }
                qDebug()<<paraName.append("  ").append(attribute);
                //子节点
                QDomNodeList list=leble.childNodes();
                for(int i=0;i<list.count();i++)
                {
                    QDomNode childNode=list.at(i);
                    if(childNode.isElement())
                    {
                        QDomElement childLeble=childNode.toElement();
                        QString vlueName = childLeble.tagName();//子标签名
                        QString attribute;//属性
                        QString text;//标签包的内容
                        QDomNamedNodeMap childLebleMap =  childLeble.attributes();//遍历所有属性顺序是乱序的,也可以按属性名获取值
                        for (int i = 0; i < childLebleMap.size(); ++i)
                        {
                            attribute.append(childLebleMap.item(i).nodeName()).append(":").append(childLebleMap.item(i).nodeValue()).append("  ");
                        }
                        text = childNode.toElement().text();
                        qDebug()<<vlueName.append("  ").append(attribute).append("  ").append(text);
                    }
                }
            }
            node=node.nextSibling(); //下一个兄弟节点,nextSiblingElement()是下一个兄弟元素,都差不多
        }
    
    image.png

    修改指定值先remove在重新添加

    相关文章

      网友评论

        本文标题:QT xml格式操作

        本文链接:https://www.haomeiwen.com/subject/uscnwltx.html