QT读写XML文件,XML读写复杂结构体

文件格式

根据文件格式来读写,对应起来分析,想要更复杂的自己按格式创建,读取就可以了,有问题可以评论噢~,读取的时候如果有问题可以参考我另外一个文章!

<?xml version="1.0" encoding="UTF-8"?>
<TT>
    <Fiter0>
        <group id="Al">
            <name>Al(铝)</name>
            <energy>1.3,1.59</energy>
        </group>
        <group id="V">
            <name>V(钒)</name>
            <energy>4.8,5.1</energy>
        </group>
    </Fiter0>
    <Fiter1>
        <group id="As">
            <name>As(砷)</name>
            <energy>10.23,10.83</energy>
        </group>
        <group id="Zr">
            <name>Zr(锆)</name>
            <energy>15.4,16.1</energy>
        </group>
    </Fiter1>
    <Fiter2>
        <group id="Ag">
            <name>Ag(银)</name>
            <energy>21.6,22.6</energy>
        </group>
        <group id="Te">
            <name>Te(碲)</name>
            <energy>26.82,27.9</energy>
        </group>
    </Fiter2>
</TT>

创建XML文件

  //打开或创建文件
    QFile file("config/Element.xml"); //相对路径、绝对路径、资源路径都可以
    if(!file.open(QFile::WriteOnly|QFile::Truncate)) //可以用QIODevice,Truncate表示清空原来的内容
        return;
        
    QDomDocument doc;
    //写入xml头部
    QDomProcessingInstruction instruction; //添加处理命令
    instruction=doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
    doc.appendChild(instruction);
    QDomElement root2=doc.createElement("TT");
    doc.appendChild(root2);
    //添加根节点
    for(int i = 0;i<3;i++)
      {
    
       
            QDomAttr attr_id = doc.createAttribute("id");   //创建元素名
            attr_id.setValue(elem.str_Id);
            QDomElement root_group = doc.createElement("group");  //创建组元素, 名字是元素名
            root_group.setAttributeNode(attr_id);
            QDomElement element_root = doc.createElement(("name")); //创建组下面的元素
            QDomNode node = doc.createTextNode(elem.str_Name);
            element_root.appendChild(node);
               QDomElement element_rmt = doc.createElement("energy"); //创建组下面的元素
            QDomNode nodeenery = doc.createTextNode(elem.list_energy[0].toString()+","+elem.list_energy[1].toString());
            element_rmt.appendChild(nodeenery);
              root_group.appendChild(element_root);  
            root_group.appendChild(element_rmt); // 将元素加入到创建的组中
            root.appendChild(root_group);  //将小组放入大组
                    }
    }
    QTextStream out_stream(&file);
    doc.save(out_stream,4); //缩进4格
    file.close();
            

读取XML数据

 QFile file("config/Element.xml"); //相对路径、绝对路径、资源路径都行
    if(!file.open(QFile::ReadOnly))
        return;
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
    
    
        file.close();
        return;
    }
       file.close();
        QDomElement root=doc.documentElement(); //返回根节点
    qDebug()<<root.nodeName();
    for(int i = 0; i<3;i++)
    {
    
    
        QDomNode node=root.firstChild().firstChild(); //获得第一个子节点 下的第一组
        while(!node.isNull())  //如果节点不空
        {
    
    
         if(node.isElement()) //如果节点是元素
            {
    
    
                QDomElement e=node.toElement(); //转换为元素,注意元素和节点是两个数据结构,其实差不多
                QString ID=    e.attribute("id");
                QDomNodeList list=e.childNodes();
                for(int i=0;i<list.count();i++) //遍历子元素,count和size都可以用,可用于标签数计数
                {
    
    
                  QDomNode n=list.at(i);
                    if(node.isElement())
                        qDebug()<<n.nodeName()<<":"<<n.toElement().text();
                }
            }
            node=node.nextSibling(); //下一个兄弟节点,nextSiblingElement()是下一个兄弟元素,都差不多
         }
    }

猜你喜欢

转载自blog.csdn.net/amxld/article/details/110479254
今日推荐