Как прочитать файл XML с диска, используя Qt?

Я хочу прочитать 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?

3

Решение

Сообщение об ошибке говорит о том, что для класса нет конструктора 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. Таким образом, чтобы перехватить все ваши дальнейшие вопросы, я бы направил вас к официальный учебник.

5

Другие решения

Я нашел проблему, и теперь все работает правильно

вот ошибка: предварительно используя следующий код:

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);
2

Я читаю XML-файлы немного по-другому в QT, я читаю их и храню в отдельном объекте, так как я читаю и анализирую много 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;
1
По вопросам рекламы [email protected]