您好,登錄后才能下訂單哦!
這篇“C++、Qt分別讀寫xml文件的方法是什么”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C++、Qt分別讀寫xml文件的方法是什么”文章吧。
第一行是XML文檔聲明,<>內的代表是元素,基本語法如以下所示。C++常見的是使用tiny庫讀寫,Qt使用自帶的庫讀寫;
<?xml version="1.0" encoding="utf-8" standalone="yes" ?> <根元素> <元素 屬性名="屬性值" 屬性名="屬性值">Text</元素> <元素 屬性名="屬性值" 屬性名="屬性值"> <子元素>Text</子元素> </元素> </根元素>
首先從網站下載tinyxml庫,
將6個文件加載到自己的項目中:
寫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父類的析構函數內自帶delete,所以不用自己釋放 TiXmlElement *RootElement = new TiXmlElement("Camera");//根元素 RootElement->SetAttribute("num", "3"); //屬性 writeDoc->LinkEndChild(RootElement); TiXmlElement *StuElement = new TiXmlElement("Exposure");//Stu //設置屬性 StuElement->SetAttribute("time", "A"); StuElement->SetAttribute("deley", "30"); RootElement->LinkEndChild(StuElement);//父節點寫入文檔 //子元素 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函數庫中的類去讀寫根元素,text和屬性。這里主要用到的就是四個類和三個函數:
<TiXmlDeclaration> <TiXmlElement> <TiXmlElement> <TiXmlElement>TiXmlText</TiXmlElement> </TiXmlElement> </TiXmlElement>
四個類:
TiXmlDocument:定義一些基本的xml文件的基本操作,包含文件流;
TiXmlDeclaration:用于xml文件的第一行,定義xml文件的聲明操作;
TiXmlElement:不管根元素,元素和子元素,都用此類;
TiXmlText:用于元素內的text的操作;
三個函數:
LinkEndChild:將子元素嵌在父元素內,還可以將text加到元素內
SetAttribute:設置元素內的屬性名稱與屬性值
SaveFile:用于保存xml文件;如果xml文件不存在,會自動創建一個;
讀XML:
TiXmlDocument mydoc("E:/test.xml"); if(!mydoc.LoadFile()) { return; } TiXmlElement *RootElement = mydoc.RootElement(); //獲取根元素 //遍歷根元素下的元素 for(TiXmlElement *StuElement = RootElement->FirstChildElement();//第一個子元素 StuElement != NULL; StuElement = StuElement->NextSiblingElement())//下一個兄弟元素 { //先找到Exposure元素 if (0 == strcmp("Exposure", StuElement->Value())) { //遍歷Exposure元素下的子元素 for (TiXmlElement *sonElement = StuElement->FirstChildElement(); sonElement != NULL; sonElement = sonElement->NextSiblingElement()) { //找到max元素,并輸出元素內的text if (0 == strcmp("max", sonElement->Value())) { string str = sonElement->GetText(); cout << str.c_str() << endl; } } } }
寫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); //根節點元素 QDomElement root = doc.createElement("Camera"); doc.appendChild(root); //在根節點的基礎上增加一個子節點 QDomElement sonEmt = doc.createElement("Exposure"); //創建元素的屬性名 QDomAttr sonAttr = doc.createAttribute("time"); //創建元素的屬性值 sonAttr.setNodeValue("100"); //節點和屬性關聯 sonEmt.setAttributeNode(sonAttr); root.appendChild(sonEmt); //在根節點的基礎上增加一個子節點,并設置子節點的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縮進
這里對應的類有:
<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 { //將文件內容讀到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()); //判斷第一個節點 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()); //判斷第二個元素 if(node.isElement() && "max"== strXML) QString textStr = qPrintable(node.toElement().text());//讀取子元素內的text } } } } }
界面讀取的效果為:
以上就是關于“C++、Qt分別讀寫xml文件的方法是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。