1  简介

参考视频:https://www.bilibili.com/video/BV1XW411x7AB?p=12

xml简介:可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。

XML 标签没有被预定义,需要自行定义标签。XML 的设计宗旨是传输数据,而不是显示数据。XML 是独立于软件和硬件的信息传输工具。

2  xml文件格式

头部:xml文件的声明,说明xml版本和编码格式;

标签:标签需要成对出现。从(且包括)开始标签直到(且包括)结束标签的部分叫做XML 元素。

属性组:提供有关元素的额外信息,必须加引号。

xml文档形成的是一种树型结构。

3  测试及说明

下面简单介绍使用Qt创建一个xml文件,并对其进行简单的写入、读取操作。

先给出实现的效果,通过代码创建一个如下格式的xml文件,并通过id来查找到相应的节点信息。

 <?xml version='1.0' encoding='utf-8'?>
<root>
<id id="1">
<name>xiaoming</name>
<gender>male</gender>
<age>19</age>
<subject>Chinese</subject>
<score>78</score>
</id>
<id id="2">
<name>xiaohong</name>
<gender>famale</gender>
<age>18</age>
<subject>Math</subject>
<score>88</score>
</id>
</root>

代码中的注释已经很详细了,就不再说说明步骤了,直接给出代码。

widget.h文件代码:

 #ifndef WIDGET_H
#define WIDGET_H #include <QWidget>
#include <QDomDocument> namespace Ui {
class Widget;
} class Widget : public QWidget
{
Q_OBJECT public:
explicit Widget(QWidget *parent = );
~Widget(); //创建xml空文件
void create_xml(QString file_path);
//追加xml文件
void append_xml(QString file_path, int id, QStringList list);
//写xml文件
void write_xml(QDomDocument &doc, QDomElement &root, int id, QStringList &list);
//读xml文件
void read_xml(QString file_path, int id, QStringList &list); private:
Ui::Widget *ui;
}; #endif // WIDGET_H

widget.c文件代码:

 #include "widget.h"
#include "ui_widget.h"
#include <QDomComment>
#include <QFile>
#include <QDebug> Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this); QString file_path = "../demo.xml"; create_xml(file_path); QStringList list;
//姓名 性别 年龄 学课 分数
list << "xiaoming" << "male" << "" << "Chinese" << "";
append_xml(file_path, , list);
list.clear();
list << "xiaohong" << "famale" << "" << "Math" << "";
append_xml(file_path, , list);
list.clear();
read_xml(file_path, , list);
qDebug() << list;
} Widget::~Widget()
{
delete ui;
} /*
* 创建xml文件,空文件,仅包含头部信息和根元素节点
* 参数file_path:文件存放路径
*/
void Widget::create_xml(QString file_path)
{
QFile file(file_path); //关联文件名字
if (true == file.exists()) { //如果存在不创建
qDebug() << "文件已经存在";
return;
}
//只写方式打开文件
bool isOK = file.open(QIODevice::WriteOnly);
if (false == isOK) {
qDebug() << "writeOnly error";
return;
}
//创建xml文档对象
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("root");
doc.appendChild(root);
//保存
QTextStream stream(&file); //文本流关联文件
doc.save(stream, ); //4 缩进字符 //关闭文件
file.close();
} /*
* 向xml文件中追加元素
* 参数file_path:文件存放路径
* 参数id:<id>元素节点的属性
* 参数list:<id>节点元素的子节点元素值
*/
void Widget::append_xml(QString file_path, int id, QStringList list)
{
QFile file(file_path); //关联文件名字
//只读方式打开文件
bool isOK = file.open(QIODevice::ReadOnly);
if (false == isOK) {
qDebug() << "ReadOnly error";
return;
}
//文件file和xml关联
QDomDocument doc;
isOK = doc.setContent(&file);
if (false == isOK) {
qDebug() << "setContent error";
}
//关联成功后,可以关闭文件
file.close();
//获取根节点元素
QDomElement root = doc.documentElement();
//判断根节点下有没有子节点
if (root.hasChildNodes()) { //如果有子节点
//查找最后一个子节点
QDomElement last_elem = doc.lastChildElement();
write_xml(doc, last_elem, id, list);
} else { //没有子节点
//写有效数据
write_xml(doc, root, id, list);
}
//保存文件
isOK = file.open(QIODevice::WriteOnly);
if (false == isOK) {
qDebug() << "writeOnly error";
return;
}
QTextStream stream(&file);
doc.save(stream, );
file.close();
} /*
* 给<root>根节点元素添加子节点元素
* 参数doc:xml文件
* 参数root:<root>节点元素
* 参数id:<id>节点元素属性值
* 参数list:<id>节点元素的子节点元素值
*/
void Widget::write_xml(QDomDocument &doc, QDomElement &root, int id, QStringList &list)
{
//添加<id>节点元素
QDomElement elem_id = doc.createElement("id");
QDomAttr attr_id = doc.createAttribute("id");
QString attr_str = QString::number(id);
attr_id.setNodeValue(attr_str);
elem_id.setAttributeNode(attr_id);
root.appendChild(elem_id); //创建<姓名><性别><年龄><学课><分数>节点元素
QDomText text;
QDomElement name_elem = doc.createElement("name");
text = doc.createTextNode(list.at());
name_elem.appendChild(text);
QDomElement gender_elem = doc.createElement("gender");
text = doc.createTextNode(list.at());
gender_elem.appendChild(text);
QDomElement age_elem = doc.createElement("age");
text = doc.createTextNode(list.at());
age_elem.appendChild(text);
QDomElement subject_elem = doc.createElement("subject");
text = doc.createTextNode(list.at());
subject_elem.appendChild(text);
QDomElement score_elem = doc.createElement("score");
text = doc.createTextNode(list.at());
score_elem.appendChild(text);
//追加到<id>节点后面
elem_id.appendChild(name_elem);
elem_id.appendChild(gender_elem);
elem_id.appendChild(age_elem);
elem_id.appendChild(subject_elem);
elem_id.appendChild(score_elem);
} /*
* 通过id查找信息
* 参数file_path:xml文件路径
* 参数id:查找的id
* 参数list:存放查找到的信息
*/
void Widget::read_xml(QString file_path, int id, QStringList &list)
{
QFile file(file_path); //关联文件名字
//只读方式打开文件
bool isOK = file.open(QIODevice::ReadOnly);
if (false == isOK) {
qDebug() << "ReadOnly error";
return;
}
//文件file和xml关联
QDomDocument doc;
isOK = doc.setContent(&file);
if (false == isOK) {
qDebug() << "setContent error";
}
//关联成功后,可以关闭文件
file.close();
//获取根节点
QDomElement root = doc.documentElement();
if (root.hasChildNodes()) { //有没有子节点
QDomNodeList list_nodes = root.childNodes();
int i;
for (i = ; i < list_nodes.size(); i++) {
if (id != list_nodes.at(i).toElement().attribute("id").toInt()) {
continue;
}
//转换为元素,找到<id>节点下的所有子节点
QDomNodeList sublist = list_nodes.at(i).toElement().childNodes();
//name
QString name = sublist.at().toElement().text();
list.append(name);
//gender
QString gender = sublist.at().toElement().text();
list.append(gender);
//age
QString age = sublist.at().toElement().text();
list.append(age);
//subject
QString subject = sublist.at().toElement().text();
list.append(subject);
//score
QString score = sublist.at().toElement().text();
list.append(score);
break;
}
if (i == list_nodes.size()) {
qDebug() << QString("没有id=%1的学生信息").arg(id);
return;
}
} else { //没有子节点
qDebug() << "没有子节点";
return;
}
}

Qt-操作xml文件的更多相关文章

  1. Qt操作xml文件(增删改功能)

    这个例子是在根据网上博客<Qt数据库(XML)>改写的一个操作XML的实现. 借鉴了很多里面的代码,大家可以结合上面的博客对照,相信你肯定会对XML的操作熟练起来. 我建立的是Qwidge ...

  2. Qt之QDomDocument操作xml文件-模拟ini文件存储

    一.背景 不得不说Qt是一个很强大的类库,不管是做项目还是做产品,Qt自身封装的东西就已经非常全面了,我们今天的这篇文章就是模拟了Qt读写ini文件的一个操作,当然是由于一些外力原因,我们决定自己来完 ...

  3. QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写   ...

  4. Asp.Net 操作XML文件的增删改查 利用GridView

    不废话,直接上如何利用Asp.NET操作XML文件,并对其属性进行修改,刚开始的时候,是打算使用JS来控制生成XML文件的,但是最后却是无法创建文件,读取文件则没有使用了 index.aspx 文件 ...

  5. Java操作XML文件 dom4j 篇

    在项目中,我们很多都用到了xml文件,无论是参数配置还是与其它系统的数据交互.今天就来讲一下Java 中使用dom4j来操作XML文件. 我们需要引入的包: //文件包 import java.io. ...

  6. PHP操作XML文件学习笔记

    原文:PHP操作XML文件学习笔记 XML文件属于标签语言,可以通过自定义标签存储数据,其主要作用也是作为存储数据. 对于XML的操作包括遍历,生成,修改,删除等其他类似的操作.PHP对于XML的操作 ...

  7. JAVA中通过Jaxp操作XML文件基础

    Java中有多种方式操作XML文件,目前讲一讲以SUN公司提供的DocumentBuilderFactory工厂类对象操作XML. 使用XML基本操作就是需要CRUD(增删改查),那么首先通过一个查询 ...

  8. WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)

    WebAPI调用笔记   前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...

  9. C#操作xml文件:使用XmlDocument 实现读取和写入

    XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖于内 ...

  10. 利用XmlDocument操作XML文件

    利用XmlDocument可以方便的操作XML文件. .操作XML文件基本方法 ()添加对System.Xml的引用,并使用using语句添加引用: ()假设要读取的XML文件如下: <?xml ...

随机推荐

  1. 简单的Linq查询语句

    下面我来我大家介绍几种简单的查询方式. 1.简单语法 这个LINQ语句的第一个关键字是from,from后面加的是范围变量,范围变量后加in,后加上事先实例化的模型,然后点出数据的来源. List是列 ...

  2. (1)RabbitMQ简介与安装

    1.RabbitMQ简介 因为RabbitMQ是基于开源的AMQP协议来实现的,所以在了解MQ时候,首先我们来了解下AMQP协议.AMQP,即Advanced Message Queuing Prot ...

  3. Write a program to copy its input to its output, replacing each string of one or more blanks by a single blank.

    #include <stdio.h> void main() { int c,c_BCN; while((c=getchar())!=EOF) { if(c!=' ') c_BCN=; i ...

  4. YOLO-V3实战(darknet)

    一. 准备工作 1)实验环境: darknet 是由 C 和 CUDA 开发的,不需要配置其他深度学习的框架(如,tensorflow.caffe 等),支持 CPU 和 GPU 运算,而且安装过程非 ...

  5. String类、static关键字、Arrays类、 Math类的一些学习心得

    String类 java.lang.String 类代表字符串.Java程序中所有的字符串文字(例如"abc" )都可以被看作是实现此类的实例. 类 String 中包括用于检查各 ...

  6. 前端工程化的的理解,浅谈web工程化的开发流程

    1. 什么是前端工程化 自有前端工程师这个称谓以来,前端的发展可谓是日新月异.相比较已经非常成熟的其他领域,前端虽是后起之秀,但其野蛮生长是其他领域不能比的.虽然前端技术飞快发展,但是前端整体的工程生 ...

  7. 工作那么久,才知道的 SOLID 设计原则

    认识 SOLID 原则 无论是软件系统设计,还是代码实现,遵循有效和明确的设计原则,都利于系统软件灵活可靠,安全快速的落地,更重要的是能灵活地应对需求,简化系统扩展和维护,避免无效的加班.本文主要讨论 ...

  8. DOM 和 BOM 区别

    DOM, DOCUMENT, BOM, WINDOW 区别DOM 是为了操作文档出现的 API,document 是其的一个对象:BOM 是为了操作浏览器出现的 API,window 是其的一个对象. ...

  9. 服务器创建tensorflow环境,nni自动调参记录

    一.anaconda安装记录 1.1 下载安装脚本:wget https://repo.anaconda.com/archive/Anaconda3-5.2.0-Linux-x86_64.sh 1.2 ...

  10. Unity-ECS(一)浅谈CPU缓存命中和Unity面向数据技术栈(DOTS)--笔记

    一,缓存类型 概念:局部性. 时间局部性:当前用到的一个存储器位置,不久的将来会被用到. 空间局部性:当前用到的一个存储器位置,附近的位置会被用到. 那么在CPU的层面,这两个局部性的特性就会被Cac ...