欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++、Qt分別讀寫xml文件的方法實(shí)例

 更新時(shí)間:2023年03月06日 10:59:15   作者:手寫不期而遇  
Qt提供了QDomElement 類用于完成對xml文件的讀取和寫入,這篇文章主要給大家介紹了關(guān)于C++、Qt分別讀寫xml文件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

XML語法

第一行是XML文檔聲明,<>內(nèi)的代表是元素,基本語法如以下所示。C++常見的是使用tiny庫讀寫,Qt使用自帶的庫讀寫;

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<根元素>
   <元素 屬性名="屬性值" 屬性名="屬性值">Text</元素>
   <元素 屬性名="屬性值" 屬性名="屬性值">
       <子元素>Text</子元素>
   </元素>
</根元素>

C++使用tinyxml讀寫xml

首先從網(wǎng)站下載tinyxml庫,

將6個(gè)文件加載到自己的項(xiàng)目中:

寫XML:

新建文件并寫入:

#include "include/tinyxml.h"

string strPath = "E:/test.xml";
TiXmlDocument *writeDoc = new TiXmlDocument; //xml文檔指針
//文檔格式聲明
TiXmlDeclaration *decl = new TiXmlDeclaration("1.0", "UTF-8", "yes");
writeDoc->LinkEndChild(decl); //寫入文檔
//TiXmlElement父類的析構(gòu)函數(shù)內(nèi)自帶delete,所以不用自己釋放
TiXmlElement *RootElement = new TiXmlElement("Camera");//根元素
RootElement->SetAttribute("num", "3"); //屬性
writeDoc->LinkEndChild(RootElement);
TiXmlElement *StuElement = new TiXmlElement("Exposure");//Stu
//設(shè)置屬性
StuElement->SetAttribute("time", "A");
StuElement->SetAttribute("deley", "30");
RootElement->LinkEndChild(StuElement);//父節(jié)點(diǎn)寫入文檔
//子元素
TiXmlElement *sonElement1 = new TiXmlElement("max");
StuElement->LinkEndChild(sonElement1);
TiXmlText *maxContent = new TiXmlText("1000");
sonElement1->LinkEndChild(maxContent);

TiXmlElement *sonElement2 = new TiXmlElement("min");
StuElement->LinkEndChild(sonElement2);
TiXmlText *minContent = new TiXmlText("80");
sonElement2->LinkEndChild(minContent);


writeDoc->SaveFile(strPath.c_str());
delete writeDoc;

最終生成的xml文件是:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Camera num="3">
    <Exposure time="A" deley="30">
        <max>1000</max>
        <min>80</min>
    </Exposure>
</Camera>

所以,使用tinyxml函數(shù)庫中的類去讀寫根元素,text和屬性。這里主要用到的就是四個(gè)類和三個(gè)函數(shù):

<TiXmlDeclaration>
<TiXmlElement>
     <TiXmlElement>
        <TiXmlElement>TiXmlText</TiXmlElement>
     </TiXmlElement>
</TiXmlElement>

四個(gè)類:

  • TiXmlDocument:定義一些基本的xml文件的基本操作,包含文件流;
  • TiXmlDeclaration:用于xml文件的第一行,定義xml文件的聲明操作;
  • TiXmlElement:不管根元素,元素和子元素,都用此類;
  • TiXmlText:用于元素內(nèi)的text的操作;

三個(gè)函數(shù):

  • LinkEndChild:將子元素嵌在父元素內(nèi),還可以將text加到元素內(nèi)
  • SetAttribute:設(shè)置元素內(nèi)的屬性名稱與屬性值
  • SaveFile:用于保存xml文件;如果xml文件不存在,會(huì)自動(dòng)創(chuàng)建一個(gè);

讀XML:

TiXmlDocument mydoc("E:/test.xml");
if(!mydoc.LoadFile())
{
   return;
}
TiXmlElement *RootElement = mydoc.RootElement();   //獲取根元素
//遍歷根元素下的元素
for(TiXmlElement *StuElement = RootElement->FirstChildElement();//第一個(gè)子元素
		StuElement != NULL;
		StuElement = StuElement->NextSiblingElement())//下一個(gè)兄弟元素
{
        //先找到Exposure元素
		if (0 == strcmp("Exposure", StuElement->Value()))
		{
			//遍歷Exposure元素下的子元素
			for (TiXmlElement *sonElement = StuElement->FirstChildElement();
			     sonElement != NULL;
				 sonElement = sonElement->NextSiblingElement())
			{
				//找到max元素,并輸出元素內(nèi)的text
				if (0 == strcmp("max", sonElement->Value()))
				{
					string str = sonElement->GetText();
					cout << str.c_str() << endl;
				}
			}
		}
}

Qt讀寫xml

寫XML:

//頭文件
#include <QDomDocument>
QString fileName = "E:/test.xml";
QFile file(fileName);
if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate))
  return;
//定義xml文件
QDomDocument doc;
//定義格式頭
QDomProcessingInstruction ins = doc.createProcessingInstruction("xml","version = \'1.0\' encoding = \'utf-8\'");
//追加元素
doc.appendChild(ins);
//根節(jié)點(diǎn)元素
QDomElement root = doc.createElement("Camera");
doc.appendChild(root);
//在根節(jié)點(diǎn)的基礎(chǔ)上增加一個(gè)子節(jié)點(diǎn)
QDomElement sonEmt = doc.createElement("Exposure");
//創(chuàng)建元素的屬性名
QDomAttr sonAttr = doc.createAttribute("time");
//創(chuàng)建元素的屬性值
sonAttr.setNodeValue("100");
//節(jié)點(diǎn)和屬性關(guān)聯(lián)
sonEmt.setAttributeNode(sonAttr);
root.appendChild(sonEmt);
//在根節(jié)點(diǎn)的基礎(chǔ)上增加一個(gè)子節(jié)點(diǎn),并設(shè)置子節(jié)點(diǎn)的text
QDomElement sonOneEmt = doc.createElement("max");
QDomText sonOneText = doc.createTextNode("1000");
sonOneEmt.appendChild(sonOneText);
sonEmt.appendChild(sonOneEmt);

QDomElement sonTwoEmt = doc.createElement("min");
QDomText sonTwoText = doc.createTextNode("80");
sonTwoEmt.appendChild(sonTwoText);
sonEmt.appendChild(sonTwoEmt);

//寫入文件
QTextStream stream(&file);
doc.save(stream,4);//4縮進(jìn)

這里對應(yīng)的類有:

<QDomProcessingInstruction>
<QDomElement>
   <QDomElement>QDomText</QDomElement>
   <QDomElement QDomAttr>
   </QDomElement>
</QDomElement>

讀XML:

#include <QXmlStreamReader>

QDomDocument doc;
QString fileName = "E:/test.xml";
QFile file(fileName);
if(!file.open(QIODevice::ReadOnly|QIODevice::Truncate))
{
    return;
}
else
{
    //將文件內(nèi)容讀到doc中
    if(!doc.setContent(&file))
        file.close();
    //返回根元素
    QDomElement root = doc.documentElement();
    //返回根元素的名稱
    QDomNode n = root.firstChild();
    while(!n.isNull())
    {
       if(n.isElement())
       {
         QDomElement e = n.toElement();
         QString strXML = qPrintable(e.tagName());
         //判斷第一個(gè)節(jié)點(diǎn)
         if("Exposure" == strXML)
         {
             //遍歷尋找Exposure元素下的子元素,并找到其text
             QDomNodeList list = e.childNodes();
             for(int i=0;i<list.count();i++)
             {
                QDomNode node = list.at(i);
                strXML = qPrintable(node.toElement().tagName());
                //判斷第二個(gè)元素
                if(node.isElement() && "max"== strXML)
                  QString textStr = qPrintable(node.toElement().text());//讀取子元素內(nèi)的text
             }
         }
       }
    }
}

界面讀取的效果為:

總結(jié) 

到此這篇關(guān)于C++、Qt分別讀寫xml文件的文章就介紹到這了,更多相關(guān)C++ Qt讀寫xml文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c語言printf實(shí)現(xiàn)同一位置打印輸出的實(shí)例

    c語言printf實(shí)現(xiàn)同一位置打印輸出的實(shí)例

    下面小編就為大家?guī)硪黄猚語言printf實(shí)現(xiàn)同一位置打印輸出的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • C語言 以字符形式讀寫文件詳解及示例代碼

    C語言 以字符形式讀寫文件詳解及示例代碼

    本文主要介紹C語言 以字符形式讀寫文件,這里整理了讀寫文件的一些資料并附示例代碼,供大家學(xué)習(xí)參考,有需要的小伙伴可以參考下
    2016-08-08
  • C語言當(dāng)函數(shù)執(zhí)行成功時(shí)return1還是0

    C語言當(dāng)函數(shù)執(zhí)行成功時(shí)return1還是0

    本文主要介紹了C語言當(dāng)函數(shù)執(zhí)行成功時(shí)return1還是0,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 淺析C/C++中被人誤解的SIZEOF

    淺析C/C++中被人誤解的SIZEOF

    以下是對C/C++中的SIZEOF進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • C語言中const,指針和引用的關(guān)系

    C語言中const,指針和引用的關(guān)系

    這篇文章主要為大家介紹了C語言的const,指針和引用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++ 設(shè)置和獲取當(dāng)前工作路徑的實(shí)現(xiàn)代碼

    C++ 設(shè)置和獲取當(dāng)前工作路徑的實(shí)現(xiàn)代碼

    這篇文章主要介紹了C++ 設(shè)置和獲取當(dāng)前工作路徑的實(shí)現(xiàn)代碼,防止DLL加載不到配置和文件,需要的朋友可以參考下
    2017-09-09
  • 用C語言實(shí)現(xiàn)簡單的三子棋

    用C語言實(shí)現(xiàn)簡單的三子棋

    這篇文章主要為大家詳細(xì)介紹了用C語言實(shí)現(xiàn)三子棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++ RTTI與4種類型轉(zhuǎn)換的深入理解

    C++ RTTI與4種類型轉(zhuǎn)換的深入理解

    這篇文章主要給大家介紹了關(guān)于C++ RTTI與4種類型轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 用C語言編寫推箱子游戲

    用C語言編寫推箱子游戲

    這篇文章主要為大家詳細(xì)介紹了用C語言編寫推箱子游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Qt實(shí)現(xiàn)文本編輯器(一)

    Qt實(shí)現(xiàn)文本編輯器(一)

    在Qt中QMainWindow是一個(gè)為用戶提供主窗口程序的類,包含了:菜單欄、工具欄、錨接部件、狀態(tài)欄以及一個(gè)中部件。本文將利用QMainWindow制作一個(gè)文本編輯器,感興趣的可以試一試
    2022-01-01

最新評論