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

24 篇文章 0 订阅
2 篇文章 0 订阅

文件格式

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

<?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()是下一个兄弟元素,都差不多
         }
    }
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值