Как прочитать файл 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?


person McLan    schedule 24.04.2013    source источник


Ответы (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. Поэтому, чтобы перехватить все ваши дальнейшие вопросы, я бы отослал вас к официальному руководству .

person Alexander Shukaev    schedule 24.04.2013
comment
спасибо за ваш ответ, теперь он работает без синтаксической ошибки, но не читает мой xml. в токене указано, что QXmlStreamReader::Invalid(1).. Я не знаю, читает ли он xml или читает, но неправильно.. - person McLan; 24.04.2013
comment
Не могли бы вы более четко определить, с какой проблемой вы столкнулись сейчас, и соответствующим образом обновить свой вопрос, и не забудьте включить все соответствующие выходные данные. - person Alexander Shukaev; 24.04.2013
comment
Я точно знаю, как работает QXmlStreamReader, и я уже извлек фиктивный xml, используя его, и он работал нормально. если быть точным, моя проблема заключается в чтении реального xml-файла. Все, что я не могу сделать, это заменить мой фиктивный xml в QStreamReader реальным xml-файлом, вот и все.. - person McLan; 24.04.2013
comment
Еще раз открываем документацию и что делаем видеть? Мы видим, что для того, чтобы узнать, что было реальной причиной ошибки, нам нужны error() и errorString(). - person Alexander Shukaev; 24.04.2013
comment
QXmlStreamReader::errorString вернул преждевременный конец документа .. хорошая новость: теперь файл доступен для чтения, плохая новость: я не знаю, неверный ли xml (это то, что я сомнения, потому что я использовал свой mock xml, который работал до этого, и результат типичен) .. или я неправильно читаю !!!! - person McLan; 24.04.2013
comment
Очевидно, что я не могу помочь вам с этим, не видя фактического XML и того, как вы его анализируете. Одно можно сказать наверняка: либо это неправильный XML, либо вы неправильно его анализируете. Вам лучше разобраться в этом самостоятельно, так как никто лучше вас не знает XML и ваш код. Это не займет много времени, просто упростите XML и постарайтесь прочитать его без ошибок. Затем постепенно усложняйте как XML, так и алгоритм синтаксического анализа. Разработка программного обеспечения начинается с простых вещей, а затем итеративно улучшается и усложняется код. - person Alexander Shukaev; 24.04.2013
comment
PrematureEndOfDocument всегда может произойти при чтении из файла, сокета и т. д., когда данные XML доступны фрагментами. Затем нужно убедиться, что считывается больше данных (подключение к сигналам readyRead, waitForReadyRead и т. д.), и повторить попытку. Чтобы убедиться, что это не ваш файл, убедитесь, что он является допустимым XML другими способами (xmllint и т. д.) или попробуйте с помощью программы чтения QXMLStreamReader (file.readAll()). Это не лучший способ (поскольку он считывает все сразу в память), но должен помочь исключить этот источник ошибок. - person Frank Osterfeld; 24.04.2013

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

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

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

файл сначала создается в первой строке, вторая строка кода просто передает файл, поскольку он не является его содержимым xml (поскольку он еще не открыт), поэтому QXmlStreamReader::errorString возвращает < em>Преждевременный конец документа ..

решение очень простое: откройте файл "myFile" перед передачей его в QXmlStreamReader, используя следующий код:

xmlData.open(QIODevice::ReadOnly);

Теперь устройство открыто для чтения с помощью QXmlStreamReader. и окончательный код:

QFile myFile("xmlfile");
myFile.open(QIODevice::ReadOnly);
QXmlStreamReader xmlData(&myFile);
person McLan    schedule 25.04.2013

Я читаю 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;
person rreeves    schedule 24.04.2013
comment
Мое впечатление или QDomDocument в первой строке имеет тот же идентификатор, что и QFile в третьей строке, что делает этот код некомпилируемым? - person Momergil; 13.01.2015