3

我想读取一个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 本身有错误?

4

3 回答 3

5

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

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

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

QXmlStreamReader xmlData(&myFile);

此外,您似乎根本不知道如何使用QXmlStreamReader,因此您正在寻找的是教程。我不想在这里重写很棒的 Qt 教程。因此,为了拦截您所有进一步的问题,我建议您参考官方教程

于 2013-04-24T16:15:25.100 回答
2

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

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

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

该文件首先在第一行创建,第二行代码只是传递文件,因为它不是它的 xml 内容(因为它还没有被打开),因此QXmlStreamReader::errorString返回文档的 Premature end ..

解决方案非常简单:使用以下代码在将“myFile”文件传递给 QXmlStreamReader 之前打开它:

xmlData.open(QIODevice::ReadOnly);

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

QFile myFile("xmlfile");
myFile.open(QIODevice::ReadOnly);
QXmlStreamReader xmlData(&myFile);
于 2013-04-25T11:00:01.433 回答
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;
于 2013-04-24T20:36:05.043 回答