C++、Qt分別讀寫xml文件的方法實(shí)例
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í)例
下面小編就為大家?guī)硪黄猚語言printf實(shí)現(xiàn)同一位置打印輸出的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09C語言當(dāng)函數(shù)執(zhí)行成功時(shí)return1還是0
本文主要介紹了C語言當(dāng)函數(shù)執(zhí)行成功時(shí)return1還是0,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09C++ 設(shè)置和獲取當(dāng)前工作路徑的實(shí)現(xiàn)代碼
這篇文章主要介紹了C++ 設(shè)置和獲取當(dāng)前工作路徑的實(shí)現(xiàn)代碼,防止DLL加載不到配置和文件,需要的朋友可以參考下2017-09-09