[gelöst] QXmlSchemaValidator::validate() verursacht SegFault
Verfasst: 13. September 2011 21:09
Hallo!
ich weiß ich nerve so ganz langsam... aber ich habe schon wieder ein Problem *lol*
Nachdem ich jetzt die Schemavalidierung in meinem anderen Thread zum Laufen bekommen habe wollte ich jetzt eine Methode implementieren, der ich ein QByteArray mit XML-Daten übergebe und in der Methode sollen die Daten dann gehen das Schema geprüft werden. Soweit alles super toll
Folgendes Problem tritt auf:
Ich bekomme die Daten über einen TCP-Socket als QByteArray. So wie die Daten sind schicke ich diese an die folgende Methode meiner XMLValidator-Klasse:
schema ist als Membervariable definiert. Wenn ich folgendes an die Methode schicke geht alles:
Durch Zufall habe ich aber die folgenden Daten gesendet:
Das fühert sofort in der Zeile
zu folgenden Fehler:
Erwartet hätte ich jetzt das der Validator mir lieb sagt, dass die XML-Daten falsch sind. Er hätte echt nicht gleich abstürzen müssen 
--edit--
Der stürzt übrigens auch dann ab, wenn ich ein "Hallo" als XML hinsende.
Was mache ich da bitte wieder falsch?
--edit2--
Selbst wenn ich es so mache wie in der Qt Reference Doku stürzt das dumme Ding ab! :
--edit3--
Es liegt wohl irgendwie am als Member angelegtem Schema in der Klasse. Wenn ich in der Methode selber statt des globalen 'schema' eine lokales anlege stürzt mein Programm nicht ab. Dies hier geht also:
Woran liegt das? Ich möchte das ungern so machen. Meine Idee war halt, dass ich am Anfang 1x das Schemata einlese und dann immer wieder damit arbeiten kann. Wieso muss ich davon bei jedem mal ein neues Objekt anlegen? 
ich weiß ich nerve so ganz langsam... aber ich habe schon wieder ein Problem *lol*
Nachdem ich jetzt die Schemavalidierung in meinem anderen Thread zum Laufen bekommen habe wollte ich jetzt eine Methode implementieren, der ich ein QByteArray mit XML-Daten übergebe und in der Methode sollen die Daten dann gehen das Schema geprüft werden. Soweit alles super toll
Folgendes Problem tritt auf:
Ich bekomme die Daten über einen TCP-Socket als QByteArray. So wie die Daten sind schicke ich diese an die folgende Methode meiner XMLValidator-Klasse:
Code: Alles auswählen
void XmlValidator::validate(const QByteArray xml)
{
qWarning() << "Bekommen: " << xml;
if ( schema.isValid() )
{
qWarning() << "A";
QXmlSchemaValidator validator( schema );
qWarning() << "B";
if ( validator.validate( xml ) )
{
qWarning() << "C1";
qDebug() << "Instanz ist gueltig";
} else
{
qWarning() << "C2";
qDebug() << "Instanz ist ungueltig";
}
} else
{
qWarning() << "D";
qDebug() << "Schema ist ungueltig";
}
}Code: Alles auswählen
<?xml version="1.0" encoding="UTF-8"?>
<p>Hello World</p>
Code: Alles auswählen
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<p>Hello World</p>
Code: Alles auswählen
validator.validate( xml ) Code: Alles auswählen
Bekommen: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<p>Hello World</p>
"
A
B
ASSERT failure in QMutexLocker: "QMutex pointer is misaligned", file ..\..\include\QtCore/../../../../../../ndk_buildrepos/qt-desktop/src/corelib/thread/qmutex.h, line 100
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
--edit--
Der stürzt übrigens auch dann ab, wenn ich ein "Hallo" als XML hinsende.
Was mache ich da bitte wieder falsch?
--edit2--
Selbst wenn ich es so mache wie in der Qt Reference Doku stürzt das dumme Ding ab! :
Code: Alles auswählen
void XmlValidator::validate(QByteArray xml)
{
QByteArray data("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
"<test></test>");
QBuffer buffer(&data);
buffer.open(QIODevice::ReadOnly);
if ( schema.isValid() )
{
qWarning() << "A";
QXmlSchemaValidator validator( schema );
qWarning() << "B";
if ( validator.validate( &buffer ) )
...
Es liegt wohl irgendwie am als Member angelegtem Schema in der Klasse. Wenn ich in der Methode selber statt des globalen 'schema' eine lokales anlege stürzt mein Programm nicht ab. Dies hier geht also:
Code: Alles auswählen
void XmlValidator::validate(QByteArray xml)
{
QXmlSchema tmp_schema;
file.reset();
if (tmp_schema.load( &file, QUrl::fromLocalFile(file.fileName()) ))
{
file.reset();
// Temp. Laden erfolgreich. Jetzt richtig
tmp_schema.load(&file, QUrl::fromLocalFile(file.fileName()));
}
if ( tmp_schema.isValid() )
{
qWarning() << "A";
QXmlSchemaValidator validator( tmp_schema );
qWarning() << "B";
if ( validator.validate( xml ) )
...