Я пытаюсь прочитать в XML-файл в QT, но каждый раз, когда я делаю, QXmlSimpleReader.parse
вернет false — смотрите: QDebug ()<< «parse fail»; в нижней части descriptionfilereader учебный класс.
Почему это не удается? У меня есть XML-файл в той же папке, что и код. (Примечание. Я скопировал XML-файл в блокнот и сохранил его в формате .xml с добавлением ANSI. Мой компьютер также показывает, что файл является документом XML).
Объяснение кода: объект DescriptionFileReader создан в main, а обработчик чтения выполняется с использованием экземпляра класса анализатора.
(редактировать: я изменил XML-документ, чтобы прочитать его в более простом виде в надежде найти проблему проще)
Descriptionfilereader.cpp:
#include "descriptionfilereader.h"#include "parser.h"#include <QDebug>
#include <iostream>
#include <QXml.h>
#include <string>
#include <QXmlDefaultHandler>
using namespace std;
DescriptionFileReader::DescriptionFileReader()
{
}
DescriptionFileReader::~DescriptionFileReader()
{
}void DescriptionFileReader::Read()
{
Parser handler;
QXmlSimpleReader xmlReader; //Intialize xmlReader
xmlReader.setContentHandler(&handler);
xmlReader.setErrorHandler(&handler);
QFile xmlFile ("notes.xml");
QXmlInputSource source (&xmlFile);
//handler.start \/ this returns false
bool ok = xmlReader.parse (source);
if (!ok)
qDebug()<< "parse fail";
}
parser.cpp:
#include "parser.h"#include <stdio.h>
#include <qstring.h>
#include <qxml.h>
#include <QTextStream>
#include <iostream>
#include <QDebug>
using namespace std;
static const char TAG_ITEM[] = "description";
static const char TAG_MATERIAL[]= "Material";
static const char TAG_MOUNT[] = "Mount";
QString currElement_;bool Parser::characters(const QString& text)
{
if( currElement_ == TAG_ITEM) {}
else
{return false;}
return true;
}
bool Parser::startElement(const QString&, const QString& localName,
const QString& qName,
const QXmlAttributes& atts)
{
if( localName == TAG_ITEM)
{
qDebug()<< "It's coming";
}
else if( localName == TAG_MATERIAL ) {}
else if( localName == TAG_MOUNT ){}
else{return false;}
currElement_ = localName;
return true;
}
bool Parser::endElement( const QString&, const QString& localName, const QString& )
{
if( localName == TAG_ITEM)
{
qDebug()<< "It's gone";
}
else if( localName == TAG_MATERIAL ) {}
else if( localName == TAG_MOUNT ){}
else{return false;}
currElement_ = localName;
return true;
}
XML-документ:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
Задача ещё не решена.
Других решений пока нет …