QXmlQuery
-
Buon giorno a tutti, sono nuovo a Qt.
Ho il seguente problema, ho un file di configurazione xml diviso nel classico sezione chiave valore/ o lista di valori.
Sto provando ad usare QXmlQuery per prendere in valore/i di una sezione/chiave forniti in input ad un metodo.
Questo ed in file xml
<?xml version=“1.0” encoding=“UTF-8”?>
<logs_collector> <section name=“limits”> <data key=“MIN_MAX_LOG_LINES” type=“unsignedInteger”> <values> <value>100</value> </values> </data> <data key=“MAX_MAX_LOG_LINES” type=“unsignedInteger”> <values> <value>65536</value> </values> </data> </section>
</logs_collector>e questo è il codice che ho scritto per ottenere un determinato valore
const QVariant Configuration::getConfigValue(const QString& sectioName, const QString& keyName, const QVariant& defaultValue) const {
QVariant result(defaultValue);
QXmlQuery xmlQuery(QXmlQuery::XPath20);
const QString& queryStr = configQueryStr.arg(sectioName).arg(keyName);
QUrl url(this->xmlConfigFile); xmlQuery.setFocus(url); xmlQuery.setQuery(queryStr); if (true == xmlQuery.isValid()) { QStringList xpathResult; xmlQuery.evaluateTo(&xpathResult); // qui devo parsare il risultato per eliminare i tags xml result = xpathResult; } return result; }la QString parametrica che uso come query è la sguente
static QString configQueryStr(”‘section[@name=\”%1\”]/data[@key=\”%2\”]/values/value’”);quando passo per esempio come nome sezione limits e come key MAX_MAX_LOG_LINES
questa è la stringa che mi si compone prima di passarela a la classe QXmlQuery
‘section[@name=“limits”]/data[@key=“MAX_MAX_LOG_LINES”]/values/value’Attraverso il debugger ho visto che la
il la query è valida ma nel risultato finare invece di darmi <value>65535</value> mi ritona solo la quesry stessa.
Ho riprovato la stessa query con xmllint e funziona.
Dove sbaglio ?
Grazie a tutti -
Prova con questa funzione:
@QString Configuration::getConfigValue(const QString& sectioName, const QString& keyName, const QVariant& defaultValue)
{QVariant result(defaultValue);
QXmlQuery xmlQuery(QXmlQuery::XPath20);
QString result;const QString& queryStr = configQueryStr.arg(sectioName).arg(keyName);
QUrl url(this->xmlConfigFile);
xmlQuery.setFocus(url);
xmlQuery.setQuery(queryStr);if (true == xmlQuery.isValid())
{
QBuffer outb;
outb.open(QIODevice::ReadWrite);
QXmlSerializer serializer(xmlQuery, &outb);
xmlQuery.evaluateTo(&serializer);QXmlItem item(serializer.next());
while (!item.isNull())
{
if (item.isNode())
{
result.append(item);
}
item = result.next();
}return result;
}
return result;
} @ -
Sorry if I am answering now but a QxmlSerializer does not have a method next ... so how can QXmlItem item(serializer.next()); work if the compiler give me the relevant error ?