Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Qt中读取XML文件_Xml_Qt_Parsing - Fatal编程技术网

在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&

我想在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>
这将产生:

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