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?
[gelöst] Probleme mit QtXmlPatterns und Markup-Deklarationen
[gelöst] Probleme mit QtXmlPatterns und Markup-Deklarationen
Zuletzt geändert von René am 27. März 2009 12:27, insgesamt 1-mal geändert.
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:\
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.
Dann löst query.evaluate(&list) eine Exception aus:
Entferne ich nun die eckigen Klammern aus dem DOCTYPE-Element, also so:
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?
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 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);
Code: Alles auswählen
First-chance exception at 0x7c812aeb in XMLTest.exe: Microsoft C++ exception: bool at memory location 0x0012acdb..Code: Alles auswählen
<!DOCTYPE root SYSTEM "xyz.dtd">
Ist das ein Bug in Qt4.5.0? Wie kann man so etwas möglichst elegant umgehen?
Unter Linux war hier die Ausgabe aussagekräftiger:
Ich hab die DOCTYPE-Zeile einfach mal geändert (ein Leerzeichen in die eckigen klammern gesetzt):
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...
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 ']'.Code: Alles auswählen
<!DOCTYPE root SYSTEM "xyz.dtd"[ ]>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...
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.
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.