Ok
Hier die Klasse:
Code: Alles auswählen
#include <QtXmlPatterns/QXmlSchema>
#include <QAbstractMessageHandler>
#include <QFile>
#include <QDebug>
#include <QMessageBox>
#include <QString>
#include <QWidget>
#include <QUrl>
#include <QFileInfo>
#include <QDateTime>
#include "xmlvalidator.h"
XmlValidator::XmlValidator(QObject *parent)
{
modificationDate.setMSecsSinceEpoch(0);
xsdFile = "";
}
void XmlValidator::importXsdFile(QString filename)
{
QFile file;
MessageHandler messageHandler;
if ( QFileInfo(xsdFile).canonicalFilePath() == QFileInfo(filename).canonicalFilePath() )
{
file.setFileName(QFileInfo(xsdFile).canonicalFilePath());
}
else
{
file.setFileName(QFileInfo(filename).canonicalFilePath());
}
// Datei oeffnen
file.open(QIODevice::ReadOnly | QIODevice::Text);
// Wenn die Datei nicht existiert bzw. nicht lesbar ist abbrechen
if (!file.isReadable())
{
emit onXsdFileReadError(QFileInfo(file).canonicalFilePath());
file.close();
}
else
{
// Temporaeres Schema damit das eventuell vorhandene
// nicht ueberschrieben wird
QXmlSchema tmp_schema;
tmp_schema.setMessageHandler(&messageHandler);
if (tmp_schema.load( &file, QUrl::fromLocalFile(file.fileName()) ))
{
// Temp. Laden erfolgreich. Jetzt richtig
schema.load(&file, QUrl::fromLocalFile(file.fileName()));
modificationDate = QFileInfo(file).lastModified();
xsdFile = QFileInfo(file).canonicalFilePath();
schemaText = QString::fromUtf8(file.readAll());
emit onXsdFileImported(QFileInfo(file).canonicalFilePath());
file.close();
}
else
{
emit onXsdFileInvalid(QFileInfo(file).canonicalFilePath(), messageHandler.getStatusMessage(), messageHandler.getLine(), messageHandler.getColumn());
file.close();
}
}
}
Die dazu gehörende Header-Datei
Code: Alles auswählen
#include <QMainwindow>
#include <QObject>
#include <QFile>
#include <QFileInfo>
#include <QAbstractMessageHandler>
#include <QDateTime>
#include <QtXmlPatterns/QXmlSchema>
class XmlValidator : public QWidget
{
Q_OBJECT
public:
explicit XmlValidator(QObject *parent = 0);
void importXsdFile(QString);
private:
QString xsdFile;
QXmlSchema schema;
QString schemaText;
QDateTime modificationDate;
signals:
void onXsdFileInvalid(QString, QString, int, int);
void onXsdFileReadError(QString);
void onXsdFileImported(QString);
public slots:
};
Die MessageHandler Klasse habe ich einfach einmal weggelassen. Die fängt nur die Fehlermeldungen zur Weitergabe an das MainWindow ab.
--edit--
habe hinter dem schemaText=.... noch die folgende Zeile hinzugefuegt. Aber die Ausgabe ist auch nicht so wie ich es mir denke:
Code: Alles auswählen
qWarning() << "Bytes: " << QFileInfo(file).size() << " Inhalt: " << schemaText;
Ergibt auf der Konsole:
Kein Inhalt des Schemas?!
--edit2--
Das Schema ist zumindest laut w3.org validator super:
Code: Alles auswählen
Schema validating with XSV 3.1-1 of 2007/12/11 16:20:05
Target: [standalone schema assessment]
(Real name: helloWorld.xsd)schemaDocs: file:/usr/local/XSV/xsvlog/tmpmdllWxuploaded
The schema(s) used for schema-validation had no errors
The target was not assessed
--edit3--
Scheinbar darf man auf ein Qfile nur ein einziges mal load() ausführen.
Bei folgenden Beispiel ist das zweite tmp_schema.load() FALSE:
Code: Alles auswählen
QXmlSchema tmp_schema;
if (tmp_schema.load( &file, QUrl::fromLocalFile(file.fileName())))
qWarning("GUELTIG tmp");
if (!schema.load( &file, QUrl::fromLocalFile(file.fileName())))
qWarning"UNGUELTIG!");
Nehme ich die erste if-Abfrage raus ist das zweite load gültig! Verstehe ich nicht O.O