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"

扫描二维码关注公众号,回复: 15490277 查看本文章

猜你喜欢

转载自blog.csdn.net/aoxuestudy/article/details/131453839