我想在Qt中阅读以下XML文件:
<?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>
我试过这样:
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
QDir::currentPath(), tr("*.xml"));
QFile inFile(fileName);
if (!inFile.open(QIODevice::ReadOnly | QIODevice::Text))
{
}
QXmlStreamReader xmlReader(&inFile);
while (xmlReader.readNextStartElement())
{
if (xmlReader.name() == "Equation")
{
while (xmlReader.readNextStartElement()) // eq(n)
{
while (xmlReader.readNextStartElement()) // value(n)
{
if (xmlReader.name() == "value1")
{
ui.textEdit->append(xmlReader.readElementText());
}
if (xmlReader.name() == "value2")
{
ui.textEdit->append(xmlReader.readElementText());
}
}
}
}
if (xmlReader.name() == "Variables")
{
while (xmlReader.readNextStartElement()) // var(n)
{
while (xmlReader.readNextStartElement()) // val(n)
{
while (xmlReader.readNextStartElement())// num(n)
{
if (xmlReader.name() == "number1")
{
ui.textEdit->append(xmlReader.readElementText());
}
if (xmlReader.name() == "number2")
{
ui.textEdit->append(xmlReader.readElementText());
}
}
}
}
}
}
输出:
5
3
5
3
1.5
0.2
但我希望输出为:
5
3
5
3
1.5
0.2
1.5
0.2
2.5
1.2
我做错了什么?有更简单的解决方案吗? 我认为这种方法真的很尴尬。
我只想将所有值保存在矢量中。
例如vector&#34; Equation&#34;应包含2个向量(&#34; eq1&#34;,&#34; eq2&#34;),每个向量包含值&#34; val1&#34;和&#34; val2&#34;。
答案 0 :(得分:0)
您的问题是使用多个嵌套循环,您可以在其中调用相同的方法:xmlReader.readNextStartElement()
。你进入的最嵌套的循环跳过文件的其余部分,没有任何机会进入外部循环。实际上,您的示例中的Equation
标记只能正确处理,因为只有一个这样的标记;如果有两个或更多,你只需要解析第一个。
您的解决方案可以更改如下:
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());
}