XPath-Expression unter Qt4.4 nutzen

Alles rund um die Programmierung mit Qt
Antworten
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

XPath-Expression unter Qt4.4 nutzen

Beitrag von KartoffelKiffer »

Hallo,

nun endlich seit Qt4.4 gibt es auch XQuery im Angebot. Natürlich habe ich mich gleich an die Arbeit gemacht, und wollte es einmal testen.

Dazu habe ich zwei Varianten probiert, meine Daten aus dem XML zu bekommen.

1.)

Code: Alles auswählen

	QXmlQuery query;

	QByteArray byteArray;
	QBuffer buffer(&byteArray);
	buffer.open(QIODevice::WriteOnly);

			query.setQuery("doc('D:/wrk/prog/debug/pool.xml')/Pool/Connection/Target/text()");


	QXmlSerializer serializer(query, &buffer);
	query.evaluateTo(&serializer);

	QString source = QString(byteArray);

	QMessageBox::information(0, "", source);
Das XML-Dokument pool.xml beinhaltet genau zwei Elemente mit Namen Target. Diese werden direkt hintereinander in das ByteArray geschrieben und in der MessageBox ausgegeben. Die XPath-Anweisung ist also korrekt und lauffähig.

Wenn ich das ganze nun in eine StringList wandern lasse,
2.)

Code: Alles auswählen

	QXmlQuery query;

	query.setQuery("doc('D:/wrk/prog/debug/pool.xml')/Pool/Connection/Target/text()");
	if (query.isValid())
	{
		QStringList *list = new QStringList;
		
		if (query.evaluateTo(list))
		{
			for (int i = 0; i < list->size(); ++i)
			{
				QMessageBox::information(0, QString("Number %1").arg(QString::number(i)), list->at(i));
			}
		}
		else
		{
			QMessageBox::critical(0, "Error", "Could not evaluate.");
		}
	}
	else
	{
		QMessageBox::critical(0, "Error", "QPath not valid.");
	}

	QMessageBox::information(0, "", source);
läuft er in den else-Block und gibt "Could not evaluate" aus. Die Dokumentation sagt mir, dass das Progamm xs:string erwartet. Genau das steht auch in meinem XML-Dokument im "Target"-Element.

Hat jemand schon mit den neuen Funktionen Erfahrungen gesammelt und kann mir ggf. bei meinem Problem helfen?




Mfg KK
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:06, insgesamt 1-mal geändert.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

QXmlQuery:
Ich habe es stehen lassen da man ja nur text raus holen kann.

shoener waere wenn man die Domnode extraieren kann mit eine query ..
geht aber nicht oder?

dann schreibe ich eben weiter hin xsl file um an die elemente zu gelangen , mit meine,
debugger ...
http://sourceforge.net/projects/visual-xsltproc/
.........................
speack português italiano deutsch english castellà qt
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag von KartoffelKiffer »

Also in meinem Fall wäre es ideal eine StringList zu erhalten. Eine DomNode wäre zuviel des Guten. Wenn meine Query also lauten würde: "Hole mir alle Texte vom Element Target in Pool/Connection", so habe ich eine QStringList mit n Elementen und den Texten.

Einen extra compiler (wie eh schon in Qt integriert) möchte ich nicht zusätzlich nutzen.




Mfg KK
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:06, insgesamt 1-mal geändert.
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag von KartoffelKiffer »

Hallo,

ich bin das Problem noch einmal mit dem Debugger durchgegangen.

Und zwar hängt er sich in der Datei qxmlquery.cpp (src\xmlpatterns\api) in Zeile 584 bei der Überprüfung weg. Diese schlägt wohl fehl.

Der Code der Zeile(n) sieht wiefolgt aus:

Code: Alles auswählen

            if(!QPatternist::BuiltinTypes::xsString->xdtTypeMatches(expr->staticType()->itemType()))
                return false;
Dabei läuft er in das return false; und springt aus der Funtion.

Laut Dokumentation müssen die Elemente der Abfrage vom Typ xs:string sein:
"The query must evaluate to a sequence of xs:string values, and this is checked by compiling the query as if it had been passed to a function accepting xs:string*. This means that the result nodes will be converted to strings, and values that cannot be promoted to xs:string will trigger type errors."

Inhaltlich gesehen sind alle Texte vom Element "Target" Strings. Theoretisch müsste doch auch die Abfrage auf text() einen solchen zurück geben?!

Kann ich dem XQuery compiler denn noch irgendwie explizit sagen, dass es sich bei den Textelementen von Target um Strings handelt?




Mfg KK
Antworten