天天看點

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()是下一個兄弟元素,都差不多
         }
    }
           

繼續閱讀