QXmlSchema kann kein Schema laden warum?

Alles rund um die Programmierung mit Qt
Antworten
BamDenied
Beiträge: 21
Registriert: 6. September 2011 10:54

QXmlSchema kann kein Schema laden warum?

Beitrag von BamDenied »

Hallo zusammen,

ich möchte mit Hilfe von QXmlSchema eine XML-Datei validieren.
Dazu habe ich folgenden Code geschrieben:

Code: Alles auswählen

    QUrl xsd("file:///C:/Users/mbrings/Documents/Visual Studio 2008/Projects/WMS/Debug/wmtsGetCapabilities_response.xsd");
    QXmlSchema schema;

    if (schema.load(xsd)==true)
    {
         QXmlSchemaValidator validator(schema);
         if (validator.validate(&file, QUrl::fromLocalFile(file.fileName())))
         {
             valid = true;
         }

         else
         {
            valid = false;             
         }

    } 
    else 
    {
        valid = false;
    }
Beim Debuggen fällt auf, dass

Code: Alles auswählen

schema.load(xsd)==true
nie eintrifft.
Wisst ihr warum er scheinbar mein .xds File nicht laden kann?
Die xds-Datei ist auf jeden Fall in korrekter Syntax.
Vielen Dank für eure Hilfe.
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: QXmlSchema kann kein Schema laden warum?

Beitrag von brax »

Ich könnte mir vorstellen, dass das Problem daran liegt, dass Du eine lokale Datei laden möchtest. Versuch mal load mit dem IODevice zu benutzen:

Code: Alles auswählen

QFile file("C:/Users/mbrings/Documents/Visual Studio 2008/Projects/WMS/Debug/wmtsGetCapabilities_response.xsd");
file.open(QIODevice::ReadOnly);

    QXmlSchema schema;

    if (schema.load(&file, QUrl::fromLocalFile(file.fileName()))==true)
    {
         QXmlSchemaValidator validator(schema);
         if (validator.validate(&file, QUrl::fromLocalFile(file.fileName())))
         {
             valid = true;
         }

         else
         {
            valid = false;             
         }

    }
    else
    {
        valid = false;
    }
BamDenied
Beiträge: 21
Registriert: 6. September 2011 10:54

Re: QXmlSchema kann kein Schema laden warum?

Beitrag von BamDenied »

Vielen Dank für die schnelle Antwort.

Leider war es das nicht.

Code: Alles auswählen

if (schema.load(&file, QUrl::fromLocalFile(file.fileName()))==true)
Das Ergebnis ist immer noch false obwohl ein gültiges Schema in der Datei steht.
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: QXmlSchema kann kein Schema laden warum?

Beitrag von brax »

Nun ja, ohne das Schema zu sehen, dass Du laden willst ist es schwer, hier weiter zu machen. Ja, ich weiß, Du hast geschrieben, dass Du Dir sicher bist, dass das Schema OK ist. Wie wäre es, wenn Du es mal gegen http://w3.org/2001/XMLSchema.xsd validierst, bzw. erstmal versuchst das zu laden?
BamDenied
Beiträge: 21
Registriert: 6. September 2011 10:54

Re: QXmlSchema kann kein Schema laden warum?

Beitrag von BamDenied »

Ich habe es mit deinem Schema mal versucht http://w3.org/2001/XMLSchema.xsd.
Ich habe auch andere Schemas aus dem Netzt versucht aber bei keinem ist das Ergebnis von Schema.load() true.
Mir ist der gedanke gekommen, dass das der Pfad des QFiles nicht richtig gefunden wird.

Code: Alles auswählen

QFile xsd("C:/Users/mbrings/Desktop/wmtsGetCapabilities_response.xsd");
Doch die Abfrage

Code: Alles auswählen

if(xsd.exists())
zeigt, dass er das File auch findet.

Habt ihr vielleicht noch Ideen woran es liegen könnte?
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: QXmlSchema kann kein Schema laden warum?

Beitrag von brax »

Eine echte Idee, woran es liegen könnte habe ich leider nicht. Ich hab jetzt mal einen Minimaltest gemacht (ich benutze für XML Sachen Xerces und Xalan) und das Laden von direkt aus dem Netz hat nicht funktioniert (allerdings gab es da auch eine Fehlermeldung auf der Konsole. Kommt da bei Dir irgendwas?).

Darum habe ich die http://w3.org/2001/XMLSchema.xsd runtergeladen und lokal nochmal versucht (was ja eigentlich eh das ist, was Du machen möchtest) und siehe da - es klappt!

Hier mein Code:

Code: Alles auswählen

#include <QFile>
#include <QXmlSchema>
#include <QApplication>
int main(int argc, char** argv) {
	QApplication app(argc,argv);
	QXmlSchema schema;
	QFile file("P:/playground/foo/XMLSchema.xsd");
	file.open(QIODevice::ReadOnly);
	bool success = schema.load(&file, QUrl::fromLocalFile(file.fileName()));
	return 0;
}
"success" ist am Ende true. Mir ist aber aufgefallen (und jetzt weiß ich auch wieder, warum wir für die Validierung nicht Qt benutzt haben), dass es unglaublich lange dauert, bis das Schema geladen ist. Xerces ist da deutlich schneller.

Hast Du es mit der w3.org Datei schonmal lokal versucht?
BamDenied
Beiträge: 21
Registriert: 6. September 2011 10:54

Re: QXmlSchema kann kein Schema laden warum?

Beitrag von BamDenied »

Vielen Dank für deine Hilfe.

Ich habe das Problem lokalisieren können.
Und zwar liegt es wirklich an den xsd files.
Der Validator scheint mir recht pingelig zu sein.
Wenn ich dieses http://w3.org/2001/XMLSchema.xsd .xsd file laden möchte ist das bei mir nicht möglich,
da beispielsweise in Zeile 61 in dem Text ein <schema> tag verwendet wir und er dies als "Opening and ending tag mismatch" Fehler erkennt.

Bei dir hat die Datei doch problemlos funktioniert oder musstest du die Datei auch erst anpassen?
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: QXmlSchema kann kein Schema laden warum?

Beitrag von brax »

Nein, ich musste die Datei nicht anpassen. Da es das offizielle w3-Schema für XML-Schema ist (quasi die "Mutter aller Schemas" ;) ) würde es mich auch eigentlich sehr wundern, wenn dort Fehler drin wären. Wie gesagt, ich habe die Datei heruntergeladen, und QXmlSchema hat sie direkt erfolgreich laden können.

In Zeile 61 steht auch in der Datei, die ich runtergeladen habe:

Code: Alles auswählen

<!ATTLIST xs:enumeration id ID #IMPLIED>
Es ist also noch innerhalb der dtd-Definition.

Und alle Tags im Element-Content sind korrekt codiert (über die XML Entities < bzw. >)
BamDenied
Beiträge: 21
Registriert: 6. September 2011 10:54

Re: QXmlSchema kann kein Schema laden warum?

Beitrag von BamDenied »

Okay ich hab auch diese Problem Herausgefunden.
Bei mir ist es so, dass die xds Datei imports auf andere Dateien via URL macht.
Da sich mein System hinter einem Proxy befindet scheinen diese imports nicht zu funktionieren und das Schema nicht geladen zu werden.
Jetzt muss ich entweder gucken das ich durch den Proxy komme oder die Dateien Lokal bereitstelle.

Problem bei Variante eins ist, dass es anscheinend sehr lange dauert(so lange das ich die Geduld verloren habe und es abgebrochen habe).
Problem bei Variante zwei ist, dass die imports und includes sich bestimmt durch 30 Dateien hindurch hangeln.

Tja ist doch alles mumpitz!
BamDenied
Beiträge: 21
Registriert: 6. September 2011 10:54

Re: QXmlSchema kann kein Schema laden warum?

Beitrag von BamDenied »

Könntest du den gefallen tun und die folgende xds Datei laden und mir zu sagen ob es funktioniert hat und wie lange es ungefähr gedauert hat?
http://schemas.opengis.net/wmts/1.0/wmt ... sponse.xsd

Würde mir echt weiter helfen :wink:
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: QXmlSchema kann kein Schema laden warum?

Beitrag von brax »

Nichts einfacher als das...

Ich hab meinen Code etwas abgeändert:

Code: Alles auswählen

#include <QFile>
#include <QXmlSchema>
#include <QApplication>
#include <QDateTime>
#include <iostream>
int main(int argc, char** argv) {
	QApplication app(argc,argv);
	QXmlSchema schema;
	QFile file("P:/playground/foo/wmtsGetCapabilities_response.xsd");
	file.open(QIODevice::ReadOnly);
	QDateTime d = QDateTime::currentDateTime();
	bool success = schema.load(&file, QUrl::fromLocalFile(file.fileName()));
	QDateTime d2 = QDateTime::currentDateTime();
	std::cout << (d2.toTime_t() - d.toTime_t()) << std::endl;
	std::cout << success << std::endl;
	return 0;
}
Die Ausgabe dazu:
33
1
Press any key to continue . . .
Die Zeitmessung über QDateTime ist natürlich nicht 100%-ig, aber ein ganz guter Anhaltspunkt. Das ganze ist im Visual Studio 2008 mit Release-Konfiguration (Optimization /O2) und Qt 4.8.2 kompiliert. 30 Sekunden finde ich schon haarig.
BamDenied
Beiträge: 21
Registriert: 6. September 2011 10:54

Re: QXmlSchema kann kein Schema laden warum?

Beitrag von BamDenied »

Hmm das ist natürlich wirklich etwas haarig, da gebe ich dir recht.
Dann muss ich mir wohl was anderes überlegen.

Nun gut ich danke dir für die super Unterstützung hat mir wirklich viel geholfen. :wink:
Antworten