Qt5 对xml文件常用的操作(读写,增删改查)

2023-05-16

微信搜索关注公众号 “郑州行疆户外” 了解软件工程师的业余户外生活

项目配置

pro文件里面添加QT+=xml

include <QtXml>,也可以include <QDomDocument>

项目文件:

.pro 文件

QT       += core xml

QT       -= gui

TARGET = xmltest
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp

主程序:

main.cpp

#include <QCoreApplication>
#include <QtXml> //也可以include <QDomDocument>

//写xml
void WriteXml()
{
    //打开或创建文件
    QFile file("test.xml"); //相对路径、绝对路径、资源路径都可以
    if(!file.open(QFile::WriteOnly|QFile::Truncate)) //可以用QIODevice,Truncate表示清空原来的内容
        return;

    QDomDocument doc;
    //写入xml头部
    QDomProcessingInstruction instruction; //添加处理命令
    instruction=doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
    doc.appendChild(instruction);
    //添加根节点
    QDomElement root=doc.createElement("library");
    doc.appendChild(root);
    //添加第一个子节点及其子元素
    QDomElement book=doc.createElement("book");
    book.setAttribute("id",1); //方式一:创建属性  其中键值对的值可以是各种类型
    QDomAttr time=doc.createAttribute("time"); //方式二:创建属性 值必须是字符串
    time.setValue("2013/6/13");
    book.setAttributeNode(time);
    QDomElement title=doc.createElement("title"); //创建子元素
    QDomText text; //设置括号标签中间的值
    text=doc.createTextNode("C++ primer");
    book.appendChild(title);
    title.appendChild(text);
    QDomElement author=doc.createElement("author"); //创建子元素
    text=doc.createTextNode("Stanley Lippman");
    author.appendChild(text);
    book.appendChild(author);
    root.appendChild(book);

    //添加第二个子节点及其子元素,部分变量只需重新赋值
    book=doc.createElement("book");
    book.setAttribute("id",2);
    time=doc.createAttribute("time");
    time.setValue("2007/5/25");
    book.setAttributeNode(time);
    title=doc.createElement("title");
    text=doc.createTextNode("Thinking in Java");
    book.appendChild(title);
    title.appendChild(text);
    author=doc.createElement("author");
    text=doc.createTextNode("Bruce Eckel");
    author.appendChild(text);
    book.appendChild(author);
    root.appendChild(book);

    //输出到文件
    QTextStream out_stream(&file);
    doc.save(out_stream,4); //缩进4格
    file.close();

}

//读xml
void ReadXml()
{
    //打开或创建文件
    QFile file("test.xml"); //相对路径、绝对路径、资源路径都行
    if(!file.open(QFile::ReadOnly))
        return;

    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        return;
    }
    file.close();

    QDomElement root=doc.documentElement(); //返回根节点
    qDebug()<<root.nodeName();
    QDomNode node=root.firstChild(); //获得第一个子节点
    while(!node.isNull())  //如果节点不空
    {
        if(node.isElement()) //如果节点是元素
        {
            QDomElement e=node.toElement(); //转换为元素,注意元素和节点是两个数据结构,其实差不多
            qDebug()<<e.tagName()<<" "<<e.attribute("id")<<" "<<e.attribute("time"); //打印键值对,tagName和nodeName是一个东西
            QDomNodeList list=e.childNodes();
            for(int i=0;i<list.count();i++) //遍历子元素,count和size都可以用,可用于标签数计数
            {
                QDomNode n=list.at(i);
                if(node.isElement())
                    qDebug()<<n.nodeName()<<":"<<n.toElement().text();
            }
        }
        node=node.nextSibling(); //下一个兄弟节点,nextSiblingElement()是下一个兄弟元素,都差不多
    }

}

//增加xml内容
void AddXml()
{
    //打开文件
    QFile file("test.xml"); //相对路径、绝对路径、资源路径都可以
    if(!file.open(QFile::ReadOnly))
        return;

    //增加一个一级子节点以及元素
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        return;
    }
    file.close();

    QDomElement root=doc.documentElement();
    QDomElement book=doc.createElement("book");
    book.setAttribute("id",3);
    book.setAttribute("time","1813/1/27");
    QDomElement title=doc.createElement("title");
    QDomText text;
    text=doc.createTextNode("Pride and Prejudice");
    title.appendChild(text);
    book.appendChild(title);
    QDomElement author=doc.createElement("author");
    text=doc.createTextNode("Jane Austen");
    author.appendChild(text);
    book.appendChild(author);
    root.appendChild(book);

    if(!file.open(QFile::WriteOnly|QFile::Truncate)) //先读进来,再重写,如果不用truncate就是在后面追加内容,就无效了
        return;
    //输出到文件
    QTextStream out_stream(&file);
    doc.save(out_stream,4); //缩进4格
    file.close();
}

//删减xml内容
void RemoveXml()
{
    //打开文件
    QFile file("test.xml"); //相对路径、绝对路径、资源路径都可以
    if(!file.open(QFile::ReadOnly))
        return;

    //删除一个一级子节点及其元素,外层节点删除内层节点于此相同
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        return;
    }
    file.close();  //一定要记得关掉啊,不然无法完成操作

    QDomElement root=doc.documentElement();
    QDomNodeList list=doc.elementsByTagName("book"); //由标签名定位
    for(int i=0;i<list.count();i++)
    {
        QDomElement e=list.at(i).toElement();
        if(e.attribute("time")=="2007/5/25")  //以属性名定位,类似于hash的方式,warning:这里仅仅删除一个节点,其实可以加个break
            root.removeChild(list.at(i));
    }

    if(!file.open(QFile::WriteOnly|QFile::Truncate))
        return;
    //输出到文件
    QTextStream out_stream(&file);
    doc.save(out_stream,4); //缩进4格
    file.close();
}

//更新xml内容
void UpdateXml()
{
    //打开文件
    QFile file("test.xml"); //相对路径、绝对路径、资源路径都可以
    if(!file.open(QFile::ReadOnly))
        return;

    //更新一个标签项,如果知道xml的结构,直接定位到那个标签上定点更新
    //或者用遍历的方法去匹配tagname或者attribut,value来更新
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        return;
    }
    file.close();

    QDomElement root=doc.documentElement();
    QDomNodeList list=root.elementsByTagName("book");
    QDomNode node=list.at(list.size()-1).firstChild(); //定位到第三个一级子节点的子元素
    QDomNode oldnode=node.firstChild(); //标签之间的内容作为节点的子节点出现,当前是Pride and Projudice
    node.firstChild().setNodeValue("Emma");
    QDomNode newnode=node.firstChild();
    node.replaceChild(newnode,oldnode);

    if(!file.open(QFile::WriteOnly|QFile::Truncate))
        return;
    //输出到文件
    QTextStream out_stream(&file);
    doc.save(out_stream,4); //缩进4格
    file.close();
}

int main(int argc, char *argv[])
{

    qDebug()<<"write xml to file...";
    WriteXml();
    qDebug()<<"read xml to display...";
    ReadXml();
    qDebug()<<"add contents to xml...";
    AddXml();
    qDebug()<<"remove contents from xml...";
    RemoveXml();
    qDebug()<<"update contents to xml...";
    UpdateXml();
    return 0;

}
 

写xml

<?xml version="1.0" encoding="UTF-8"?>
<library>
    <book id="1" time="2013/6/13">
        <title>C++ primer</title>
        <author>Stanley Lippman</author>
    </book>
    <book id="2" time="2007/5/25">
        <title>Thinking in Java</title>
        <author>Bruce Eckel</author>
    </book>
</library>

增加xml

<?xml version='1.0' encoding='UTF-8'?>
<library>
    <book time="2013/6/13" id="1">
        <title>C++ primer</title>
        <author>Stanley Lippman</author>
    </book>
    <book time="2007/5/25" id="2">
        <title>Thinking in Java</title>
        <author>Bruce Eckel</author>
    </book>
    <book time="1813/1/27" id="3">
        <title>Pride and Prejudice</title>
        <author>Jane Austen</author>
    </book>
</library>

删除xml

<?xml version='1.0' encoding='UTF-8'?>
<library>
    <book time="2013/6/13" id="1">
        <title>C++ primer</title>
        <author>Stanley Lippman</author>
    </book>
    <book time="2007/5/25" id="2">
        <title>Thinking in Java</title>
        <author>Bruce Eckel</author>
    </book>
    <book time="1813/1/27" id="3">
        <title>Pride and Prejudice</title>
        <author>Jane Austen</author>
    </book>
</library>
更新xml
<?xml version='1.0' encoding='UTF-8'?>
<library>
    <book id="1" time="2013/6/13">
        <title>C++ primer</title>
        <author>Stanley Lippman</author>
    </book>
    <book id="3" time="1813/1/27">
        <title>Emma</title>
        <author>Jane Austen</author>
    </book>
</library>

如果觉得写得不错,烦请微信搜索公众号 "郑州行疆户外" 了解程序员的户外业余喜好,鼓励一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt5 对xml文件常用的操作(读写,增删改查) 的相关文章

  • server,gtk,tslib

    一 首先先说下framebuffer xserver tslib gtk和桌面这五者之间的联系 xff0c 1 framebuffer 即linux系统的一块内存区域 xff0c 往这块区域写东西屏幕就会有所显示 对应的设备文件是dev f
  • 修改启动logo,禁止光标

    linux内核下使用的图片文件类型是pnm和PPm格式的 xff0c 所以在开始介绍修改linux内核启动LOGO之前 xff0c 1 先需要介绍一下怎么样设计自己开始logo的ppm图片 xff0c 首先选择一张png格式的图片 xff0
  • 移植gtk,这个配置有点早,可以了解一下他的工作流程

    最近一直GTK xff0c 感觉好晕 整整耗了我近三天才勉强在网络资料和他人帮助情况下完成 所以记录一下 xff0c 不然我记性太差 xff0c 很可能下班之前就忘了 xff01 以后也好有个参考 首先注意一个问题 xff1a GTK在编译
  • error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]

    这个错误多为编写linux驱动程序时出现的错误 xff0c 正常情况下是以警告出现的 xff0c 一般有两种情况 xff1a 1 在函数体内 xff0c 定义变量代码前边出现非定义的变量 此变量在其他地方已经定义了 xff0c 编译时就会出
  • 用户空间的虚拟地址如何转换得到实际的物理地址

    思路 xff1a 进程号是一个进程在用户空间的唯一标示 xff0c 所以 xff0c 根据pid可以从内核中得到一个进程的所有信息 xff0c 另外就是知道虚拟地址就可以通过内核物理地址映射到虚拟地址的逆运算就可以还原他的实际物理地址 以上
  • ubuntu系统下的minicom串口/usb转串口配置

    1 安装minicom串口软件 sudo apt get install minicom 2 配置串口 minicom默认配置是tty8 如果你直接使用的就是串口 xff0c 那么安装好之后就可以直接使用了 如果你是用usb转串口 xff0
  • Install ncurses (ncurses-devel) and try again.

    主要就是终端图形配置时最容易出现的问题 xff0c 比如最常见的make menuconfig xff0c 解决方法 xff1a sudo apt get install ncurses devel 屏幕弹出 xff1a 找不到这个软件 x
  • ioremap/mmap的几个测试结论

    环境 xff1a pc机 xff0c ubuntu 14 04 64位 xff0c 物理机 arm板 omap3530 xff0c 1G内存 xff0c 内核linux 2 6 32 1 mmap在pc机上测试映射大小 xff0c 可以将文
  • Freertos的钩子函数

    何谓钩子函数 xff1f 大多数操作系统 xff0c 如 xff1a windows linux ucos freertos 其实都有钩子函数 xff0c 能干什么呢 xff1f 其实就是操作系统留给开发者的一个回调函数 xff0c 具体有
  • fopen :invalid argument错误

    今天使用文件操作函数 xff1a fopen fread fwrite fclose时 xff0c 编译正常通过了 xff0c 但是运行时就爆出了invalid argument错误 FILE fp 61 fopen 34 a txt 34
  • jiffies:内核中的时间观念

    jiffies在内核中是一个全局变量 xff0c 声明包含在 include lt linux jiffies h gt 中 xff0c 几个内核中常用的的概念 xff1a 1 HZ 内核常量 ARM架构HZ 61 100 X86架构HZ
  • git 学习之一

    注 xff1a 这篇博文是本人在学习git软件时 xff0c 自己整理出来的 xff0c 对于git软件的知识点层次分明 xff0c 举例实用 xff0c 最主要的是自己的亲身学习经历 xff0c 还可以作为工具手册 xff0c 哪一点不清
  • git 学习之二

    1 git创建版本库 创建一个版本库非常简单 xff0c 首先 xff0c 选择一个合适的地方 xff0c 创建一个空目录 xff1a mkdir learngit cd learngit pwd Users michael learngi
  • linux环境的sd卡格式化,分区

    环境 xff1a ubuntu xff0c 大sd卡 我们买过来的sd卡 xff0c 插到电脑上 xff0c 安装好sd卡的驱动之后 xff0c 就会在我的电脑里面开到可移动磁盘 xff0c 实际上我们看到的这个可移动磁盘可用空间就是sd卡
  • 详解:tslib移植arm全过程

    环境 xff1a Ubuntu xff0c 交叉编译器 xff0c tslib 1 4 移植步骤 xff1a 第一步 xff1a 获取tslib的源码 使用git获取tslib源码 xff1a git clone https github
  • 根文件系统的制作,busybox编译以及中间遇到的问题

    软件环境 xff1a Ubuntu 14 10 busybox 1 10 编译配置 xff1a ARCH 61 arm CROSS COMPILE 61 arm linux make defconfig 或者 make menuconfig
  • selected device is not a touchscreen I understand

    具体tslib的移植在上一篇博客中已经做了详细的说明 xff1a http blog csdn net hpu11 article details 53105947 最近两天一直在做tslib移植触摸屏校准问题 xff0c 在经过tslib
  • error while loading shared libraries : libts-0.0.so.0:cannot open shared object file: No such file o

    这是我在运行自己写的qt程序时 xff0c 爆出的错误 xff0c 从错误的地方来看 xff0c 是我们的库中缺少一个libts 0 0 so 0的动态库 xff0c 如果开发经验比较丰富的人都会知道这个库是tslib的一个库 xff0c
  • ldd 查看可执行文件所依赖的库有哪些

    ldd是linux下的一个脚本命令 xff0c 我们可以通过各种途径去查找它 xff0c 作用 xff1a 打印可执行文件依赖的库 举个实用的例子 xff1a ehome是我自己写的一个只能家具的程序 xff0c 然后经过交叉编译得到的一个
  • FreeRTOS源码下载及源码文件夹介绍

    FreeRTOS源码下载及源码文件夹介绍 1 FreeRTOS源码下载 去官网或其他途径找到下载程序 xff0c 在这里 xff0c 我直接使用了正点原子提供的下载程序 xff1a 双击上图程序后 xff0c 选择存放路径 xff0c 下载

随机推荐

  • Linux如何手动挂载/卸载u盘

    1 首先你得保证你的U盘的格式是fat格式 先进入 mnt 目录新建一个usb目录 cd mnt mkidr usb 2 先fdisk l xff0c 然后插上U盘 xff0c fdisk l 查看是否有新的硬盘添加上来了 xff1f 最好
  • 写一个简单脚本文件判断文件的存在性

    实现代码一 1 2 3 4 5 6 7 8 9 10 1
  • 触摸屏与usb鼠标同时支持

    最近 xff0c 做系统移植 xff0c 根文件系统自己做的 xff0c 移植好tslib xff0c 也可以触摸屏校准 xff0c 触摸屏也可以正常使用 xff0c 但是插上usb鼠标时 xff0c 系统能枚举出usb的信息 xff0c
  • 内核裁剪和部分选项的意义

    嵌入式驱动开发 xff0c 内核开发 xff0c 都避免不了的和Linux打交道 xff0c 尤其是做系统移植 xff0c 在编译内核的时候 xff0c 我们都需要把没用的内核模块给删除掉 xff0c 以减少内核的文件大小 xff0c 这当
  • printk打印级别输出

    内核的打印函数和用户空间的打印函数是相同的 xff0c 只是关键字不太一样 xff0c 内核是printk xff0c 而用户空间则是printf 在内核空间只不过有一个打印级别的设置 xff0c 所谓的打印级别不过是几个宏定义 print
  • 结构体,联合的位域定义方法,以及结构体大小的计算

    结构体有一种定义方式叫做位域定义方式 xff0c 如下 struct ctl register int a 16 char c 4 这种定义方法 xff0c 一般常用在嵌入式开发的内核层的代码中经常出现 int a 16 代表a只占int的
  • c语言中__attribute__的意义

    微信搜索关注公众号 郑州行疆户外 了解软件工程师的业余户外生活 我们在进行定义数据结构计算数据结构大小的时候 xff0c 或者进行网络通讯的socket发送数据的时候 xff0c 都会遇到一个共同的问题 xff1a 数据对齐问题 这个问题是
  • linux播放音乐,录音命令-----arecord,aplay

    微信搜索关注公众号 郑州行疆户外 了解软件工程师的业余户外生活 用了这么长时间的Linux系统 xff0c 是不是还没有用Linux听过音乐 xff0c 一般使用Linux系统的人都是纯属办公需要或者自己对软件开发玩的 xff0c 很少是做
  • Unix或Linux中&、jobs、fg、bg等命令的使用方法

    fg bg jobs amp ctrl 43 z都是跟系统任务有关的 xff0c 虽然现在基本上不怎么需要用到这些命令 xff0c 但学会了也是很实用的 一 amp 最经常被用到 这个用在一个命令的最后 xff0c 可以把这个命令放到后台执
  • linux tftp服务器搭建与测试

    1 安装tftp服务器 sudo apt get install tftp hpa tftpd hpa tftp hpa是客户端 tftpd hpa是服务器端 2 配置tftp服务器 sudo vim etc default tftpd h
  • FreeRTOS基础知识

    FreeRTOS任务特性 xff1a 简单 xff1b 没有使用限制 xff1b 支持抢占 xff1b 支持优先级 xff1b 每个任务都有堆栈 xff0c 但也导致了RAM使用量增大 xff1b 如果使用强化在哪的话必须仔细考虑重入的问题
  • makeinfo 安装

    环境 ubuntu sudo apt get install texinfo 就OK 今天在打包的时候有个包需要 makeinfo 当时就各种搜结果就没有 makeinfo 这个软件包 xff0c 最后看到有人说其实就是 texinfo 这
  • 通过MCU实现Altera FPGA在线升级

    一 xff0e 问题背景 在实际工程应用中 xff0c 我们时常会遇到为解决某个老产品的BUG xff0c 需要在工程现场更新设备的FPGA代码 xff0c 或者参加电信测试时需要现场升级设备FPGA程序以便于调试 公司现阶段所用的Alte
  • ubuntu linux zip和unzip类命令详解

    微信搜索关注公众号 郑州行疆户外 了解软件工程师的业余户外生活 1 zip zip r myfile zip 将当前目录下的所有文件和文件夹全部压缩成myfile zip文件 xff0d r表示递归压缩子目录下所有文件 2 unzip un
  • ubuntu运行sh脚本sudo自动输入密码

    微信搜索关注公众号 郑州行疆户外 了解软件工程师的业余户外生活 示例 xff1a sudo apt get update 第一种方法 xff1a 使用管道 xff08 上一个命令的 stdout 接到下一个命令的 stdin xff09 b
  • 基本命令+环境变量+正则表达式 --- shell脚本编程教程之一

    vim 单纯的使用vi查看文件 shell 编程常见的命令 xff1a alias 别名 给一长命令起别名 例如 xff1a alias myssh 61 34 ssh root 64 192 168 1 158 34 myssh 相当于
  • 基本的shell编程格式+简单的脚本实例 --- shell脚本编程教程之二

    温习shell编程基础的要点 xff1a 正则表达式的要点 xff1a 39 39 a 39 39 a 61 61 a aa aaa 39 43 39 grep E 39 a 43 39 61 61 grep 39 a 43 39 39 3
  • shell if条件分支编程 --- shell脚本编程教程之三

    数学运算 xff1a vim math sh a 61 1 b 61 2 c 61 a 43 2 或者 c 61 a 43 b echo c 条件判断 xff1a 格式1 if 条件 then 条件为真执行的任务 fi 格式2 fi 条件
  • VIM 常用快捷键

    转载 xff1a https www cnblogs com markleaf p 7808817 html 一 移动光标 h j k l 上 xff0c 下 xff0c 左 xff0c 右 ctrl e 移动页面 ctrl f 上翻一页
  • Qt5 对xml文件常用的操作(读写,增删改查)

    微信搜索关注公众号 郑州行疆户外 了解软件工程师的业余户外生活 项目配置 pro文件里面添加QT 43 61 xml include lt QtXml gt xff0c 也可以include lt QDomDocument gt 项目文件