0
点赞
收藏
分享

微信扫一扫

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


Qt系列文章目录


文章目录

  • Qt系列文章目录
  • 前言
  • 一、为什么xml.readElementText()是空的
  • 问题原因
  • QXmlStreamReader类简介


前言

<?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()是空的

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

问题原因

这是因为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 条评论