C++、Qt分別讀寫(xiě)xml文件的方法實(shí)例
XML語(yǔ)法
第一行是XML文檔聲明,<>內(nèi)的代表是元素,基本語(yǔ)法如以下所示。C++常見(jiàn)的是使用tiny庫(kù)讀寫(xiě),Qt使用自帶的庫(kù)讀寫(xiě);
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<根元素>
<元素 屬性名="屬性值" 屬性名="屬性值">Text</元素>
<元素 屬性名="屬性值" 屬性名="屬性值">
<子元素>Text</子元素>
</元素>
</根元素>
C++使用tinyxml讀寫(xiě)xml
首先從網(wǎng)站下載tinyxml庫(kù),
將6個(gè)文件加載到自己的項(xiàng)目中:

寫(xiě)XML:
新建文件并寫(xiě)入:
#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); //寫(xiě)入文檔
//TiXmlElement父類(lèi)的析構(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)寫(xiě)入文檔
//子元素
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ù)庫(kù)中的類(lèi)去讀寫(xiě)根元素,text和屬性。這里主要用到的就是四個(gè)類(lèi)和三個(gè)函數(shù):
<TiXmlDeclaration>
<TiXmlElement>
<TiXmlElement>
<TiXmlElement>TiXmlText</TiXmlElement>
</TiXmlElement>
</TiXmlElement>
四個(gè)類(lèi):
- TiXmlDocument:定義一些基本的xml文件的基本操作,包含文件流;
- TiXmlDeclaration:用于xml文件的第一行,定義xml文件的聲明操作;
- TiXmlElement:不管根元素,元素和子元素,都用此類(lèi);
- TiXmlText:用于元素內(nèi)的text的操作;
三個(gè)函數(shù):
- LinkEndChild:將子元素嵌在父元素內(nèi),還可以將text加到元素內(nèi)
- SetAttribute:設(shè)置元素內(nèi)的屬性名稱(chēng)與屬性值
- 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讀寫(xiě)xml
寫(xiě)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);
//寫(xiě)入文件
QTextStream stream(&file);
doc.save(stream,4);//4縮進(jìn)
這里對(duì)應(yīng)的類(lèi)有:
<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();
//返回根元素的名稱(chēng)
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分別讀寫(xiě)xml文件的文章就介紹到這了,更多相關(guān)C++ Qt讀寫(xiě)xml文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++編程模板匹配超詳細(xì)的識(shí)別手寫(xiě)數(shù)字實(shí)現(xiàn)示例
大家好!本篇文章是關(guān)于手寫(xiě)數(shù)字識(shí)別的,接下來(lái)我將在這里記錄我的手寫(xiě)數(shù)字識(shí)別的從零到有,我在這里把我自己的寫(xiě)代碼過(guò)程發(fā)出來(lái),希望能幫到和我一樣努力求知的人2021-10-10
C++找出字符串中出現(xiàn)最多的字符和次數(shù),時(shí)間復(fù)雜度小于O(n^2)
今天小編就為大家分享一篇關(guān)于C++找出字符串中出現(xiàn)最多的字符和次數(shù),時(shí)間復(fù)雜度小于O(n^2),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
C語(yǔ)言單向鏈表的表示與實(shí)現(xiàn)實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言單向鏈表的表示與實(shí)現(xiàn),需要的朋友可以參考下2014-07-07
vs2019 MFC實(shí)現(xiàn)office界面的畫(huà)圖小項(xiàng)目
本文主要介紹了vs2019 MFC實(shí)現(xiàn)office界面的畫(huà)圖小項(xiàng)目,對(duì)大家入門(mén)有一定的幫助,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06
C++實(shí)現(xiàn)正整數(shù)的四則運(yùn)算表達(dá)式
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)正整數(shù)的四則運(yùn)算表達(dá)式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06

