Qt-操作xml⽂件
1  简介
参考视频:
xml简介:可扩展标记语⾔,标准通⽤标记语⾔的⼦集,简称XML。是⼀种⽤于标记电⼦⽂件使其具有结构性的标记语⾔。
XML 标签没有被预定义,需要⾃⾏定义标签。XML 的设计宗旨是传输数据,⽽不是显⽰数据。XML 是独⽴于软件和硬件的信息传输⼯具。
2  xml⽂件格式
xml标签大全
头部:xml⽂件的声明,说明xml版本和编码格式;
标签:标签需要成对出现。从(且包括)开始标签直到(且包括)结束标签的部分叫做XML 元素。
属性组:提供有关元素的额外信息,必须加引号。
xml⽂档形成的是⼀种树型结构。
3  测试及说明
下⾯简单介绍使⽤Qt创建⼀个xml⽂件,并对其进⾏简单的写⼊、读取操作。
先给出实现的效果,通过代码创建⼀个如下格式的xml⽂件,并通过id来查到相应的节点信息。
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
7namespace Ui {
8class Widget;
9 }
10
11class Widget : public QWidget
12 {
13    Q_OBJECT
14
15public:
16explicit Widget(QWidget *parent = 0);
17    ~Widget();
18
19//创建xml空⽂件
20void create_xml(QString file_path);
21//追加xml⽂件
22void append_xml(QString file_path, int id, QStringList list);
23//写xml⽂件
24void write_xml(QDomDocument &doc, QDomElement &root, int id, QStringList &list); 25//读xml⽂件
26void read_xml(QString file_path, int id, QStringList &list);
27
28private:
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 = "../l";
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 {
31delete ui;
32 }
33
34/*
35* 创建xml⽂件,空⽂件,仅包含头部信息和根元素节点
36* 参数file_path:⽂件存放路径
37*/
38void Widget::create_xml(QString file_path)
39 {
40    QFile file(file_path);  //关联⽂件名字
41if (true == ists()) {  //如果存在不创建
42        qDebug() << "⽂件已经存在";
43return;
44    }
45//只写⽅式打开⽂件
46bool isOK = file.open(QIODevice::WriteOnly);
47if (false == isOK) {
48        qDebug() << "writeOnly error";
49return;
50    }
51//创建xml⽂档对象
52    QDomDocument doc;
53//创建xml头部格式:<?xml version='1.0' encoding='utf-8'?>
54    QDomProcessingInstruction ins;
55    ins = ateProcessingInstruction("xml", "version=\'1.0\' encoding=\'utf-8\'");
56//追加元素
57    doc.appendChild(ins);
58//创建根节点元素
59    QDomElement root = ateElement("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*/
75void Widget::append_xml(QString file_path, int id, QStringList list)
76 {
77    QFile file(file_path);  //关联⽂件名字
78//只读⽅式打开⽂件
79bool isOK = file.open(QIODevice::ReadOnly);
80if (false == isOK) {
81        qDebug() << "ReadOnly error";
82return;
83    }
84//⽂件file和xml关联
85    QDomDocument doc;
86    isOK = doc.setContent(&file);
87if (false == isOK) {
88        qDebug() << "setContent error";
89    }
90//关联成功后,可以关闭⽂件
91    file.close();
92//获取根节点元素
93    QDomElement root = doc.documentElement();
94//判断根节点下有没有⼦节点
95if (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);
105if (false == isOK) {
106        qDebug() << "writeOnly error";
107return;
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*/
121void Widget::write_xml(QDomDocument &doc, QDomElement &root, int id, QStringList &list) 122 {
123//添加<id>节点元素
124    QDomElement elem_id = ateElement("id");
125    QDomAttr attr_id = ateAttribute("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 = ateElement("name");
134    text = ateTextNode(list.at(0));
135    name_elem.appendChild(text);
136    QDomElement gender_elem = ateElement("gender");
137    text = ateTextNode(list.at(1));
138    gender_elem.appendChild(text);
139    QDomElement age_elem = ateElement("age");
140    text = ateTextNode(list.at(2));
141    age_elem.appendChild(text);
142    QDomElement subject_elem = ateElement("subject");
143    text = ateTextNode(list.at(3));
144    subject_elem.appendChild(text);
145    QDomElement score_elem = ateElement("score");
146    text = ateTextNode(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*/
162void Widget::read_xml(QString file_path, int id, QStringList &list)
163 {
164    QFile file(file_path);  //关联⽂件名字
165//只读⽅式打开⽂件
166bool isOK = file.open(QIODevice::ReadOnly);
167if (false == isOK) {
168        qDebug() << "ReadOnly error";
169return;
170    }
171//⽂件file和xml关联
172    QDomDocument doc;
173    isOK = doc.setContent(&file);
174if (false == isOK) {
175        qDebug() << "setContent error";
176    }
177//关联成功后,可以关闭⽂件
178    file.close();
179//获取根节点
180    QDomElement root = doc.documentElement();
181if (root.hasChildNodes()) {  //有没有⼦节点
182        QDomNodeList list_nodes = root.childNodes();
183int i;
184for (i = 0; i < list_nodes.size(); i++) {
185if (id != list_nodes.at(i).toElement().attribute("id").toInt()) {
186continue;
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);
205break;
206        }
207if (i == list_nodes.size()) {
208            qDebug() << QString("没有id=%1的学⽣信息").arg(id);
209return;
210        }
211    } else {  //没有⼦节点
212        qDebug() << "没有⼦节点";
213return;
214    }
215 }
View Code

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。