如何使用 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 - 如何强制从媒体文件中读取标签