Проверка Qt XML Обработка ошибок

Я пытаюсь найти решение, которое в случае, если проверка не удалась, потому что в XML-файле более одной ошибки, Qt MessageHandler (строка, столбец, описание и т. Д.) Может показать каждую ошибку в данных XML не только первое, что встречается в файле XML.

Пример:
У меня ошибка в строке: 65 (см. Рис.)

это моя ошибка

но есть также ошибки в строке: 78,83,95, но это не показывает, что показывает только первый.

Есть ли решение для этого случая? И если да, то как?

Мой код выглядит так:

  MessageHandler messageHandler;
QFile xsdfile("....xsd");
xsdfile.open(QIODevice::ReadOnly);
QXmlSchema schema;
schema.setMessageHandler(&messageHandler);
bool errorOccurred = false;
if (schema.load(&xsdfile, QUrl::fromLocalFile(xsdfile.fileName())) == false)
errorOccurred = true;
else
{
QXmlSchemaValidator xmlvalidator(schema);

QFile xmlfile("......xml");
xmlfile.open(QIODevice::ReadOnly);

if (!xmlvalidator.validate(&xmlfile, QUrl::fromLocalFile(xmlfile.fileName())))
errorOccurred = true;

xmlfile.close();
}
xsdfile.close();
if (errorOccurred) {
QString qs = messageHandler.statusMessage();
cout << "Line: " << messageHandler.line() << "\n" << "Row: " << messageHandler.column() << "\n" << "ErrorMessage: ";
std::cout << qs.toUtf8().constData() << std::endl;
return -1;
}
else {

return 0;
}

И мой класс MessageHandler выглядит так:

class MessageHandler : public QAbstractMessageHandler
{
public:
MessageHandler()
: QAbstractMessageHandler(0)
{
}

QString statusMessage() const
{
return m_description;
}

int line() const
{
return m_sourceLocation.line();
}

int column() const
{
return m_sourceLocation.column();
}

protected:
virtual void handleMessage(QtMsgType type, const QString &description,
const QUrl &identifier, const QSourceLocation &sourceLocation)
{
Q_UNUSED(type);
Q_UNUSED(identifier);

m_description = description;
m_sourceLocation = sourceLocation;
}

private:
QString m_description;
QSourceLocation m_sourceLocation;
};

Спасибо 🙂

0

Решение

Я думаю, что вам нужно написать собственный валидатор, чтобы перехватывать все ошибки. Вы можете изменить этот пример кода, чтобы перехватывать все ошибки.

struct NodeProperties
{
NodeProperties()
{
values.resize(names.size());
}
std::vector<int> values;

static QStringList names;
static QString rootName;
static QString childName;
};

QString NodeProperties::rootName = "static_route";
QString NodeProperties::childName = "molenet";
QStringList NodeProperties::names = QList<QString>() << "node_id"<< "nextHop_id"<< "sink_id"<< "delay_before_send"<< "delay_before_sleep";

QList<NodeProperties> nodesProperties;

bool parseXMLFile()
{
QXmlStreamReader xmlStreamReader;

QString xmlFile;
xmlFile = QFileDialog::getOpenFileName(this,
tr("Open XML file"), QDir::currentPath(), tr("XML (*.xml)"));

if(xmlFile.isEmpty())
return false;

QFile file(xmlFile);
if (!file.open(QFile::ReadOnly | QFile::Text))
{
QMessageBox::warning(this,tr("Error: Cannot read file ..."),
(xmlFile+"  " + file.errorString() ));
return false;
}

nodesProperties.clear();

xmlStreamReader.setDevice(&file);
xmlStreamReader.readNext();

while(!xmlStreamReader.atEnd())
{
if(xmlStreamReader.isStartElement())
{
if(xmlStreamReader.name() == NodeProperties::rootName)
xmlStreamReader.readNext();

if(xmlStreamReader.name() == NodeProperties::childName)
{
xmlStreamReader.readNext();

if(xmlStreamReader.isCharacters() )
xmlStreamReader.readNext();

if(xmlStreamReader.isStartElement())
{
NodeProperties prop;
for(int i = 0; i < NodeProperties::names.size(); ++i)
{
if(xmlStreamReader.isCharacters() )
{
xmlStreamReader.readNext();
--i;
continue;
}
if(xmlStreamReader.name() == NodeProperties::names[i])
{
prop.values[i] = xmlStreamReader.readElementText().toInt();
}
xmlStreamReader.readNext();
}
nodesProperties.push_back(prop);
}
}
}
xmlStreamReader.readNext();
}

file.close();

if (xmlStreamReader.hasError())
{
QMessageBox::warning(this,tr("Error: Failed to parse file "),
(xmlFile+"  " + xmlStreamReader.errorString() ));
nodesProperties.pop_back();
}
else if (file.error() != QFile::NoError)
{
qDebug() << "Error: Cannot read file " << qPrintable(xmlFile)
<< ": " << qPrintable(file.errorString());
}

//createGraphVizFile(xmlFile);
this->xmlFile = xmlFile;
return true;
}

XML-файл:

<?xml version="1.0"?>
<static_route>
<molenet>
<node_id> 1 </node_id>
<nextHop_id> 2 </nextHop_id>
<sink_id> 254 </sink_id>
<delay_before_send> 2 </delay_before_send>
<delay_before_sleep> 30 </delay_before_sleep>
</molenet>

<molenet>
<node_id> 2 </node_id>
<nextHop_id> 3 </nextHop_id>
<sink_id> 254 </sink_id>
<delay_before_send> 4 </delay_before_send>
<delay_before_sleep> 30 </delay_before_sleep>
</molenet>
</static_route>
0

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

Других решений пока нет …

По вопросам рекламы [email protected]