參考視頻:https://www.bilibili.com/video/BV1XW411x7AB?p=12node
xml簡介:可擴展標記語言,標準通用標記語言的子集,簡稱XML。是一種用於標記電子文件使其具備結構性的標記語言。app
XML 標籤沒有被預約義,須要自行定義標籤。XML 的設計宗旨是傳輸數據,而不是顯示數據。XML 是獨立於軟件和硬件的信息傳輸工具。ide
頭部:xml文件的聲明,說明xml版本和編碼格式;工具
標籤:標籤須要成對出現。從(且包括)開始標籤直到(且包括)結束標籤的部分叫作XML 元素。測試
屬性組:提供有關元素的額外信息,必須加引號。ui
xml文檔造成的是一種樹型結構。this
下面簡單介紹使用Qt建立一個xml文件,並對其進行簡單的寫入、讀取操做。編碼
先給出實現的效果,經過代碼建立一個以下格式的xml文件,並經過id來查找到相應的節點信息。spa
1 <?xml version='1.0' encoding='utf-8'?> 2 <root> 3 <id id="1"> 4 <name>xiaoming</name> 5 <gender>male</gender> 6 <age>19</age> 7 <subject>Chinese</subject> 8 <score>78</score> 9 </id> 10 <id id="2"> 11 <name>xiaohong</name> 12 <gender>famale</gender> 13 <age>18</age> 14 <subject>Math</subject> 15 <score>88</score> 16 </id> 17 </root>
代碼中的註釋已經很詳細了,就再也不說說明步驟了,直接給出代碼。設計
widget.h文件代碼:
1 #ifndef WIDGET_H 2 #define WIDGET_H 3 4 #include <QWidget> 5 #include <QDomDocument> 6 7 namespace Ui { 8 class Widget; 9 } 10 11 class Widget : public QWidget 12 { 13 Q_OBJECT 14 15 public: 16 explicit Widget(QWidget *parent = 0); 17 ~Widget(); 18 19 //建立xml空文件 20 void create_xml(QString file_path); 21 //追加xml文件 22 void append_xml(QString file_path, int id, QStringList list); 23 //寫xml文件 24 void write_xml(QDomDocument &doc, QDomElement &root, int id, QStringList &list); 25 //讀xml文件 26 void read_xml(QString file_path, int id, QStringList &list); 27 28 private: 29 Ui::Widget *ui; 30 }; 31 32 #endif // WIDGET_H
widget.c文件代碼:
1 #include "widget.h" 2 #include "ui_widget.h" 3 #include <QDomComment> 4 #include <QFile> 5 #include <QDebug> 6 7 Widget::Widget(QWidget *parent) : 8 QWidget(parent), 9 ui(new Ui::Widget) 10 { 11 ui->setupUi(this); 12 13 QString file_path = "../demo.xml"; 14 15 create_xml(file_path); 16 17 QStringList list; 18 //姓名 性別 年齡 學課 分數 19 list << "xiaoming" << "male" << "19" << "Chinese" << "78"; 20 append_xml(file_path, 1, list); 21 list.clear(); 22 list << "xiaohong" << "famale" << "18" << "Math" << "88"; 23 append_xml(file_path, 2, list); 24 list.clear(); 25 read_xml(file_path, 2, list); 26 qDebug() << list; 27 } 28 29 Widget::~Widget() 30 { 31 delete ui; 32 } 33 34 /* 35 * 建立xml文件,空文件,僅包含頭部信息和根元素節點 36 * 參數file_path:文件存放路徑 37 */ 38 void Widget::create_xml(QString file_path) 39 { 40 QFile file(file_path); //關聯文件名字 41 if (true == file.exists()) { //若是存在不建立 42 qDebug() << "文件已經存在"; 43 return; 44 } 45 //只寫方式打開文件 46 bool isOK = file.open(QIODevice::WriteOnly); 47 if (false == isOK) { 48 qDebug() << "writeOnly error"; 49 return; 50 } 51 //建立xml文檔對象 52 QDomDocument doc; 53 //建立xml頭部格式:<?xml version='1.0' encoding='utf-8'?> 54 QDomProcessingInstruction ins; 55 ins = doc.createProcessingInstruction("xml", "version=\'1.0\' encoding=\'utf-8\'"); 56 //追加元素 57 doc.appendChild(ins); 58 //建立根節點元素 59 QDomElement root = doc.createElement("root"); 60 doc.appendChild(root); 61 //保存 62 QTextStream stream(&file); //文本流關聯文件 63 doc.save(stream, 4); //4 縮進字符 64 65 //關閉文件 66 file.close(); 67 } 68 69 /* 70 * 向xml文件中追加元素 71 * 參數file_path:文件存放路徑 72 * 參數id:<id>元素節點的屬性 73 * 參數list:<id>節點元素的子節點元素值 74 */ 75 void Widget::append_xml(QString file_path, int id, QStringList list) 76 { 77 QFile file(file_path); //關聯文件名字 78 //只讀方式打開文件 79 bool isOK = file.open(QIODevice::ReadOnly); 80 if (false == isOK) { 81 qDebug() << "ReadOnly error"; 82 return; 83 } 84 //文件file和xml關聯 85 QDomDocument doc; 86 isOK = doc.setContent(&file); 87 if (false == isOK) { 88 qDebug() << "setContent error"; 89 } 90 //關聯成功後,能夠關閉文件 91 file.close(); 92 //獲取根節點元素 93 QDomElement root = doc.documentElement(); 94 //判斷根節點下有沒有子節點 95 if (root.hasChildNodes()) { //若是有子節點 96 //查找最後一個子節點 97 QDomElement last_elem = doc.lastChildElement(); 98 write_xml(doc, last_elem, id, list); 99 } else { //沒有子節點 100 //寫有效數據 101 write_xml(doc, root, id, list); 102 } 103 //保存文件 104 isOK = file.open(QIODevice::WriteOnly); 105 if (false == isOK) { 106 qDebug() << "writeOnly error"; 107 return; 108 } 109 QTextStream stream(&file); 110 doc.save(stream, 4); 111 file.close(); 112 } 113 114 /* 115 * 給<root>根節點元素添加子節點元素 116 * 參數doc:xml文件 117 * 參數root:<root>節點元素 118 * 參數id:<id>節點元素屬性值 119 * 參數list:<id>節點元素的子節點元素值 120 */ 121 void Widget::write_xml(QDomDocument &doc, QDomElement &root, int id, QStringList &list) 122 { 123 //添加<id>節點元素 124 QDomElement elem_id = doc.createElement("id"); 125 QDomAttr attr_id = doc.createAttribute("id"); 126 QString attr_str = QString::number(id); 127 attr_id.setNodeValue(attr_str); 128 elem_id.setAttributeNode(attr_id); 129 root.appendChild(elem_id); 130 131 //建立<姓名><性別><年齡><學課><分數>節點元素 132 QDomText text; 133 QDomElement name_elem = doc.createElement("name"); 134 text = doc.createTextNode(list.at(0)); 135 name_elem.appendChild(text); 136 QDomElement gender_elem = doc.createElement("gender"); 137 text = doc.createTextNode(list.at(1)); 138 gender_elem.appendChild(text); 139 QDomElement age_elem = doc.createElement("age"); 140 text = doc.createTextNode(list.at(2)); 141 age_elem.appendChild(text); 142 QDomElement subject_elem = doc.createElement("subject"); 143 text = doc.createTextNode(list.at(3)); 144 subject_elem.appendChild(text); 145 QDomElement score_elem = doc.createElement("score"); 146 text = doc.createTextNode(list.at(4)); 147 score_elem.appendChild(text); 148 //追加到<id>節點後面 149 elem_id.appendChild(name_elem); 150 elem_id.appendChild(gender_elem); 151 elem_id.appendChild(age_elem); 152 elem_id.appendChild(subject_elem); 153 elem_id.appendChild(score_elem); 154 } 155 156 /* 157 * 經過id查找信息 158 * 參數file_path:xml文件路徑 159 * 參數id:查找的id 160 * 參數list:存放查找到的信息 161 */ 162 void Widget::read_xml(QString file_path, int id, QStringList &list) 163 { 164 QFile file(file_path); //關聯文件名字 165 //只讀方式打開文件 166 bool isOK = file.open(QIODevice::ReadOnly); 167 if (false == isOK) { 168 qDebug() << "ReadOnly error"; 169 return; 170 } 171 //文件file和xml關聯 172 QDomDocument doc; 173 isOK = doc.setContent(&file); 174 if (false == isOK) { 175 qDebug() << "setContent error"; 176 } 177 //關聯成功後,能夠關閉文件 178 file.close(); 179 //獲取根節點 180 QDomElement root = doc.documentElement(); 181 if (root.hasChildNodes()) { //有沒有子節點 182 QDomNodeList list_nodes = root.childNodes(); 183 int i; 184 for (i = 0; i < list_nodes.size(); i++) { 185 if (id != list_nodes.at(i).toElement().attribute("id").toInt()) { 186 continue; 187 } 188 //轉換爲元素,找到<id>節點下的全部子節點 189 QDomNodeList sublist = list_nodes.at(i).toElement().childNodes(); 190 //name 191 QString name = sublist.at(0).toElement().text(); 192 list.append(name); 193 //gender 194 QString gender = sublist.at(1).toElement().text(); 195 list.append(gender); 196 //age 197 QString age = sublist.at(2).toElement().text(); 198 list.append(age); 199 //subject 200 QString subject = sublist.at(3).toElement().text(); 201 list.append(subject); 202 //score 203 QString score = sublist.at(4).toElement().text(); 204 list.append(score); 205 break; 206 } 207 if (i == list_nodes.size()) { 208 qDebug() << QString("沒有id=%1的學生信息").arg(id); 209 return; 210 } 211 } else { //沒有子節點 212 qDebug() << "沒有子節點"; 213 return; 214 } 215 }