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()是空的
问题原因
这是因为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"