[gelöst] Probleme mit QtXmlPatterns und Markup-Deklarationen

Alles rund um die Programmierung mit Qt
Antworten
René
Beiträge: 75
Registriert: 15. August 2006 11:14
Kontaktdaten:

[gelöst] Probleme mit QtXmlPatterns und Markup-Deklarationen

Beitrag von René »

Hallo,

ich möchte mittels dem Qt Modul QtXmlPatterns XML-Dateien verarbeiten.
Die XML Dateien selbst werden mit C# basierten Applikationen, die die XML Klassen des .NET-Framework 2.0 nutzen, erstellt.

Die XML Files enthalten folgenden Header:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE Wurzelelement SYSTEM "xyz.dtd"[]>

Die eckigen Klammern am Ende der zweiten Zeile kann ich zwar manuell löschen, nachdem das XML File aber wieder über besagte C# Applikationen gespeichert wurde, sind sie wieder da. Bei Wikipedia

http://de.wikipedia.org/wiki/Dokumentty ... eklaration

konnte ich nachlesen, dass es sich dabei um sogenannte Markup-Deklarationen handelt, die in eckigen Klammern aufgeführt werden können.

Genau hier liegt das Problem. Bei meinem Qt4 QXmlQuery Objekt schlägt die Methode setQuery() fehl, solange ich nicht diese eckigen Klammern entferne.

Was kann ich tun?
Zuletzt geändert von René am 27. März 2009 12:27, insgesamt 1-mal geändert.
René
Beiträge: 75
Registriert: 15. August 2006 11:14
Kontaktdaten:

Beitrag von René »

Ok, ich habe schon befürchtet, dass da wenig Feedback kommt.

Ich verwende Qt4.5.0 mit Visual Studio 2008 Standard Edition.
Ich habe ein ganz einfaches Beispiel:

Nehmen wir an es gbit eine XML Datei namens 'test.xml' auf c:\

Code: Alles auswählen

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE root SYSTEM "xyz.dtd"[]> 
<root>
  <node>Ich bin ein Text</node>
  <node>Ich bin noch ein Text</node>
</root>
Nehmen wir an, dass xyz.dtd eine gültige DTD ist und sich test.xml fehlerfrei dagegen validieren lässt.

Nehmen wir an es gibt folgenden Code-Ausschnitt, der die <node>-Texte extrahieren soll.

Code: Alles auswählen

QXmlQuery query;
query.setQuery("doc('c:/test.xml')/root/node/string()");

QStringList list;
query.evaluateTo(&list);
Dann löst query.evaluate(&list) eine Exception aus:

Code: Alles auswählen

First-chance exception at 0x7c812aeb in XMLTest.exe: Microsoft C++ exception: bool at memory location 0x0012acdb..
Entferne ich nun die eckigen Klammern aus dem DOCTYPE-Element, also so:

Code: Alles auswählen

<!DOCTYPE root SYSTEM "xyz.dtd">
dann wird keine Exception ausgelöst und das QStringList Objekt 'list' enthält die zwei Texte der <node> Elemente.

Ist das ein Bug in Qt4.5.0? Wie kann man so etwas möglichst elegant umgehen?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Unter Linux war hier die Ausgabe aussagekräftiger:

Code: Alles auswählen

Error FODC0002 in file:///home/franz/Programmieren/qt/Tests/forum/8756_xmlpatterns_markupdeclaration/test.xml, at line 2, column 34: Expected ' ', '<', or '%', but got ']'.
Ich hab die DOCTYPE-Zeile einfach mal geändert (ein Leerzeichen in die eckigen klammern gesetzt):

Code: Alles auswählen

<!DOCTYPE root SYSTEM "xyz.dtd"[ ]>
Und jetzt geht es hier. Bringt dich natürlich nicht wirklich weiter.
Aber vllt. kannst du in deiner C#-App so tricksen, dass ein leeres markupdeclaration eingefügt wird.
Ansonsten -> Bugreport zu der Lib, die dir einfach die Klammern reinsetzt, obwohl du keine markupdeclaration gesetzt hast...
René
Beiträge: 75
Registriert: 15. August 2006 11:14
Kontaktdaten:

Beitrag von René »

Vielen Dank für die schnelle Hilfe, franzf.

Dein Vorschlag scheint tatsächlich schon die Lösung zu sein. Wenn ich per Hand einmal ein Leerzeichen zwischen den eckigen Klammern eingefügt habe, diese XML Datei dann mit dem .NET2.0 XML-Modul lese und wieder schreibe, dann bleibt das Leerzeichen erhalten. Es wird also offensichtlich erkannt und auch wieder zurück geschrieben.

Die QXmlQuery Klasse hat nun keine Probleme mehr mit dem DOCTYPE Element. Auch bei mir funktionieren nun die XQuery-Anfragen einwandfrei.

Nochmals danke. Die Lösung ist trivial, aber ich hätte vermutlich wieder viel Zeit verloren, bis ich eventuell durch Zufall auf so etwas gekommen wäre. Nach diesem Problem lässt sich auch äußerst schlecht suchen bei Google.
Antworten