我想读取一个xml文件,如下所示:
QFile myFile("xmlfile");
然后继续从:
开始解析xmlQXmlStreamReader 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 ...
}
所以,在这个断点处,我注意到我的debuger中的标记值为QXmlStreamReader::Invalid(1)
所以,发生了什么...是我的QStreamReader没有将文件读取为xml,或者它读取它但是xml本身有错误?
答案 0 :(得分:5)
错误消息告诉您,类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。
答案 1 :(得分:2)
我发现了问题,现在一切正常
这是错误:以前使用以下代码:
QFile myFile("xmlfile");
QXmlStreamReader xmlData(&myFile);
首先在第一行创建文件,第二行代码只传递文件,因为它不是它的xml内容(因为它尚未打开),因此 QXmlStreamReader :: errorString 返回文档的过早结束 ..
解决方案很简单:在使用以下代码将文件传递给QXmlStreamReader之前打开“myFile”文件:
xmlData.open(QIODevice::ReadOnly);
现在,设备已打开,可供QXmlStreamReader读取。 最终代码是:
QFile myFile("xmlfile");
myFile.open(QIODevice::ReadOnly);
QXmlStreamReader xmlData(&myFile);
答案 2 :(得分:1)
我在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;