【问题标题】:How to read an XML file from the disk using Qt?如何使用 Qt 从磁盘读取 XML 文件?
【发布时间】:2013-04-24 16:11:43
【问题描述】:

我想读取一个xml文件如下:

QFile myFile("xmlfile");  

然后继续解析从:开始的xml:

QXmlStreamReader xmlData(myFile);

.. 我得到的错误是:

no matching function for call to 'QXmlStreamReader::QXmlStreamReader(QFile&)'

那么问题是什么以及如何解决呢?


问题更新: 根据下面选择的答案,代码现在可以正常工作,没有语法错误。

但是,我无法读取我的 xml。在解析 xml 时,我使用以下内容来读取 xml 元素:

QXmlStreamReader::TokenType token = xmlElements.readNext();

然后这段代码用于检查 startElements:

 while(!xmlElements.atEnd() && !xmlElements.hasError()){ // the breakpoint is here
 do ...
 }

所以,在这个断点处,我在调试器中注意到令牌值是 QXmlStreamReader::Invalid(1)

所以,这是怎么回事..是我的 QStreamReader 没有将文件读取为 xml,或者它读取它但 xml 本身有错误?

【问题讨论】:

    标签: c++ qt qfile qxmlstreamreader


    【解决方案1】:

    错误消息告诉您,QXmlStreamReader 类没有您尝试调用的签名的构造函数,即仅接受 QFile 参数的构造函数(通过值或通过引用)。阅读documentation 很有帮助。相关摘录:

    QXmlStreamReader ()
    QXmlStreamReader ( QIODevice * device )
    QXmlStreamReader ( const QByteArray & data )
    QXmlStreamReader ( const QString & data )
    QXmlStreamReader ( const char * data )
    

    现在,如果您知道QFile实际上继承了QIODevice(您也可以在documentation中找到),那么您可以立即理解调用应该更改如下:

    QXmlStreamReader xmlData(&myFile);
    

    此外,您似乎根本不知道如何使用QXmlStreamReader,因此您正在寻找的是教程。我不想在这里重写很棒的 Qt 教程。因此,为了拦截您的所有其他问题,我建议您联系official tutorial。

    【讨论】:

    • 感谢您的回复,它现在没有语法错误,但它不读取我的 xml。令牌说明 QXmlStreamReader::Invalid(1).. 我不知道它是否没有读取 xml 或读取它但错误..
    • 您能否更清楚您现在面临的问题是什么,并相应地更新您的问题,不要忘记包含所有相关输出。
    • 我确实知道 QXmlStreamReader 是如何工作的,并且我已经使用它提取了一个模拟 xml,它运行良好。我的具体问题是读取一个真正的 xml 文件.. 我不能做的就是如何用真正的 xml 文件替换 QStreamReader 中的模拟 xml,仅此而已..
    • 再次打开documentation,我们看到了什么?我们看到,要了解错误的实际原因,我们需要 error() 和 errorString()。
    • PrematureEndOfDocument 在从文件、套接字等读取时总是会发生,当 XML 数据以块的形式提供时。必须确保读取更多数据(连接到 readyRead 信号、waitForReadyRead 等)并重试。为确保不是您的文件损坏,请通过其他方式(xmllint 等)验证它是有效的 XML,或尝试使用 QXMLStreamReader reader(file.readAll())。这不是好方法(因为它一次将所有内容读入内存),但应该有助于排除这种错误来源。
    【解决方案2】:

    我发现了问题,现在一切正常

    这是错误:之前使用了以下代码:

    QFile myFile("xmlfile");
    QXmlStreamReader xmlData(&myFile);
    

    文件首先在第一行创建,第二行代码只是传递文件,因为它不是它的 xml 内容(因为它尚未打开),因此 QXmlStreamReader::errorString 返回文档过早结束 ..

    解决方案非常简单:使用以下代码打开“myFile”文件,然后将其传递给 QXmlStreamReader:

    xmlData.open(QIODevice::ReadOnly);
    

    设备现在已打开以供 QXmlStreamReader 读取。而最终代码是:

    QFile myFile("xmlfile");
    myFile.open(QIODevice::ReadOnly);
    QXmlStreamReader xmlData(&myFile);
    

    【讨论】:

      【解决方案3】:

      我在 QT 中读取 XML 文件的方式略有不同,我读取它们并将它们存储在一个单独的对象中,因为我读取并解析了很多 XML。

      我会为您发布一个示例,此示例运行 XML 属性,如果您正在寻找 XML 标记,它将无法工作。

          QDomDocument XMLfile;
      
          QFile XMLfile(XMLpath);
          if (!XMLfile.open(QIODevice::ReadOnly | QIODevice::Text))
          {
              // Error
          }
          if (!XMLfile.setContent(&XMLfile))
          {
              // Error
          }
          XMLfile.close();
      
          QDomElement root = XMLfile.firstChildElement();
          QDomElement item = root.firstChildElement();
      
          XMLstorage* currentXMLstorage = new XMLstorage();
      
          currentXMLstorage->Attribute1(item.attribute("Attribute1"));
          currentXMLstorage->Attribute2(item.attribute("Attribute2"));
          currentXMLstorage->Attribute3(item.attribute("Attribute3"));
          currentXMLstorage->Attribute4(item.attribute("Attribute4"));
          currentXMLstorage->Attribute5(item.attribute("Attribute5"));
          currentXMLstorage->Attribute6(item.attribute("Attribute6"));
      
          return *currentXMLstorage;
      

      【讨论】:

      • 我的印象或第一行的QDomDocument与第三行的QFile的标识符相同,导致这段代码无法编译?
      猜你喜欢
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 2018-02-25
      • 2023-03-13
      • 2019-06-14
      相关资源
      最近更新 更多