ich habe bei der Abfrage eines XML Files ein sehr komisches Problem. Ich mache erst einen ersten Query auf mein File und hole mir alle profile knoten nach QXmlResultItems. Diese Arbeite ich innerhalb einer while Schleife ab und führe da nochmals Querys durch um die Werte innerhalb des Knotens abzufragen. Hier meine Methode:
Code: Alles auswählen
Reciepe* ReciepeBuilder::getItem( void )
{
QFileInfo fileInfo = this->lFiles.at(this->nIndex);
QXmlResultItems result;
QXmlQuery query;
QMap<QString, ReciepeItem*> ProfileMap;
if (!fileInfo.isFile())
return NULL;
else {
// Lade das XML File in einen String um es zu parsen
QFile source;
source.setFileName(fileInfo.absoluteFilePath());
if (!source.open(QIODevice::ReadOnly)) {
qWarning("Unable to open file");
return NULL;
}
else {
// Erst holen wir uns die Metadaten aus dem Rezept
query.bindVariable("inputDocument", &source);
query.setQuery("declare default element namespace 'http://www.example.org/recipe'; doc($inputDocument)//recipe/profile");
// Prüfe den Query
if (query.isValid()) {
query.evaluateTo(&result);
QXmlItem item(result.next());
while (!item.isNull()) {
// Erstellungsdaten für eine Schicht
QString cName; // Name des Profils
short nid; // ID
double d_height; // Höhe der Schicht in um
double d_weight;
double d_warn; // Warngrenze
double d_info; // Alarmgrenze
// Query Objekte
QXmlQuery tmpQuery;
QXmlResultItems tmpResult;
QXmlItem tmp;
// Hier erfolgt die Bindung des Items an den Query
tmpQuery.bindVariable("profileNode", item);
// Führe den ersten Query aus um den Namen der Schicht zu erhalten
tmpQuery.setQuery("declare default element namespace 'http://www.example.org/recipe'; $profileNode/@name/string()");
tmpQuery.evaluateTo(&tmpResult);
tmp = tmpResult.next();
// Wenn es ein Atomic Value gibt, schreibe in in cName
if (tmp.isAtomicValue())
cName = QString(tmp.toAtomicValue().toString());
// Hier holen wir uns die ID der Schicht
tmpQuery.setQuery("declare default element namespace 'http://www.example.org/recipe'; $profileNode/@id/string()");
tmpQuery.evaluateTo(&tmpResult);
tmp = tmpResult.next();
if (tmp.isAtomicValue())
nid = (short)tmp.toAtomicValue().toUInt();
// Hier wird die Schichthöhe gesucht
tmpQuery.setQuery("declare default element namespace 'http://www.example.org/recipe'; xs:double($profileNode/height/string())");
tmpQuery.evaluateTo(&tmpResult);
tmp = tmpResult.next();
if (tmp.isAtomicValue()) {
qDebug() << "Höhe: " << tmp.toAtomicValue().toDouble();
}
if (tmp.isNode()) {
qDebug() << "Node detected";
}
if (tmp.isNull()) {
qDebug() << "Is Null";
}
// DEBUGGING
qDebug() << "Schicht:" << cName << " ID:" << nid << "Höhe:" << d_height;
item = result.next();
}
}
}
}
}
Code: Alles auswählen
tmpQuery.setQuery("declare default element namespace 'http://www.example.org/recipe'; xs:double($profileNode/height/string())");
Bin echt am verzweifeln und hoffe das mir einer von euch weiterhelfen kann.