1

我正在从 xml 文件中读取数据并尝试将数据解析为双精度数据。它正在读取数据并在应用程序输出中显示适当的字符串,但不会从字符串转换为双精度。这是进行转换的代码部分。

if ( !(imgDur = QString ( xmlReader->readElementText() ).toDouble()) ){
        imgDur = 10;
}

这将返回数字 0。我得到零错误并且代码编译。为什么这行不通?谢谢你的时间。

读取 XML 文件的整个循环

//Parse the XML until we reach end of it
    while(!xmlReader->atEnd() && !xmlReader->hasError()) {
            // Read next element
            QXmlStreamReader::TokenType token = xmlReader->readNext();
            //If token is just StartDocument - go to next
            if(token == QXmlStreamReader::StartDocument) {
                    continue;
            }
            //If token is StartElement - read it
            if(token == QXmlStreamReader::StartElement) {

                    if(xmlReader->name() == "time_delay") {
                        qWarning() << xmlReader->readElementText(); // OUTPUTS 15

                        if ( !(imgDur = QString (xmlReader->readElementText()).toDouble()  ) ){
                            qWarning() << "AS AN DOUBLE" << imgDur;  // OUTPUTS 0
                            imgDur = 10;
                        }

                    }

                    if(xmlReader->name() == "value") {
                        qWarning() << xmlReader->readElementText(); // OUTPUTS 8
                    }

            }
    }
4

3 回答 3

3

您的代码的主要问题是这一qWarning() << xmlReader->readElementText(); // OUTPUTS 15行。QXmlReader::readElementText()将 xmlReader 指针移动到文本节点的末尾,因此readNext()将返回EndElementofA而不是QXmlStreamReader::Characterstoken。所以基本上readElementText做类似的事情(请注意,在实际实现中它要复杂得多,因为它检查默认行为,设置 QXmlStreamReader 内部数据/状态/令牌等):

QString retval;
if(xmlReader->readNext() == QXmlStreamReader::Characters)
{
    retval = xmlReader->text().toString();
    xmlReader->readNext();
}
return retval;

所以基本上第二个xmlReader->readElementText();总是返回空的QString,因为当前令牌QXmlStreamReader::StartElement不再是

于 2012-09-13T08:54:50.087 回答
2

首先,我们假设 imgDur 是一个浮点数。然后将您的 if 语句更改为

QString tempText = xmlReader->readElementText();

if (imgDur != tempText.toDouble()) {

有两个问题,你的条件是一个真值陈述,你冗余地将 QString 转换为 QString。

于 2012-09-13T01:25:19.170 回答
1

您在评论中提到您尝试转换的字符串中包含的数字是 15。它总是会是 15 吗?如果是这样,您应该改用QString::toInt整数类型来存储该函数的返回值。

如果它更具动态性,则最好利用bool*toDouble 的参数并将代码更改为以下内容:

bool ok = false;
imgDur = xmlReader->readElementText().toDouble(&ok);
if (!ok) {
    imgDur = xmlReader->readElementText().toInt(&ok);
    if (!ok) {
        imgDur = 10.0;
    }
}
于 2012-09-13T01:44:54.843 回答