Qt中使用QXmlStreamReader读取xml文件中遇到的问题

Qt系列文章目录

前言

<?xml version="1.0" encoding="UTF-8"?>
<note>
  <yolov5>E:/work/python_jdk/yolov5/dist/detect/detect.exe</yolov5>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>
QString parseXml(QString xmlFile, QString nodeName)
    {
        QFile file(xmlFile);
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            qDebug() << "Cannot open file";
            return "Cannot open file";
        }

        QXmlStreamReader xml(&file);
        QString nodeContent;

        while(!xml.atEnd() && !xml.hasError()) {
            xml.readNext();

            if(xml.isStartElement()) {
                if(xml.name() == nodeName) {
                    nodeContent = xml.readElementText();
                    qDebug() << "Content of " << nodeName << ":" << xml.readElementText();

                    qDebug() << "nodeContent" << nodeContent;
                    break;
                }
            }
        }

        if(xml.hasError()) {
            qDebug() << "XML Error:" << xml.errorString();
            return xml.errorString();
        }

        xml.clear();
        file.close();

        return nodeContent;
    }

上面是第一段是xml文本,第二段是读取xml文件内容的代码

一、为什么xml.readElementText()是空的

在这里插入图片描述

问题原因

这是因为QXmlStreamReader::readElementText()这个函数在被调用后,内部的位置会被更新到当前标签的结束位置。因此,当你连续两次调用xml.readElementText()时,第二次的调用实际上是在的位置,此时并没有可以读取的内容,所以返回空字符串。

你的代码应该在第一次调用readElementText()时就把结果保存下来

QXmlStreamReader类简介

简介, 对于 XML 的内容,通常情况下,我们只关心 XML 元素的解析。这时,可以通过 QXmlStreamReader 中的便利函数 readNextStartElement() 来实现。 简述 详细介绍 使用 更多参考 详细介绍 之前使用的方式主要使用 readNext() 来读取下一个标记,并返回对应的类型。

QStringRef documentEncoding(); //获取XML编码,如果XML声明中未指定,则返回NULL
QStringRef documentVersion () ; //获取XML版本,如果XML声明中未指定,则返回NULL
bool atEnd ();
//如果读者一直读到XML文档的末尾,或者出现了错误,并且阅读被中止,那么返回true。否则,它将返回false。
//读取XML内容,如果读到XML末尾,或者读取出错时,将返回true,否则返回false
//当返回true时,可以通过error()判断是否读取出错
Error error () ; //返回错误类型,如果未出错,将返回QXmlStreamReader::NoError(数值0)

void raiseError ( constQString & message = QString() );
//主动上报错误,并填入message 错误信息(可以通过errorString()获取),可以使得下次调用atEnd()时,直接返回true值
QString errorString();
//获取发生的错误信息

void QXmlStreamReader::setDevice ( QIODevice *device );
//设置QXmlStreamReader的解析设备,等价于QXmlStreamReader ( QIODevice *)构造函数
TokenType readNext(); //读取一次记号,并返回该数据的标志位,也可以通过
//常用标记如下所示:
QXmlStreamReader::StartDocument //文档开始位置,用来定义XML版本,编码等信息,
QXmlStreamReader::StartElement //元素开始位置
QXmlStreamReader::EndElement //元素结束位置
//比如Anna
// 元素便是元素开始以及结束位置.
//“Anna”信息可以通过readElementText()成员函数获取.

QXmlStreamAttributes attributes(); //获取元素的属性
//比如
//通过attributes().value(“term”).toString()则可以得到元素值"of pictures"

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值