我正在读取xml文件并尝试将数据解析为double。它正在读取数据并在应用程序输出中显示相应的字符串,但不会从字符串转换为double。这是进行转换的代码部分。
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
}
}
}
答案 0 :(得分:3)
您的代码的主要问题是此qWarning() << xmlReader->readElementText(); // OUTPUTS 15
行。 QXmlReader::readElementText()
将xmlReader指针移动到文本节点的末尾,因此readNext()
将返回EndElement
A
而不是QXmlStreamReader::Characters
令牌。所以基本上readElementText
做了类似的事情(请注意,在实际实现中它更复杂,因为它检查默认行为,设置QXmlStreamReader内部数据/状态/令牌等):
QString retval;
if(xmlReader->readNext() == QXmlStreamReader::Characters)
{
retval = xmlReader->text().toString();
xmlReader->readNext();
}
return retval;
基本上,第二个xmlReader->readElementText();
将始终返回空QString,因为当前令牌不再是QXmlStreamReader::StartElement
答案 1 :(得分:2)
首先,我们假设imgDur是一个浮点数。然后将if语句更改为
QString tempText = xmlReader->readElementText();
if (imgDur != tempText.toDouble()) {
有两个问题,你的条件是真值陈述,你冗余地将QString转换为QString。
答案 2 :(得分:1)
你在评论的评论中提到你试图转换的字符串中包含的数字是15.它总是15吗?如果是这样,您应该使用QString::toInt
以及整数类型来存储该函数的返回值。
如果它更具动态性,您可能最好利用toDouble的bool*
参数并将代码更改为以下内容:
bool ok = false;
imgDur = xmlReader->readElementText().toDouble(&ok);
if (!ok) {
imgDur = xmlReader->readElementText().toInt(&ok);
if (!ok) {
imgDur = 10.0;
}
}