Seite 1 von 1

XQuery: in Datenstruktur importieren

Verfasst: 8. Juli 2009 10:06
von phlox81
Hallo,

ich habe ein XML Dokument was ich mittels XQuery auswerten möchte.

Dabei möchte ich einzelne Datensätze auslesen und diese in einer struktur ablegen.

Code: Alles auswählen

struct person
{
  QString name,vorname;
};
// oder auch
boost::tuple<QString,QString> person;
In den Examples für XQuerys habe ich dies schon gefunden:
http://doc.qtsoftware.com/4.5/xmlpatter ... cinfo.html

Code: Alles auswählen

QStringList times;
     QStringList directions;

     QXmlQuery query;
     query.setQuery(timesQueryUrl);
     query.evaluateTo(&times);

     query.setQuery(directionsQueryUrl);
     query.evaluateTo(&directions);

     if (times.count() != directions.count()) // something went wrong...
         return TimeInformation::List();

     TimeInformation::List information;
     for (int i = 0; i < times.count(); ++i)
         information.append(TimeInformation(times.at(i).simplified(), directions.at(i).simplified()));
Würde dies auch direkt gehen?
Oder muss ich die einzelnen daten jeweils über eine QStringList auslesen, um sie dann zu den Objekten zuverwursten?

phlox

Verfasst: 10. Juli 2009 14:27
von franzf
Ich hab selber noch nicht mit den XMLPatterns gearbeitet.
Trotzdem folgendes:
bool QXmlQuery::evaluateTo ( QAbstractXmlReceiver * callback ) const
Hört sich für mich an, als könntest du da was ableiten ;)
Es stellt sich halt die Frage ob es überhaupt geht. Du hast ja zwei verschiedene Queries, die zuerst den namen und danach den vornamen ermitteln. Danach wird geprüft ob die beiden Ergebnislisten gleich lang sind. (Wenn ich den Beispielcode auf dein Problem übertragen darf)

Ich weiß nicht in wie weit die beiden Queries zu einem zusammengefasst werden können. Wenn ja sollte doch dies deine Möglichkeit sein :)

Ansonsten kannst du auch noch mehr Code/Infos posten, damit die Sache klarer wird.

Grüße
Franz

Verfasst: 10. Juli 2009 15:13
von phlox81
Ja, auf QAbstractXMLReceivercbin ich jetzt auch gestoßen, aber frage mich, ob ich dann quasi die Logik wieder implementieren muss, damit ich jeweils die Datensätze korrekt habe.

Code gibts da bisher nicht viel, ist erstmal nur ein Gedankengang gewesen.

Verfasst: 10. Juli 2009 20:29
von franzf
phlox81 hat geschrieben:Ja, auf QAbstractXMLReceivercbin ich jetzt auch gestoßen, aber frage mich, ob ich dann quasi die Logik wieder implementieren muss, damit ich jeweils die Datensätze korrekt habe.
Qt liegt im Quelltext offen, so als kleiner Tip ;)

Schau dir an was genau hinter QXmlQuery::evaluateTo(XYZ) steckt.
Schau dir die eine "Beispielimplementierung" des QAbstractXmlReciever an (->QXmlSerializer). Da sollte es genügend Infos geben.

Ich kann dir nicht weitere Details geben, da ich das Zeug noch nie angefasst hab :P, aber vllt. ja wer anderes im Forum hier. Aber prinzipiell ist die Qt-Doku richtig gut, und alles was man wissen sollte steht da auch drin.

Grüße
Franz

Verfasst: 10. Juli 2009 21:49
von upsala
QAbstractXmlReceiver verwenden.

Bei startElement ein neues Listen-Element anlegen.
Bei attribute(...) das Listen-Element befüllen.
Bei endElement() das Listen-Element der Liste hinzufügen.

Und bei der Query was in der Art zurückgeben lassen:
<person name="" vorname="" />

Verfasst: 15. Juli 2009 16:55
von phlox81
Werd das bei Gelegenheit vielleicht noch mal aufgreifen, aber fürs erste habe ich jetzt mit XSLT eine korrekte Transformation hinbekommen.

Dafür habe ich jetzt erstmal einen kleinen XQuery Editor gebastelt.