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