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

时间:2013-04-24 16:11:43

标签: c++ qt qfile qxmlstreamreader

我想读取一个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 ...
 }

所以,在这个断点处,我注意到我的debuger中的标记值为QXmlStreamReader::Invalid(1)

所以,发生了什么...是我的QStreamReader没有将文件读取为xml,或者它读取它但是xml本身有错误?

3 个答案:

答案 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;