当前位置: 首页 > news >正文

Qt xml解析之QXmlStreamReader

文章目录

  • 背景
  • QXmlStreamReader简单介绍
  • 使用QXmlStreamReader
    • 添加头文件<QXmlStreamReader>
    • toString()
    • toInt()
    • 完整代码

背景

项目中遇到需要解析某个方法返回的xml字符串,奈何C/C++中没有原生的方法可供调用,只能使用第三方库,搜了一圈资料发现都不好用。刚好项目中用的Qt,瞬间想到了Qt中提供的各种各样的函数,去仔细查了一下Qt中提供的函数——QXmlStreamReader,真救命稻草,几行代码就搞定了我的需求。

QXmlStreamReader简单介绍

自QT4.3版本开始,QT提供了两个新类来读写XML:QXmlStreamReader 和 QXmlStreamWriter。顾名思义,QXmlStreamReader用于读取XML,QXmlStreamWriter用于写入XML。这两个类都使用流的方式操作xml,比起使用DOM和SAX解析xml,这是最快最方便的操作xml的方法。

使用QXmlStreamReader

添加头文件

假设有如下xml字符串,解析获取其中name、attr1、attr2的值
在这里插入图片描述
使用QXmlStreamReader只需要简单的几行代码就能搞定

QString xml = R"(<?xml version='1.0' encoding='UTF-8'?><featureinfo><features><feature name='a' attr1='100' attr2='10' /><feature name='b' attr1='200' attr2='20' /><feature name='c' attr1='300' attr2='30' /></features></featureinfo>)";// 1、初始化QXmlStreamReaderQXmlStreamReader reader(xml);while(!reader.atEnd() && !reader.hasError()) {// 2、使用readNext读取下一行QXmlStreamReader::TokenType token = reader.readNext();if (token == QXmlStreamReader::StartElement) { // 判断是否为xml开始标签,即左边的<if (reader.name() == "feature") { // 标签名称qDebug() << "name:" << reader.attributes().value("name").toString() << " attr1:" << reader.attributes().value("attr1").toInt() << " attr2:" << reader.attributes().value("attr2").toInt();}}}

最后调用attributes()方法获取对应的属性值即可。需要注意的是,reader.attributes().value(“name”).toString()还是toInt(),需要根据实际数据类型来确定,字符串就选toString,整数就选toInt。区别如下:

toString()

qDebug() << "name:" << reader.attributes().value("name").toString() << " attr1:" << reader.attributes().value("attr1").toString() << " attr2:" << reader.attributes().value("attr2").toString();

在这里插入图片描述
可以看到输出的也是字符串类型。

toInt()

qDebug() << "name:" << reader.attributes().value("name").toString() << " attr1:" << reader.attributes().value("attr1").toInt() << " attr2:" << reader.attributes().value("attr2").toInt();

在这里插入图片描述
此处输出的是int类型。

完整代码

项目文件test.pro
TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle

SOURCES += main.cpp
main.cpp

#include <iostream>
#include <QString>
#include <QXmlStreamReader>
#include <qDebug>using namespace std;int main()
{QString xml = R"(<?xml version='1.0' encoding='UTF-8'?><featureinfo><features><feature name='a' attr1='100' attr2='10' /><feature name='b' attr1='200' attr2='20' /><feature name='c' attr1='300' attr2='30' /></features></featureinfo>)";// 1、初始化QXmlStreamReaderQXmlStreamReader reader(xml);while(!reader.atEnd() && !reader.hasError()) {// 2、使用readNext读取下一行QXmlStreamReader::TokenType token = reader.readNext();if (token == QXmlStreamReader::StartElement) { // 判断是否为xml开始标签,即左边的<if (reader.name() == "feature") { // 标签名称qDebug() << "name:" << reader.attributes().value("name").toString() << " attr1:" << reader.attributes().value("attr1").toInt() << " attr2:" << reader.attributes().value("attr2").toInt();//qDebug() << "name:" << reader.attributes().value("name").toString() << " attr1:" << reader.attributes().value("attr1").toString() << " attr2:" << reader.attributes().value("attr2").toString();}}}return 0;
}
http://www.lryc.cn/news/151693.html

相关文章:

  • Selenium基础 — CSS选择器定位大全
  • vue3中keep-alive的使用及结合transition使用
  • 【提示工程】询问GPT返回Json结构数据
  • CSS水平垂直居中方案
  • SpringBoot入门篇3 - 整合junit、整合mybatis、基于SpringBoot实现ssm整合
  • C#,《小白学程序》第七课:列表(List)应用之一“编制高铁车次信息表”
  • 周报/月报 Prompt
  • c++ 学习 之 构造函数的分类和调用类型 深入学习
  • Royal TSX 6 Mac多协议远程软件
  • 远程管理通道安全SSH协议主机验证过程
  • .NET 操作 TDengine .NET ORM
  • SQL Server对象类型(3)——视图(View)
  • 【LeetCode】剑指 Offer <二刷>(1)
  • MySQL事物和存储引擎
  • 代码随想录算法训练营Day51 | 309. 最佳买卖股票时机含冷冻期 | 714. 买卖股票的最佳时机含手续费 | 股票总结
  • C#,《小白学程序》第八课:列表(List)应用之二“编制高铁列车时刻表”
  • 2、QT的信号与槽
  • Java代码审计15之Apache log4j2漏洞
  • c语言每日一练(13)
  • H5 + C3基础(六)(2D转换transform 位移 旋转 缩放)
  • 2023最新 Electron.js 桌面应用开发教程(基础篇)更新中
  • 【ES】笔记-Set集合实践
  • 缺陷或负样本难以收集怎么办?使用生成式模型自动生成训练样本,image-to-image Stable diffusion
  • ZMTP协议
  • ubuntu18安装中文环境
  • 怎么提取视频中的音乐保存到本地?其实方法很简单
  • 线性代数的学习和整理18:矩阵的秩的各种定理, 秩和维度(未完成)
  • UVa11374 Airport Express(Dijkstra)
  • hadoop的hdfs中避免因节点掉线产生网络风暴
  • 2023年高教社杯 国赛数学建模思路 - 案例:最短时间生产计划安排