Qt读写XML文件的方法详解(含源码+注释)

目录
  • 一、示例XML文件内容
  • 二、XML文件的写入
  • 三、XML文件的读取
    • 3.1 文件读取源码
    • 3.2 读取结果示例
  • 总结
  • 相关文章

一、示例XML文件内容

下方为本文所使用的xml文件的内容

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <childNode1 attruKey="attriVal">childNode1 Val</childNode1>
    <childNode2 attruKey="attriVal">
        <cChildNode1 shuxing1="1">cChildNode1 Val</cChildNode1>
        <cChildNode2 shuxing2="2">cChildNode2 Val</cChildNode2>
    </childNode2>
</root>

二、XML文件的写入

下方为XML文件写入的源码,其中代码内容按顺序如下:

  • QDomDocument对象的创建和xml文件头的添加
  • 创建根节点
  • 创建包含属性和节点值的子节点
  • 创建较为复杂的子节点(包含属性和第三级节点)
  • 写入文件
        //创建QDomDocument对象
    QDomDocument xDoc;
    QDomProcessingInstruction inStruction;
    //写入xml文件头(xml版本信息和编码信息)
    inStruction = xDoc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
    xDoc.appendChild(inStruction);

    //创建根节点并将其添加到xDoc中
    QDomElement root = xDoc.createElement("root");
    xDoc.appendChild(root);

    //创建子节点1
    QDomElement childNode1 = xDoc.createElement("childNode1");
    //为子节点childNode1设置属性及属性值
    childNode1.setAttribute("attruKey", "attriVal");
    //! 为子节点childNode1添加节点值
    //! 创建QDomText对象并设置其值
    QDomText nodeVal = xDoc.createTextNode("childNode1 Val");
    //使用QDomElement对象的节点,添加节点值需添加QDomText对象,否则有可能不显示该值
    childNode1.appendChild(nodeVal);
    //将子节点1添加到根节点中
    root.appendChild(childNode1);

    //! 创建一个多级节点childNode2

    //创建多级节点2
    QDomElement childNode2 = xDoc.createElement("childNode2");
    //为多级节点childNode2设置属性及属性值
    childNode2.setAttribute("attruKey", "attriVal");
    //创建多级节点的子节点1
    QDomElement cChildNode1 = xDoc.createElement("cChildNode1");
    //设置cChildNode1的属性和值
    cChildNode1.setAttribute("shuxing1", 1);
    //设置cChildNode1的节点值
    cChildNode1.appendChild(xDoc.createTextNode("cChildNode1 Val"));
    //将cChildNode1节点添加到多级节点中
    childNode2.appendChild(cChildNode1);

    //创建多级节点的子节点2
    QDomElement cChildNode2 = xDoc.createElement("cChildNode2");
    //设置cChildNode2的属性和值
    cChildNode2.setAttribute("shuxing2", 2);
    //设置cChildNode2的节点值
    cChildNode2.appendChild(xDoc.createTextNode("cChildNode2 Val"));
    //将cChildNode2节点添加到多级节点中
    childNode2.appendChild(cChildNode2);

    //将多级节点childNode2添加到根节点中
    root.appendChild(childNode2);

    //指定xml文件路径
    QFile file("./xmlTest.xml");
    //以只读方式打开,并且会清空文件内容
    if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
        return 0;
    //使用文本流写入文件
    QTextStream outputStream(&file);
    xDoc.save(outputStream, 4); //缩进四格
    file.close();

三、XML文件的读取

3.1 文件读取源码

下方为XML文件读取的源码,其中代码内容按顺序如下:

  • 创建QDomDocument对象并打开文件添加其数据源
  • 获取根节点
  • 读取较为简单的子节点(仅一个属性和节点值)
  • 读取较为复杂的子节点(包含属性和不同的)
//创建QDomDocument对象
    QDomDocument xDoc;
    //指定读取的xml文件路径
    QFile file("./xmlTest.xml");
    //xml文件以只读方式打卡
    if (!file.open(QIODevice::ReadOnly))
        return 0;
    //调用setContent函数设置数据源
    if (!xDoc.setContent(&file)) {
        file.close();
        return 0;
    }
    file.close();

    //获取xDoc中的QDomElement对象
    QDomElement docElem = xDoc.documentElement();
    //获取docElem的根节点
    QDomNode node = docElem.firstChild();

    //!获取第一个子节点,并读取其属性及其值
    QDomElement  childNode1 = node.toElement();
    //获取childNode1的属性值
    QString attri1 = childNode1.attribute("attruKey");
    //获取childNode1的节点值(既然设置节点值需要插入子节点,那么读取也应读取其子节点)
    QDomNode node1Child = childNode1.firstChild();
    QString node1Val = node1Child.nodeValue();

    //输出属性值和节点值
    qDebug() << "第一个子节点的属性值和节点值";
    qDebug() << attri1 << node1Val;

    //将节点移至下一节点的位置
    node = node.nextSibling();

    //! 获取第二个节点,并使用循环获取其中的各值
    QDomElement  childNode2 = node.toElement();
    qDebug() << "第二节点的读取";
    //获取childNode1的属性值
    QString attri2 = childNode2.attribute("attruKey");
    qDebug() << "第二节点的属性值:" << attri2;

    //获取第二节点中的第一子节点
    QDomNode cChildNode = childNode2.firstChild();
    while(!cChildNode.isNull()) {
        //获取当前子节点的对象
        QDomElement e = cChildNode.toElement();
        if(!e.isNull()) {
            qDebug() << e.firstChild().nodeValue(); // the node really is an element.
        }
        //获取下一节点元素
        cChildNode = cChildNode.nextSibling();
    }

3.2 读取结果示例

下方为XML文件读取输出示例

总结

XML文件使用QDomDocument对象写入和读取时需要注意如下事项,在写入时需要添加QDomText对象设置值;而在读取时需要读取其首个子节点,并获取其中的值。(越复杂的文件结构,需要更复杂的代码去读和写)

到此这篇关于Qt读写XML文件(含源码+注释)的文章就介绍到这了,更多相关Qt读写XML文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

相关文章

  • Qt写入Json文件(含源码+注释)
  • Qt读Json文件(含源码+注释)
  • Qt读写ini文件(含源码+注释)
(0)

相关推荐

  • C++、Qt分别读写xml文件的方法实例

    目录 XML语法 C++使用tinyxml读写xml Qt读写xml 总结 XML语法 第一行是XML文档声明,<>内的代表是元素,基本语法如以下所示.C++常见的是使用tiny库读写,Qt使用自带的库读写: <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <根元素> <元素 属性名="属性值" 属性名="属性

  • 自动发帖机的斗争过程防止垃圾评论的几个方法总结

    自网站开放之日起,这个垃圾信息就没有消停过,而且这个垃圾发帖的时间都有一定的规律,一般是从上午9点.10点的时候开始,到下午下班前这段时间,是发帖机发动的时候,看的出来,发帖机的操作者也是一个正常上班的"好同志". 从发帖机发布的信息来看,操作者也刻意优化了下信息内容,以免信息过于垃圾,直接导致发帖被屏蔽而失败:有时候,我看着这些内容,还真为这些操作者们拍案叫绝,因为连我差点都被这些机器发的帖子给迷惑住了.但是,从连续的几个帖子发布的时间间隔来看,有的竟然是同一秒钟发布出来的!只要你真

  • Qt使用流处理XML文件的示例代码

    本章开始我们将了解到如何使用 Qt 处理 XML 格式的文档. XML(eXtensible Markup Language)是一种通用的文本格式,被广泛运用于数据交换和数据存储(虽然近年来 JSON 盛行,大有取代 XML 的趋势,但是对于一些已有系统和架构,比如 WebService,由于历史原因,仍旧会继续使用 XML).XML 由 World Wide Web Consortium(W3C)发布,作为 SHML(Standard Generalized Markup Language)的

  • Qt利用DOM类实现读取xml文件

    目录 一.项目介绍 二.项目基本配置 三.UI界面设计 四.主程序实现 4.1 node.xml 4.2 pro文件 4.3 main.cpp 五.效果演示 一.项目介绍 利用DOM相关类读取xml文件. Dom(Document Object Model,即文档对象模型)把XML文档转换成应用程序可以遍历的树形结构,这样便可以随机访问其中的节点.它的缺点是需要将整个XML文档读入内存,消耗内存较多. 在Qt中使用QDomProcessingInstruction类来表示XML说明,元素对应QD

  • Qt读写ini文件的方法详解(含源码+注释)

    目录 一.示例Ini文件内容 二.Ini文件的写入 三.Ini文件的读取 3.1 第一种读取方式 3.2 第二种读取方式 3.3 读取结果示例 补充:获取所有节点和key以及节点的遍历 相关文章 总结 一.示例Ini文件内容 下方为本文所使用的ini文件的内容 [group1] key1=val1 key2=val2 sameKay=sameVal [group2] jian1=zhi1 jian2=zhi2 sameKay=sameZhi 二.Ini文件的写入 ini文件不需要像xml和jso

  • Qt写入Json文件的方法详解(含源码+注释)

    目录 一.示例Json文件内容 二.Json写入会使用的类(介绍写入所使用的类在本文中的作用,个人理解) 三.Json文件的写入 3.1 常规类型的写入 3.2 对象及数组类型的添加 3.3 Json串写入文件 总结 一.示例Json文件内容 下方为本文所使用的Json文件的内容,其中包含字符串.数值.布尔.null.对象.数组等(写入方式在本文第三节) { "array": [ "str", 88, null ], "bool": true,

  • android编程之XML文件解析方法详解(附源码)

    本文实例讲述了android编程之XML文件解析方法.分享给大家供大家参考,具体如下: 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX.Pull.Dom解析方式.最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结. 今天解析的xml示例(channels.xml)如下: <?xml version="1.0" encoding="utf-8

  • C#实现读写CSV文件的方法详解

    目录 CSV文件标准 文件示例 RFC 4180 简化标准 读写CSV文件 使用CsvHelper 使用自定义方法 总结 项目中经常遇到CSV文件的读写需求,其中的难点主要是CSV文件的解析.本文会介绍CsvHelper.TextFieldParser.正则表达式三种解析CSV文件的方法,顺带也会介绍一下CSV文件的写方法. CSV文件标准 在介绍CSV文件的读写方法前,我们需要了解一下CSV文件的格式. 文件示例 一个简单的CSV文件: Test1,Test2,Test3,Test4,Test

  • javascript ES6中set集合、map集合使用方法详解与源码实例

    set与map理解 ES6中新增,set集合和map集合就是一种数据的存储结构(在ES6之前数据存储结构只有array,object),不同的场景使用不同的集合去存储数据 set集合 Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用. set集合语法: //创建一个set集合,传参为一个可迭代的对象 const s1 = new Set(iterable); API 名称 类型 简介 Set.add() 原型方法 添加数据 Set.has() 原型方法 判断是否存在一个数据 S

  • Java SpringBoot自动装配原理详解及源码注释

    目录 一.pom.xml文件 1.父依赖 2.启动器: 二.主程序: 剖析源码注解: 三.结论: 一.pom.xml文件 1.父依赖 主要是依赖一个父项目,管理项目的资源过滤以及插件! 资源过滤已经配置好了,无需再自己配置 在pom.xml中有个父依赖:spring-boot-dependencies是SpringBoot的版本控制中心! 因为有这些版本仓库,我们在写或者引入一些springboot依赖的时候,不需要指定版本! 2.启动器: 启动器也就是Springboot的启动场景; 比如sp

  • Android编程解析XML文件的方法详解【基于XmlPullParser】

    本文实例讲述了Android编程解析XML文件的方法.分享给大家供大家参考,具体如下: 前言 在学习Android的Framework层源码时,Android大量的使用XmlPullParser来解析xml文件的源码.因此,这里也顺道介绍一下XmlPullParser的使用. XML XML(eXtensible Markup Language)中文名为可扩展标记语言.标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等. 用途 XML设计用了传送及携带数据信息,

  • JS实现加载和读取XML文件的方法详解

    本文实例讲述了JS实现加载和读取XML文件的方法.分享给大家供大家参考,具体如下: 有时在开发时用到 JS 加载和读取XML文件的情况,写下提供参考,这里主要是分两步完成: 1. JS加载XML文件 步骤一般为(1),建立 XML DOM 对象:(2),设置加载方式,异步(推荐)或同步: (3)提供XML文件URL然后调用 load 方法:大致如下: var xmlFileName="xxFile.xml"; var xmlDoc=''; if (window.ActiveXObjec

  • C#实现导出List数据到xml文件的方法【附demo源码下载】

    本文实例讲述了C#实现导出List数据到xml文件的方法.分享给大家供大家参考,具体如下: C#导出List数据到xml文件,这里主要用到的是: XmlSerializer 类 (System.Xml.Serialization) 将对象序列化到 XML 文档中和从 XML 文档中反序列化对象.XmlSerializer 使您得以控制如何将对象编码到 XML 中. 实体类代码: /// <summary> /// 用户实体类 /// /// 注意:类的访问修饰符必须是:public,否则会出现

  • C++提取文件名与提取XML文件的方法详解

    目录 1.提取文件名 2.提取XML文件 总结 1.提取文件名 查找容器内子序列的最后一次出现的位置 std::find_end(str.begin(), str.end(), pattern.begin(), pattern.end()) 查找容器内子序列的第一次出现的位置 std::search() find函数主要实现的是在容器内查找指定的元素,并且这个元素必须是基本数据类型的.查找成功返回一个指向指定元素的迭代器,查找失败返回end迭代器. std::find() 返回两个迭代器之间的距

随机推荐