Qt — xml读写及常用操作示例

2023-11-03

1 QXML类概述

描述
QDomAttr 表示 QDomElement 的一个属性
QDomCDATASection 表示一个 XML CDATA 片段
QDomCharacterData 表示 DOM 中的通用字符串
QDomComment 表示 XML 注释
QDomDocument 表示一个 XML 文档
QDomDocumentFragment 一组 QDomNodes,通常不是完整的 QDomDocument
QDomDocumentType DTD 在文档树中的表示
QDomElement 代表 DOM 树中的一个元素
QDomEntity 代表一个 XML 实体
QDomEntityReference 表示 XML 实体引用
QDomImplementation 有关 DOM 实现功能的信息
QDomNamedNodeMap 包含可以通过名称访问的节点集合
QDomNode DOM 树中所有节点的基类
QDomNodeList QDomNode 对象列表
QDomNotation 表示 XML 符号
QDomProcessingInstruction 表示一条 XML 处理指令
QDomText 表示解析的 XML 文档中的文本数据
QXmlAttributes XML 属性
QXmlContentHandler 用于报告 XML 数据逻辑内容的接口
QXmlDTDHandler 用于报告 XML 数据的 DTD 内容的接口
QXmlDeclHandler XML数据声明内容上报接口
QXmlDefaultHandler 所有 XML 处理程序类的默认实现
QXmlEntityResolver 用于解析 XML 数据中包含的外部实体的接口
QXmlErrorHandler 用于报告 XML 数据错误的接口
QXmlInputSource XmlReader 子类的输入数据
QXmlLexicalHandler 报告 XML 数据词法内容的接口
QXmlLocator 包含有关文件中解析位置信息的 XML 处理程序类
QXmlNamespaceSupport 用于希望包含命名空间支持的 XML 阅读器的类
QXmlParseException 使用 QXmlErrorHandler 接口报告错误
QXmlReader XML 阅读器(即解析器)的接口
QXmlSimpleReader 一个简单的 XML 解析器的实现

2 XML示例

2.1 示例1

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <tag id="1">
    <name>test1</name>
    <value>100</value>
  </tag>
  <tag id="1">
    <name>test2</name>
    <value>100</value>
  </tag>
</root>
  • 说明:
    1 节点名:root、tag、value、type
    2 属性:id
    3 文本:test1
    4 元素:一对标签囊括的内容

3 XML节点说明

在这里插入图片描述
QTXml的结构如图所示,解析、生成xml的用到的类有QDomDocument、QDomElement、QDomAttr。

3.1QDomNode

  • 描述:是 DOM 树中所有节点的基类.
  • API及功能
    1 appendChild、insertAfter、insertBefore、removeChild、replaceChild:在最后插入一个新的子节点、在指定子节点之后插入新的子节点、在指定子节点之前插入新的子节点、删除子节点、替换子节点。
    2 childNodes:返回字节的列表。
    3 clear:将节点转换为空节点; 如果之前不是空节点,则删除其类型和内容。
    4 cloneNode:复制当前节点的副本,其参数deep deep 为真,则克隆以递归方式完成,这意味着所有节点的子节点也被深度复制。 如果 deep 为 false,则仅复制节点本身,并且副本将没有子节点。
    5 firstChild、lastChild、firstChildElement、lastChildElement:第一个子节点(元素、属性、文本……)、最后一个子节点(元素、属性、文本……)、第一个子元素、最后一个子元素。
    6 isAttr、isComment、isDocument、isElement、isText等:判断当前节点的类型。
    7 toAttr、toComment、toDocument、toElement、toText等:转换当前节点的类型。
    8 namedItem:根据节点名获取当前节点的一级子节点。
    9 nextSibling、previousSibling、nextSiblingElement、previousSiblingElement:获取下一个兄弟节点、获取上一个兄弟节点、获取下一个[指定参数名的]兄弟元素、获取上一个[指定参数名的]兄弟元素。
    10 nodeName:获取节点名。
    11 nodeType:获取节点类型,具体值如下:
    在这里插入图片描述
    12 parentNode:父节点。
    13 save:保存到文件流,第二个参数指定了缩进格式,第三个参数为编码格式(默认UTF-8)。
    14 nodeValue、setNodeValue:获取节点的值、设置节点的值。不同类型的节点,值得含义如下,其他类型返回空字符串:
节点类型 描述
QDomAttr 属性值
QDomCDATASection CDATA 部分的内容
QDomComment 注释
QDomProcessingInstruction 处理指令的数据
QDomText 文本信息

3.2 QDomDocument

  • 描述:表示整个 XML 文档。 从概念上讲,它是文档树的根,并提供对文档数据的主要访问。QDomElement、QDomText、QDomComment、处理指令等不能存在于QDomDocument的上下文之外,QDomDocument包含创建这些对象所需的工厂函数。
  • 注意:解析的 XML 在内部由对象树表示,可以使用各种 QDom 类访问这些对象树。所有 QDom 类只引用内部树中的对象。一旦最后一个引用它们的 QDom 对象或 QDomDocument 本身被删除,DOM 树中的内部对象将被删除
  • API及功能
    1 createAttribute、createComment、createElement、createTextNode等:创建对应的数据类型对象。
    2 elementById、elementsByTagName:根据条件获取一个或多个xml元素
    3 documentElement:返回文档的根元素
    4 setContent:此函数从字节数组(或字符串)数据中解析 XML 文档并将其设置为文档的内容,它尝试按照 XML 规范的要求检测文档的编码。
    5 toString:将解析后的文档转换回其文本表示,此函数的参数作为缩进子元素的空间量。
  • 补充说明:creat对象不会将此对象加入此对象树,需要 appendChild() 函数来添加字节点

3.3 QDomElement

  • 描述:代表 DOM 树中的一个元素。
  • API及功能
    1 attribute、attributeNode、attributes:根据属性名获取属性值、根据属性名获取属性节点、获取该节点的属性节点列表
    2 elementsByTagName:根据节点名获取该元素的子节点列表
    3 setAttribute、removeAttribute:添加(修改)属性、删除属性
    4 text:获取该元素的文本值,若没有则返回空字符串。e.g 示例1 <name>test1</name>调用此接口返回test1

3.4 QDomAttr

  • 描述:代表 QDomElement 的一个属性。
  • API及功能
    1 name:属性名
    2 value:属性值
    3 ownerElement:所属元素

3.5 QDomText

  • 描述:表示解析的 XML 文档中的文本数据。

4 使用示例

4.1 pro配置

QT += core xml

4.2 加载并解析xml

  • 代码示例:解析xml示例1所示文件
#include <iostream>
#include <QFile>
#include <QDomDocument>
using namespace std;

static int iLevel = 0;
void ParseXmlNode(const QDomNode &clsEle)
{
    ++iLevel;
    QString strEleName = clsEle.nodeName();
    cout << "\nlevel = " << iLevel << " "
         << strEleName.toStdString() << " type = " << clsEle.nodeType()
         << " value = " << clsEle.nodeValue().toStdString() << endl;
    if(clsEle.hasAttributes())
    {
        QDomNamedNodeMap mapAttrs = clsEle.attributes();
        for(int i = 0, iSize = mapAttrs.count(); i < iSize; ++i)
        {
            cout << "attr" << i << " node type = " << mapAttrs.item(i).nodeType()
                 << " " << mapAttrs.item(i).nodeName().toStdString()
                  << " = " << mapAttrs.item(i).nodeValue().toStdString() << endl;
        }
    }
    QDomNodeList lstChildren = clsEle.childNodes();
    for (int i = 0, iSize = lstChildren.size(); i < iSize; ++i)
    {
        ParseXmlNode(lstChildren.at(i));
    }
    --iLevel;
}

int main()
{
    QFile file("test.xml");
    if(!file.exists())
    {
        return 0;
    };

    QDomDocument dom;
    if(!dom.setContent(&file))
    {
        return 0;
    }

    QDomElement domRoot = dom.documentElement();
    ParseXmlNode(domRoot);

    getchar();
    return 0;
}

4.2 构建并保存xml

  • 代码示例:构建并保存xml示例1所示文件
#include <iostream>
#include <QFile>
#include <QDomDocument>
#include <QMap>
using namespace std;

int main()
{
    QDomDocument clsDoc;
    QDomProcessingInstruction xmlProcess = clsDoc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
    clsDoc.appendChild(xmlProcess);

    QDomElement clsRoot = clsDoc.createElement("root");

    QMap<QString, int> mapData{{"test1", 100}, {"test2",100}};

    QMap<QString, int>::const_iterator itCur = mapData.begin();
    QMap<QString, int>::const_iterator itEnd = mapData.end();
    for (int i = 0; itCur != itEnd; ++itCur, ++i)
    {
        QDomElement clsTag = clsDoc.createElement("tag");
        QDomElement clsName = clsDoc.createElement("name");
        QDomElement clsValue = clsDoc.createElement("value");

        clsTag.setAttribute("id", QString::number(1));
        clsName.appendChild(clsDoc.createTextNode(itCur.key()) );
        clsValue.appendChild(clsDoc.createTextNode(QString::number(itCur.value())) );

        clsTag.appendChild(clsName);
        clsTag.appendChild(clsValue);
        clsRoot.appendChild(clsTag);
    }
    clsDoc.appendChild(clsRoot);

    QString strText = clsDoc.toString(2);
    QFile clsFile("test.xml");

    clsFile.open(QFile::WriteOnly | QFile::Truncate);
    clsFile.write(strText.toStdString().c_str(), strText.size());
    clsFile.close();

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

Qt — xml读写及常用操作示例 的相关文章

  • 是否有可能劫持标准输出

    我正在尝试使用 C 重定向 Windows XP 上已运行进程的标准输出 我知道如果我自己生成进程 我可以做到这一点 但对于这个应用程序 我更喜欢一个 监听器 我可以附加到另一个进程 这在纯 Net 中可能吗 如果不可能 在 Win32 中
  • 如何在特定时间以毫秒精度触发 C# 函数?

    我有两台计算机 它们的时间通过 NTP 同步 确保时间仅相差几毫秒 其中一台计算机将通过 TCP 向另一台计算机发送一条消息 以在两台计算机上的未来指定时间启动某个 c 函数 我的问题是 如何在特定时间以毫秒精度 或更好 触发 C 中的函数
  • 使用 Json.NET 序列化子类

    我正在尝试使用 Json NET 序列化子类 生成的 json 包含超类的序列化属性 但是not子类对象的属性 这似乎与我发现的一个问题有关这里就这样 https stackoverflow com q 5863496 498969 但必须
  • 平滑手绘曲线

    我有一个允许用户绘制曲线的程序 但这些曲线看起来不太好 它们看起来摇摇欲坠 而且是手绘的 所以我想要一种能够自动平滑它们的算法 我知道平滑过程中存在固有的模糊性 因此它不会每次都完美 但这种算法似乎确实存在于多个绘图包中 并且它们工作得很好
  • ASP.NET - 在 RenderContent 调用中将事件处理程序添加到 Repeater 内的 LinkBut​​ton

    我有一个加载自定义用户控件的 Sharepoint WebPart 用户控件包含一个 Repeater 而 Repeater 又包含多个 LinkBut ton 在 Web 部件的 RenderContent 调用中 我有一些用于添加事件处
  • ContentDialog 未与 UWP 中心对齐

    据我所知 ContentDialog的默认行为应该是使其在 PC 上居中并在移动设备上与顶部对齐 但就我而言 即使在 PC 上我也将其与顶部对齐 但我不明白发生了什么 我正在使用代码隐藏来创建它 这是我正在使用的代码片段 Creates t
  • 如何自定义 Google 测试失败消息?

    我编写了一个如下所示的 Google 测试 它将一些计算值与 CSV 文件中预期存储的值进行比较 class SampleTest public testing Test public void setupFile const std st
  • 我在使用 ado.net 时收到错误 Argument 2 may not be pass with ref keywords

    int t 0 cmd Parameters AddWithValue Res ref t 我在第二行收到错误 参数 2 不能与 ref 关键字一起传递 您只能通过引用传递参数ref if the 范围 is a ref参数也是如此 Add
  • 我可以将 UseCSharpNullComparisonBehavior 用于单个查询吗?

    我有一个查询 该查询曾经是存储过程 现已转换为 EF 查询 现在已经超时了 使用 SQL Profiler 我可以看到生成的 SQL 的唯一区别是 EF 转变的新行为entity Property value into entity Pro
  • 如何构建一棵与或树?

    我需要一个支持 与 和 或 的树结构 例如 给定一个正则表达式 如ab c d e 我想把它变成一棵树 所以 一开始我们有两个 或 分支 它可以向下ab or c d e 如果你低头ab分支 你得到两个节点 a and b or a其次是b
  • 当需要不同数量和类型的参数时如何创建操作委托列表

    我们有一组大约两打的类 它们继承自具有抽象 Validate 方法的基类 当然 每个类都有不同的验证需求 但它们之间的不同组合需要规则 因此 正如您可以想象的那样 这导致了大量代码重复 例如 A 类需要规则 1 3 6 和 9B 类需要规则
  • Gremlin.net 文本包含等效项

    我正在使用 Gremlin net 库连接到 janus 图形服务器 我使用 cassandra 和弹性搜索进行数据存储和索引 在我使用的 gremlin 语言和 gremlin 控制台中文本包含在属性的文本中进行搜索 我正在使用混合索引
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • 使用多态对象数组进行 JSON 反序列化

    我在涉及多态对象数组的 JSON 反序列化方面遇到问题 我已经尝试过记录的序列化解决方案here https stackoverflow com questions 5186973 json serialization of array w
  • 当我的进程被终止时到底会发生什么?

    我有一个包含本机代码和托管代码的混合进程 在 Windows Server 2003 上运行 当我从进程资源管理器中终止进程时 它会进入 100 cpu 的状态 并在消失之前保持这种状态一段时间 有时甚至 10 分钟 在此期间我无法 杀死
  • Boost.asio和异步链,unique_ptr?

    我对异步编程不太熟悉 我有一个问题 我的问题如下 给出 boost asio 中 C 11 的 echo server 示例 http www boost org doc libs 1 60 0 doc html boost asio ex
  • 为什么在构造函数中设置字段是(或不是)线程安全的?

    假设您有一个像这样的简单类 class MyClass private readonly int a private int b public MyClass int a int b this a a this b b public int
  • 如何在 C 中创建最低有效位设置为 1 的掩码

    这个功能如何运作 最低有效 n 位设置为 1 的掩码 Example n 6 gt 0x2F n 17 gt 0x1FFFF 我根本不明白这些 尤其是 n 6 gt 0x2F 另外 什么是面膜 通常的方法是采取1 并将其左移n位 这会给你类
  • 在windows + opengl中选择图形设备

    我知道如何使用 openGL 打开窗口 使用 Win32 或其他工具包 但是当系统有2块显卡时 如何选择要渲染的图形设备 我的编程语言是 C 我专注于 Windows 但任何示例都将受到欢迎 编辑 也许更好地解释我的问题是个好主意 以便添加
  • 实体框架代码首次日期字段创建

    我正在使用实体框架代码优先方法来创建我的数据库表 下面的代码 创建一个DATETIME数据库中的列 但我想创建一个DATE柱子 DataType DataType Date DisplayFormatAttribute ApplyForma

随机推荐

  • 实用工具篇(三):Free Mybatis plugin

    实用工具篇 三 Free Mybatis plugin 实用工具篇 一 Postman 实用工具篇 二 SourceTree Free Mybatis plugin 老规矩先吹一波 这个idea里面的插件真的十分nice 上个图让你们知道他
  • Scrum敏捷开发:适应变化的核心能力

    在当今高度变化的时代 软件开发的环境和要求也在不断变化 传统的开发方法往往难以适应这种快速变化 因此 一种新的软件开发方法 敏捷开发逐渐得到了广泛的关注和应用 本文将介绍敏捷开发的概念 优势 实践经验 敏捷开发工具以及注意事项 帮助您更好地
  • 解决vue-router跳转不起作用

    router 这么写 export default new Router mode history routes path homePage name HomePage component HomePage path topUpPage n
  • C++面向对象之封装

    C 在 C 语言的基础上增加了面向对象编程 C 支持面向对象程序设计 类是 C 的核心特性 通常被称为用户定义的类型 类用于指定对象的形式 它包含了数据表示法和用于处理数据的方法 类中的数据和方法称为类的成员 函数在一个类中被称为类的成员
  • CancelToken——取消请求

    CancelToken 取消请求 应用于第二次请求比第一次请求更快的情况 首先我们要明确 cancelToken是axios用来取消请求的API 那为什么要取消呢 是由于浏览器的请求的响应时间存在不确定性 请求次数过多可能较早发起的请求会比
  • docker - 部署java/python项目

    目录 1 docker 部署 java 项目 1 创建 mysql 容器 2 验证mysql dbserver 连接 mysql 服务器ip 3306 账户 root 密码 123456 3 创建tomcat容器 4 验证 http ip
  • 景联文科技助力医疗AI大模型:数据标注与专业医学资源的重要性

    随着通用人工智能 AI 与生成式人工智能 AIGC 的兴起 人工智能对一些产业的颠覆性影响开始显著加速 我们正在进入一个全新的 属于人工智能的时代 近日 谷歌对外发布谷歌医疗版ChatGPT已在多家诊所内测试 可生成诊断做总结 多个指标和真
  • matplotlib可视化之直方图plt.hist()与密度图

    函数功能 判定数据 或特征 的分布情况 调用方法 plt hist x bins 10 range None normed False weights None cumulative False bottom None histtype b
  • 【JavaScript】怎样判断一个变量是不是数组

    var arr 1 2 3 1 Array isArray console log Array isArray arr 2 instanceOf console log arr instanceof Array 3 constuctor c
  • 谷歌全球大裁员,涉及1.2万人

    Datawhale干货 方向 就业信息 来源 机器之心 最近几天科技领域的流行词不是某一项新技术 而是裁员 1 月 20 日 谷歌母公司 Alphabet 在一份员工备忘录中表示 由于面临 变化的经济现状 该公司将裁员约 1 2 万人 加大
  • unity 烘焙场景的创建、保存和使用(附demo项目)

    这是一个入门教程 demo项目 practice4 unitypackagehttps pan baidu com s 1tnDv3sDUzMlk1YnSmJV29w 密码 1234 1 打开Unity 新建一个场景 2 打开Light窗口
  • 深度linux win7分区,怎么安装Win7深度操作系统?

    安装前准备 一 为Deepin留出硬盘空间以便安装 1 打开磁盘管理 Windows徽标上右键单击 选择磁盘管理 2 选中一个分区 空闲空间大于30G 我选择的是C盘 因为是固态硬盘所以安装启动会快很多 磁盘1的200G分区是我上次安装使用
  • css锚点定位被顶部固定导航栏遮住的解决方案

    标题 css锚点定位被顶部固定导航栏遮住的解决方案 很多网站都有一个固定在上方的导航栏 方便用户搜索和跳转到其他页面 同时为了方便用户浏览长文档 都会加上目录 点击段落标题跳转到段落所在的位置 如图所示 如果使用锚点实现目录的跳转会遇到 f
  • camera理论基础和工作原理

    写在前面的话 本文是因为工作中需要编写摄像头程序 因为之前没有做过这类产品 所以网上搜索的资料 先整理如下 主要参考文章如下 如果有侵权 请联系我 另外 转载请注明出处 本文不一定全部正确 如果发现错误请指正 如果有新的理解 会继续整理 h
  • 西门子1513CPU冗余组态

    西门子1513R冗余配置 1 打开博图16软件 新建项目 添加新设备 在弹出的控制器目录下找到CPU 1513R 1 PN硬件 然后系统自动生成PLC 1和PLC 2 2 打开设备组态中的网络视图 添加接口模块 3 在硬件目录 分布式I O
  • 内存保护linux指令,Linux内存管理之MMU的过程

    之前写过一篇 CPU是如何访问内存的 的文章 简单介绍了cpu访问内存的过程 有了之前的感性认识 这篇站在arm的角度再深度讲解一下 看完你会发现不理解arm原理就直接撸内核代码简直是耍流氓 ARMv8中的访问内存流程 我喜欢用图的方式来说
  • Flutter组件之圆形进度条(CircularProgressIndicator)

    圆形进度条 可以在外面包一层SizedBox 间接改变进度条的大小 const CircularProgressIndicator Key key double value 0 1的浮点数 用来表示进度多少 如果 value 为 null
  • python为什么要使用if __name__ == “__main__”:

    python为什么要使用if name main 本文为wangluoshenghuo com原创 转载请注明出处 要说明这个问题 首先要了解 name 和 main 这两个符号是什么意思 name 是一个变量 是当前包的名称 而 main
  • Qt Creator中一些常用小技巧(总结)

    参考博客 https blog csdn net luoyayun361 article details 105431913 以下代码摘抄以上大神博客 1 代码注释 常用双斜杠 是单行注释 可以多行注释 其实在Qt creator里面还有一
  • Qt — xml读写及常用操作示例

    文章目录 1 QXML类概述 2 XML示例 2 1 示例1 3 XML节点说明 3 1QDomNode 3 2 QDomDocument 3 3 QDomElement 3 4 QDomAttr 3 5 QDomText 4 使用示例 4