Qt 对 XML 的读写操作
1、简介
使用XML模块,在.pro文件中添加 QT += xml ,并加如相应的头文件
#include <QtXml>
#include <QDomDocument> 或者 #include <QXmlStreamReader>
QtXml模块提供了一个读写XML文件的流,解析方法包含DOM和SAX。
(1)DOM(Document ObjectModel):将XML文件表示成一棵树,便于随机访问其中的节点,但消耗内存相对多一些。
(2)SAX(Simple APIfor XML):一种事件驱动的XML API,接近于底层,速度较快,但不便于随机访问任意节点。
1、常用方法
1、创建节点
QDomElement element = doc.createElements();
2、设置节点的值
QDomText text = doc.createTextNode("aaa");
element.appendChild(text);
3、创建并添加属性
QDomAttr attr = doc.createAttribute("attrName");
attr.setValue("value");
element.setAttributeNode(attr);
4、获取第一个子节点
QDomNode node = element.firstChild();
5、获取下一个节点
QDomNode nextNode = node.nextSibling();
2、示例
2.1、写文件
// 写 XML 文件 void wirteXml() { // 文件路径 QString fileName = "test.xml"; QFile file(fileName); if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { return; } QTextStream out(&file); QDomDocment doc; // 文件头 QDomProcessingInstruction instruction = doc.createProcessingInstruction("xml", "version = \'1.0\' encoding = \'UTF-8\'") doc.appendChild(instruction); // 添加一级节点 (学生集合) QDomElement studentsElement = doc.createElement("Students"); // 添加学生集合的属性 QDomAttr attr = doc.createAttribute("bool"); attr.setValue("true"); doc.setAttributeNode(attr); doc.appendChild(ScenariosElement); // 添加学生1 QDomElement studentElement1 = doc.createElement("Student"); StudentsElement.appendChild(studentElement1); // 添加学生1的信息 QDomElement id1 = doc.createElement("id"); // 学生编号 QDomText idText1 = doc.createTextNode("1"); // 学生编号内容 id1.appendChile(idText1); StudentElement1.appendChild(id1); QDomElement name1 = doc.createElement("name"); // 学生名称 QDomText nameText1 = doc.createTextNode("小明"); // 学生编号内容 name1.appendChile(nameText1); StudentElement1.appendChild(name1); // 添加学生2 QDomElement studentElement2 = doc.createElement("Student"); StudentsElement.appendChild(studentElement2); // 添加学生2的信息 QDomElement id2 = doc.createElement("id"); // 学生编号 QDomText idText2 = doc.createTextNode("2"); // 学生编号内容 id2.appendChile(idText2); StudentElement2.appendChild(id2); QDomElement name2 = doc.createElement("name"); // 学生名称 QDomText nameText2 = doc.createTextNode("小红"); // 学生编号内容 name2.appendChile(nameText2); StudentElement2.appendChild(name2); // 每下一级,前面多两个空格 doc.save(out, 2) }
会生成以下 xml 文件:
<?xml version = '1.0' encoding = 'UTF-8'?> <Studnets> <Student> <id>1</id> <name>小明</name> </Student> <Student> <id>2</id> <name>小红</name> </Student> </Students>
2.2、读文件
// 定义学生结构体 struct Student { QString id; // 学生编号 QString name; // 学生名称 }
读文件:
// 读 XML 文件 std::vector<Student> readXml() { // 学生集合 (返回值) std::vector<Student> students; // 创建 QDomDocument 对象 QDomDocment doc; // 指定读取的 xml 文件路径 QFile file("test.xml"); // xml 文件以只读的方式打开 if(!file.open(QIODevice::ReadOnly)) { return students; } if(!doc.setContent(&file)) { file.close(); return students; } file.close(); // 获取 doc 中的 QDomElement 对象 (学生集合) QDomElement studentsElement = doc.documentElement(); // 获取二级节点(学生节点) QDomNode studentNode = studentsElement.firstChild(); // 循环学生节点 while (!studentNode .isNull()) { Student student; // 学生 QDomElement studentElement = studentNode.toElement(); QDomNode idNode = studentElement.firstChild(); // 获取第一个子节点(编号) student.id = idNode.toElement().text(); QDomNode nameNode = idNode.nextSibling(); // 获取编号的下一个节点(名称) student.name = nameNode.toElement().text(); students.push_back(student); studentNode = studentElement.nextSibling(); // 循环获取下一个学生 } return studnets }
转载:https://blog.csdn.net/louxiaofei_java/article/details/127744483