Qt-操做xml文件

1  簡介

參考視頻:https://www.bilibili.com/video/BV1XW411x7AB?p=12node

xml簡介:可擴展標記語言,標準通用標記語言的子集,簡稱XML。是一種用於標記電子文件使其具備結構性的標記語言。app

XML 標籤沒有被預約義,須要自行定義標籤。XML 的設計宗旨是傳輸數據,而不是顯示數據。XML 是獨立於軟件和硬件的信息傳輸工具。ide

2  xml文件格式

頭部:xml文件的聲明,說明xml版本和編碼格式;工具

標籤:標籤須要成對出現。從(且包括)開始標籤直到(且包括)結束標籤的部分叫作XML 元素。測試

屬性組:提供有關元素的額外信息,必須加引號。ui

xml文檔造成的是一種樹型結構。this

3  測試及說明

下面簡單介紹使用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
View Code

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 }
View Code
相關文章
相關標籤/搜索