my-QT专栏

QT xml格式操作

2021-09-10  本文已影响0人  c之气三段
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在重新添加

上一篇下一篇

猜你喜欢

热点阅读