1、QXML通常與HTML相關聯,HTML主要用來顯示網頁數據,而XML主要用來存儲數據,Qt提供了一套操作xml的接口;
2、簡單格式如下:

<?xml version='1.0' encoding='utf-8'?> // 格式頭 <日銷售清單> // 根節點 根元素 <日期 date="2020-12-10"> // 子元素 子節點 <時間 time="12-14-04"> <廠家>二汽神龍</廠家> <品牌>畢加索</品牌> <報價>39</報價> <數量>1</數量> <金額>39</金額> </時間> <時間 time="12-14-22"> <廠家>二汽神龍</廠家> <品牌>畢加索</品牌> <報價>39</報價> <數量>1</數量> <金額>39</金額> </時間> </日期> <日期 date="2020-12-11"> <時間 time="12-16-18"> <廠家>二汽神龍</廠家> <品牌>畢加索</品牌> <報價>39</報價> <數量>1</數量> <金額>39</金額> </時間> <時間 time="14-53-45"> <廠家>二汽神龍</廠家> <品牌>畢加索</品牌> <報價>39</報價> <數量>1</數量> <金額>39</金額> </時間> </日期> </日銷售清單>
3、操作XML之前需要在工程文件下添加
QT += xml // 主要包含的頭文件: #include <QDomDocument> // 文檔 #include <QDomProcessingInstruction> // 標題頭 #include <QDomElement> // 元素 #include <QTextStream> // 借助文本流保存數據 #include <QStringList>
4、創建XML文件
void domXML::createXML(QString filePath) { QFile file(filePath); if(true == file.exists()) // 文件存在 { qDebug() << "文件已經存在"; return; }else{ // 文件不存在才創建 bool isok = file.open(QIODevice::WriteOnly); if(true == isok) {// 創建文件成功 QDomDocument doc; // 創建XML頭部格式 <?xml version='1.0' encoding='utf-8'?> QDomProcessingInstruction ins; ins = doc.createProcessingInstruction("xml","version=\'1.0\' encoding=\'utf-8\'"); // 追加元素 doc.appendChild(ins); // 根節點元素 QDomElement root = doc.createElement("日銷售清單"); doc.appendChild(root); // 和上面的是平級的 // 保存 借助文本流 QTextStream stream(&file); // 文本流與文件關聯 doc.save(stream,4); // 文件中4字節縮進 // 關閉文件 file.close(); }else{ // 創建文件失敗 qDebug() << "文件創建失敗"; return; } } }
5、XML文件中添加數據
// xml文件中添加數據 list 廠家、 品牌、報價、數量、金額 void domXML::appendXML(QString filePath, QStringList list) { QFile file(filePath); bool isok = file.open(QIODevice::ReadOnly); if(true == isok){ // 打開文件ok // file文件和xml文檔對象關聯 QDomDocument doc; isok = doc.setContent(&file); if(isok == true){ // 關聯成功 相當於把file的內容已經讀入了doc中 file.close(); //1、 獲取根節點元素 QDomElement root = doc.documentElement(); // 默認獲取根節點元素 // 獲取當前時間 QDateTime date = QDateTime::currentDateTime(); QString dateStr = date.toString("yyyy-MM-dd"); // 2020-10-9 // 2、判斷根節點有沒有子節點 if(root.hasChildNodes()){ // 有子節點 // 查找最后一個子節點 QDomElement lastElm = root.lastChildElement(); // if(lastElm.attribute("date") == dateStr) // 判斷是否有當天的日期 { // 有當天日期 // 寫入有效數據 writeXML(doc,lastElm,list); }else{ // 沒有當天日期 // 創建日期子節點 QDomElement dateElm = doc.createElement("日期"); // 創建date屬性 QDomAttr dateAttr = doc.createAttribute("date"); // 設置屬性值 dateAttr.setNodeValue(dateStr); // 節點和屬性關聯 dateElm.setAttributeNode(dateAttr); // 日期節點追加到根節點 root.appendChild(dateElm); // 寫有效數據 writeXML(doc,dateElm,list); } }else{ // 沒有子節點,創建子節點 // 創建日期子節點 QDomElement dateElm = doc.createElement("日期"); // 創建date屬性 QDomAttr dateAttr = doc.createAttribute("date"); // 設置屬性值 dateAttr.setNodeValue(dateStr); // 節點和屬性關聯 dateElm.setAttributeNode(dateAttr); // 日期節點追加到根節點 root.appendChild(dateElm); // 寫有效數據 writeXML(doc,dateElm,list); } // 保存文件 數據還在doc中 isok = file.open(QIODevice::WriteOnly); if(true == isok){ QTextStream stream(&file); doc.save(stream,4); }else{ qDebug() << "文件打開失敗"; } }else{ // 關聯失敗 qDebug() << "關聯文檔失敗"; } }else{ // 打開文件err qDebug() << "打開文件失敗"; return; } }
6、寫入有效數據
// 寫入有效數據 void domXML::writeXML(QDomDocument &doc, QDomElement &root, QStringList list) { // 獲取當前時間 QDateTime time = QDateTime::currentDateTime(); QString timeStr = time.toString("hh-mm-ss"); // 18:34:23 // 創建時間節點元素 QDomElement timeElm = doc.createElement("時間"); // 創建時間節點對應的屬性 QDomAttr timeAttr = doc.createAttribute("time"); // 給屬性設定值 timeAttr.setNodeValue(timeStr); // 時間節點與時間屬性關聯起來 timeElm.setAttributeNode(timeAttr); // 時間節點追加到日期節點后面 root.appendChild(timeElm); // 創建元素 QDomElement factory = doc.createElement("廠家"); QDomElement brand = doc.createElement("品牌"); QDomElement price = doc.createElement("報價"); QDomElement num = doc.createElement("數量"); QDomElement total = doc.createElement("金額"); // 上面元素中的文本 QDomText text = doc.createTextNode(list.at(0)); factory.appendChild(text); text = doc.createTextNode(list.at(1)); brand.appendChild(text); text = doc.createTextNode(list.at(2)); price.appendChild(text); text = doc.createTextNode(list.at(3)); num.appendChild(text); text = doc.createTextNode(list.at(4)); total.appendChild(text); timeElm.appendChild(factory); timeElm.appendChild(brand); timeElm.appendChild(price); timeElm.appendChild(num); timeElm.appendChild(total); }
7、從XML文檔中讀取有效數據
void domXML::readXML(QString filePath, QStringList &fList, QStringList &bList, QStringList &pList, QStringList &nList, QStringList &tList) { QFile file(filePath); bool isok = file.open(QIODevice::ReadOnly); if(true == isok) { // 打開文件成功 QDomDocument doc; isok = doc.setContent(&file); // 與文檔關聯 if(true == isok){ // 關聯成功 file.close(); // 獲取當前日期 QDateTime date = QDateTime::currentDateTime(); QString dateStr = date.toString("yyyy-MM-dd"); // 獲取根節點 QDomElement root = doc.documentElement(); if(root.hasChildNodes()){// 有子節點 // 找最后一個元素 QDomElement lastElm = root.lastChildElement(); if(lastElm.attribute("date") == dateStr) // 判斷有沒有當天的數據 { // 找出當天下的所有時間子節點 QDomNodeList list = lastElm.childNodes(); for(int i=0;i<list.size();i++){ // 轉換為元素,找到節點下所有子節點 工廠、品牌 QDomNodeList subList = list.at(i).childNodes(); // factory QString factory = subList.at(0).toElement().text(); // 轉換為文本 fList.append(factory); QString brand = subList.at(1).toElement().text(); // 轉換為文本 bList.append(brand); QString price = subList.at(2).toElement().text(); // 轉換為文本 pList.append(price); QString num = subList.at(3).toElement().text(); // 轉換為文本 nList.append(num); QString total = subList.at(4).toElement().text(); // 轉換為文本 tList.append(total); } }else{ // 不存在黨的日期 } }else{ // 沒有子節點 } }else{ // 關聯失敗 } }else{ // 打開文件失敗 } }
8、其他

// 聲明 // 創建xml文件 static void createXML(QString filePath); // xml文件中添加數據 list 廠家、 品牌、報價、數量、金額 static void appendXML(QString filePath,QStringList list); static void writeXML(QDomDocument &doc,QDomElement &root,QStringList list); static void readXML(QString filePath, QStringList &fList, QStringList &bList, QStringList &pList, QStringList &nList, QStringList &tList); // 測試 // 創建xml文件 domXML::createXML("../xmldata.xml"); //添加日期新節點 QStringList list; list <<"二汽神龍"<< "畢加索"<< "39" << "1" << "39"; domXML::appendXML("../xmldata.xml",list); QStringList fList; QStringList bList; QStringList pList; QStringList nList; QStringList tList; domXML::readXML("../xmldata.xml",fList,bList,pList,nList,tList); for(int i=0;i<nList.size();i++) { QString str = QString("%1:%2賣出了%3,單價為:%4,總價:%5") .arg(fList.at(i)) .arg(bList.at(i)) .arg(nList.at(i)) .arg(pList.at(i)) .arg(tList.at(i)); qDebug() << str; }
//寫入有效數據
voiddomXML::writeXML(QDomDocument&doc,QDomElement&root,QStringListlist)
{
//獲取當前時間
QDateTimetime=QDateTime::currentDateTime();
QStringtimeStr=time.toString("hh-mm-ss");//18:34:23
//創建時間節點元素
QDomElementtimeElm=doc.createElement("時間");
//創建時間節點對應的屬性
QDomAttrtimeAttr=doc.createAttribute("time");
//給屬性設定值
timeAttr.setNodeValue(timeStr);
//時間節點與時間屬性關聯起來
timeElm.setAttributeNode(timeAttr);
//時間節點追加到日期節點后面
root.appendChild(timeElm);
//創建元素
QDomElementfactory=doc.createElement("廠家");
QDomElementbrand=doc.createElement("品牌");
QDomElementprice=doc.createElement("報價");
QDomElementnum=doc.createElement("數量");
QDomElementtotal=doc.createElement("金額");
//上面元素中的文本
QDomTexttext=doc.createTextNode(list.at(0));
factory.appendChild(text);
text=doc.createTextNode(list.at(1));
brand.appendChild(text);
text=doc.createTextNode(list.at(2));
price.appendChild(text);
text=doc.createTextNode(list.at(3));
num.appendChild(text);
text=doc.createTextNode(list.at(4));
total.appendChild(text);
timeElm.appendChild(factory);
timeElm.appendChild(brand);
timeElm.appendChild(price);
timeElm.appendChild(num);
timeElm.appendChild(total);
}