最近研究了一下qt下对xml文件的读写,小计一下,成为自己的知识。
main函数调用:
1 #include <QApplication> 2 #include "readconfig.h" 3 #include "writeconfig.h" 4 5 int main(int argc,char **argv) 6 { 7 QApplication a(argc,argv); 8 9 //ReadConfig readConfig; 10 11 //readConfig.changeSave(); 12 13 WriteConfig writeConfig; 14 15 QFile file; 16 QString fileName = "Motor.xml"; 17 if(!file.exists(fileName)) 18 { 19 writeConfig.createFile(fileName); 20 } 21 22 writeConfig.writeFile(fileName); 23 24 a.exec(); 25 26 return 0; 27 }
写入xml文件WriteConfig.cpp
1 #include "writeconfig.h" 2 3 WriteConfig::WriteConfig() 4 { 5 } 6 7 8 bool WriteConfig::writeFile(QString fileName) 9 { 10 QFile file(fileName); 11 12 if(!file.open(QFile::ReadOnly | QFile::Text)) 13 { 14 qDebug()<<"open for add error..."; 15 return false; 16 } 17 18 QDomDocument doc; 19 20 QString errorStr; 21 int errorLine; 22 int errorColumn; 23 24 if (!doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn)) 25 { 26 qDebug()<<"add setcontent error..." <<"errorStr&&&&"<<errorStr<<"errorLine"<<errorLine<<"errorColume"<<errorColumn; 27 //file.close(); 28 } 29 30 31 file.close(); 32 33 QDomElement root = doc.documentElement(); 34 if(root.isNull()) 35 { 36 root = doc.createElement("configinfo"); 37 } 38 QDomElement elementRoot = doc.createElement("motor"); 39 elementRoot.setAttribute("mount","6"); 40 QDomElement elementSpeed = doc.createElement("speed"); 41 QDomElement elementAcceleSpeed= doc.createElement("accelespeed"); 42 QDomElement elementAASpeed = doc.createElement("aaspeed"); 43 QDomElement elementPosition = doc.createElement("position"); 44 45 QDomElement elementV1 = doc.createElement("v"); 46 QDomElement elementV2 = doc.createElement("v"); 47 QDomElement elementV3 = doc.createElement("v"); 48 QDomElement elementV4 = doc.createElement("v"); 49 QDomElement elementV5 = doc.createElement("v"); 50 QDomElement elementV6 = doc.createElement("v");
51 QDomElement elementA1 = doc.createElement("a"); 52 QDomElement elementA2 = doc.createElement("a"); 53 QDomElement elementA3 = doc.createElement("a"); 54 QDomElement elementA4 = doc.createElement("a"); 55 QDomElement elementA5 = doc.createElement("a"); 56 QDomElement elementA6 = doc.createElement("a");
57 QDomElement elementAA1 = doc.createElement("aa"); 58 QDomElement elementAA2 = doc.createElement("aa"); 59 QDomElement elementAA3 = doc.createElement("aa"); 60 QDomElement elementAA4 = doc.createElement("aa"); 61 QDomElement elementAA5 = doc.createElement("aa"); 62 QDomElement elementAA6 = doc.createElement("aa");
63 QDomElement elementP1 = doc.createElement("p"); 64 QDomElement elementP2 = doc.createElement("p"); 65 QDomElement elementP3 = doc.createElement("p"); 66 QDomElement elementP4 = doc.createElement("p"); 67 QDomElement elementP5 = doc.createElement("p"); 68 QDomElement elementP6 = doc.createElement("p"); 69 70 71 QDomText text; 72 text = doc.createTextNode("123.25"); 73 elementV1.appendChild(text); 74 elementSpeed.appendChild(elementV1); 75 text = doc.createTextNode("223.25"); 76 elementV2.appendChild(text); 77 elementSpeed.appendChild(elementV2); 78 text = doc.createTextNode("323.25"); 79 elementV3.appendChild(text); 80 elementSpeed.appendChild(elementV3); 81 text = doc.createTextNode("423.25"); 82 elementV4.appendChild(text); 83 elementSpeed.appendChild(elementV4); 84 text = doc.createTextNode("523.25"); 85 elementV5.appendChild(text); 86 elementSpeed.appendChild(elementV5); 87 text = doc.createTextNode("623.25"); 88 elementV6.appendChild(text); 89 elementSpeed.appendChild(elementV6); 90 91 text = doc.createTextNode("1023.25"); 92 elementA1.appendChild(text); 93 elementAcceleSpeed.appendChild(elementA1); 94 text = doc.createTextNode("2023.25"); 95 elementA2.appendChild(text); 96 elementAcceleSpeed.appendChild(elementA2); 97 text = doc.createTextNode("3023.25"); 98 elementA3.appendChild(text); 99 elementAcceleSpeed.appendChild(elementA3); 100 text = doc.createTextNode("4023.25"); 101 elementA4.appendChild(text); 102 elementAcceleSpeed.appendChild(elementA4); 103 text = doc.createTextNode("5023.25"); 104 elementA5.appendChild(text); 105 elementAcceleSpeed.appendChild(elementA5); 106 text = doc.createTextNode("6023.25"); 107 elementA6.appendChild(text); 108 elementAcceleSpeed.appendChild(elementA6); 109 110 text = doc.createTextNode("12.25"); 111 elementAA1.appendChild(text); 112 elementAASpeed.appendChild(elementAA1); 113 text = doc.createTextNode("22.25"); 114 elementAA2.appendChild(text); 115 elementAASpeed.appendChild(elementAA2); 116 text = doc.createTextNode("32.25"); 117 elementAA3.appendChild(text); 118 elementAASpeed.appendChild(elementAA3); 119 text = doc.createTextNode("42.25"); 120 elementAA4.appendChild(text); 121 elementAASpeed.appendChild(elementAA4); 122 text = doc.createTextNode("52.25"); 123 elementAA5.appendChild(text); 124 elementAASpeed.appendChild(elementAA5); 125 text = doc.createTextNode("62.25"); 126 elementAA6.appendChild(text); 127 elementAASpeed.appendChild(elementAA6); 128 129 text = doc.createTextNode("12325"); 130 elementP1.appendChild(text); 131 elementPosition.appendChild(elementP1); 132 text = doc.createTextNode("22325"); 133 elementP2.appendChild(text); 134 elementPosition.appendChild(elementP2); 135 text = doc.createTextNode("32325"); 136 elementP3.appendChild(text); 137 elementPosition.appendChild(elementP3); 138 text = doc.createTextNode("42325"); 139 elementP4.appendChild(text); 140 elementPosition.appendChild(elementP4); 141 text = doc.createTextNode("52325"); 142 elementP5.appendChild(text); 143 elementPosition.appendChild(elementP5); 144 text = doc.createTextNode("62325"); 145 elementP6.appendChild(text); 146 elementPosition.appendChild(elementP6); 147 148 text.clear(); 149 150 elementRoot.appendChild(elementSpeed); 151 elementRoot.appendChild(elementAcceleSpeed); 152 elementRoot.appendChild(elementAASpeed); 153 elementRoot.appendChild(elementPosition); 154 root.appendChild(elementRoot); 155 156 157 158 if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) 159 { 160 qDebug()<<"open for add error!!"; 161 } 162 163 QTextStream out(&file); 164 doc.save(out,4); 165 file.close(); 166 return true; 167 } 168 169 170 bool WriteConfig::createFile(QString fileName) 171 { 172 QFile file(fileName); 173 file.open(QIODevice::ReadWrite); 174 QDomDocument doc; 175 QDomProcessingInstruction instruction; 176 instruction = doc.createProcessingInstruction("xml","version="1.0" encoding="GB2312""); 177 doc.appendChild(instruction); 178 QDomElement root = doc.createElement("configinfo"); 179 180 doc.appendChild(root); 181 QDomText text = doc.createTextNode(""); 182 root.appendChild(text); 183 QTextStream out(&file); 184 doc.save(out,4); 185 file.close(); 186 }
读xml文件ReadConfig.cpp
1 bool ReadConfig::openXmlFile(QString filePath) 2 { 3 QFile file(filePath); 4 if( !file.open(QFile::ReadOnly | QFile::Text)) 5 { 6 qDebug() << QObject::tr("error::ParserXML->OpenXmlFile->file.open->%s ") << filePath; 7 8 return false; 9 } 10 11 if( !m_doc.setContent(&file)) 12 { 13 qDebug() << QObject::tr("error::ParserXML->OpenXmlFile->doc.setContent ") << filePath; 14 15 file.close(); 16 return false; 17 } 18 file.close(); 19 return true; 20 } 21 22 bool ReadConfig::changeSave() 23 { 24 QString fileName = "Motor.xml"; 25 if(!openXmlFile(fileName)) 26 { 27 return false; 28 } 29 //修改保存xml 30 QDomElement root = m_doc.documentElement(); 31 if(root.tagName()!= "configinfo") 32 return false; 33 QDomNode n = root.firstChild(); 34 while ( !n.isNull() ) 35 { 36 QDomElement e = n.toElement(); 37 if( !e.isNull()) 38 { 39 if( e.nodeName() == "motor" ) 40 { 41 if(e.hasAttributes()) 42 { 43 QDomNamedNodeMap tmpMap = e.attributes(); 44 for(int i = 0; i < (int)tmpMap.size();i++) 45 { 46 QString nodeName = tmpMap.item(i).nodeName(); 47 QString nodeValue = tmpMap.item(i).nodeValue(); 48 if("mount" == nodeName) 49 { 50 if(!nodeValue.isNull() && !nodeValue.isEmpty()) 51 { 52 jointNum = nodeValue.toInt(); 53 qDebug() << "************jointNum ="<<jointNum<<endl; 54 } 55 } 56 } 57 } 58 QDomNodeList list = e.childNodes(); //获得元素e的所有子节点的列表 59 for(int a=0; a<list.count(); a++) //遍历该列表 60 { 61 QDomNode node = list.at(a); 62 if(node.isElement()) 63 { 64 if( node.nodeName() == "speed" ) 65 { 66 if(node.hasChildNodes()) 67 { 68 QDomNodeList speedList = node.childNodes(); 69 for(int i = 0; i < speedList.size(); i++) 70 { 71 if("v" == speedList.at(i).toElement().tagName()) 72 { 73 qDebug()<<"****speedList***"<<speedList.at(i).toElement().text().toDouble(); 74 } 75 } 76 } 77 } 78 if( node.nodeName() == "accelespeed" ) 79 { 80 if(node.hasChildNodes()) 81 { 82 QDomNodeList speedList = node.childNodes(); 83 for(int i = 0; i < speedList.size(); i++) 84 { 85 if("a" == speedList.at(i).toElement().tagName()) 86 { 87 qDebug()<<"****speedList***"<<speedList.at(i).toElement().text().toDouble(); 88 } 89 } 90 } 91 } 92 if(node.nodeName() == "aaspeed") 93 { 94 if(node.hasChildNodes()) 95 { 96 QDomNodeList speedList = node.childNodes(); 97 for(int i = 0; i < speedList.size(); i++) 98 { 99 if("aa" == speedList.at(i).toElement().tagName()) 100 { 101 qDebug()<<"****speedList***"<<speedList.at(i).toElement().text().toDouble(); 102 } 103 } 104 } 105 } 106 if(node.nodeName() == "position") 107 { 108 if(node.hasChildNodes()) 109 { 110 QDomNodeList speedList = node.childNodes(); 111 for(int i = 0; i < speedList.size(); i++) 112 { 113 if("p" == speedList.at(i).toElement().tagName()) 114 { 115 qDebug()<<"****speedList***"<<speedList.at(i).toElement().text().toLongLong(); 116 } 117 } 118 } 119 } 120 } 121 } 122 } 123 } 124 n = n.nextSibling(); 125 } 126 QFile filexml(fileName); 127 if( !filexml.open( QFile::WriteOnly | QFile::Truncate) ) 128 { 129 qWarning("error::ParserXML->writeOperateXml->file.open "); 130 return false; 131 } 132 QTextStream ts(&filexml); 133 ts.reset(); 134 ts.setCodec("utf-8"); 135 m_doc.save(ts, 4, QDomNode::EncodingFromTextStream); 136 filexml.close(); 137 return true; 138 }
xml文件
Motor.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <configinfo> 3 <motor mount="6"> 4 <speed> 5 <v>123.25</v> 6 <v>223.25</v> 7 <v>323.25</v> 8 <v>423.25</v> 9 <v>523.25</v> 10 <v>623.25</v> 11 </speed> 12 <accelespeed> 13 <a>1023.25</a> 14 <a>2023.25</a> 15 <a>3023.25</a> 16 <a>4023.25</a> 17 <a>5023.25</a> 18 <a>6023.25</a> 19 </accelespeed> 20 <aaspeed> 21 <aa>12.25</aa> 22 <aa>22.25</aa> 23 <aa>32.25</aa> 24 <aa>42.25</aa> 25 <aa>52.25</aa> 26 <aa>62.25</aa> 27 </aaspeed> 28 <position> 29 <p>12325</p> 30 <p>22325</p> 31 <p>32325</p> 32 <p>42325</p> 33 <p>52325</p> 34 <p>62325</p> 35 </position> 36 </motor> 37 </configinfo>
在使用的时候一定要注意路径问题,以上代码通过编译测试。