在Qt中读取XML文件
我想在Qt中读取以下XML文件:在Qt中读取XML文件,xml,qt,parsing,Xml,Qt,Parsing,我想在Qt中读取以下XML文件: <?xml version="1.0" encoding="utf-8"?> <Math> <Equation> <eq1> <value1>5</value1> <value2>3</value2> </eq1> <eq2> <value1&
<?xml version="1.0" encoding="utf-8"?>
<Math>
<Equation>
<eq1>
<value1>5</value1>
<value2>3</value2>
</eq1>
<eq2>
<value1>5</value1>
<value2>3</value2>
</eq2>
</Equation>
<Variables>
<var1>
<val1>
<number1>1.5</number1>
<number2>0.2</number2>
</val1>
<val2>
<number1>1.5</number1>
<number2>0.2</number2>
</val2>
</var1>
<var2>
<val1>
<number1>2.5</number1>
<number2>1.2</number2>
</val1>
<val2>
<number1>2.5</number1>
<number2>1.2</number2>
</val2>
</var2>
</Variables>
</Math>
这将产生:
5
3
5
3
1.5
0.2
但我预计结果是:
5
3
5
3
1.5
0.2
1.5
0.2
2.5
1.2
我做错了什么?有更简单的解决方案吗?
我觉得这个方法真的很尴尬
我只想把所有值保存在向量中
例如,向量“等式”应该包含两个向量(“eq1”、“eq2”),每个向量都包含值“val1”和“val2”。您的问题是使用多个嵌套循环,在这些循环中调用相同的方法:
xmlReader.readnextstartement()
。您进入的嵌套最多的循环会跳过文件的其余部分,而不会给外部循环任何机会。事实上,您的示例中的等式
标记只能正确处理,因为只有一个这样的标记;如果有两个或多个,则只解析第一个
您的解决方案可以按以下方式更改:
QString previousElement;
while(!xmlReader.atEnd())
{
xmlReader.readNext();
if (!xmlReader.isStartElement()) {
continue;
}
QString text = xmlReader.name().toString();
if ( (text == QStringLiteral("value1")) ||
(text == QStringLiteral("value2")) ||
(text == QStringLiteral("number1")) ||
(text == QStringLiteral("number2")) )
{
ui->textEdit->append(xmlReader.readElementText());
}
}
if (xmlReader.hasError()) {
ui->textEdit->setText(QStringLiteral("Error parsing XML: ") + xmlReader.errorString());
}
我建议将QtXML模块与QDomDocument主类一起使用。对于较小的XML文件,它更好、更容易使用。您是否考虑过向每个分支添加调试打印,以便了解代码中实际发生了什么
qDebug()@Xander显式地告诉您改为使用QXmlStreamReader/Writer。Qt-XML不再被维护。
QString previousElement;
while(!xmlReader.atEnd())
{
xmlReader.readNext();
if (!xmlReader.isStartElement()) {
continue;
}
QString text = xmlReader.name().toString();
if ( (text == QStringLiteral("value1")) ||
(text == QStringLiteral("value2")) ||
(text == QStringLiteral("number1")) ||
(text == QStringLiteral("number2")) )
{
ui->textEdit->append(xmlReader.readElementText());
}
}
if (xmlReader.hasError()) {
ui->textEdit->setText(QStringLiteral("Error parsing XML: ") + xmlReader.errorString());
}