在Qt中读取XML文件

时间:2017-01-25 13:01:23

标签: xml qt parsing

我想在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;。

1 个答案:

答案 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());
}