如何使用 Qt 从磁盘读取 XML 文件?

Posted

技术标签:

【中文标题】如何使用 Qt 从磁盘读取 XML 文件?【英文标题】:How to read an XML file from the disk using Qt? 【发布时间】: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 本身有错误?

【问题讨论】:

【参考方案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的标识符相同,导致这段代码无法编译?

以上是关于如何使用 Qt 从磁盘读取 XML 文件?的主要内容,如果未能解决你的问题,请参考以下文章

Qt Multimedia - 如何强制从媒体文件中读取标签

如何使用php从url读取xml文件

如何使用 .NET 3.5 从 XML 文件中读取处理指令

如何使用C / C ++套接字从HTTP读取二进制文件

如何从 C++/Qt 中的 .exe 和 .dlls 中读取图标(在 Windows 上)?

如何使用 EMF 读取 XML 文件?