2010-04-21 9 views
5

J'utilise le code suivant pour charger dans un fichier XML (en fait un NZB):Comment utiliser QXmlQuery correctement? (Qt XQuery/XPath)

QXmlQuery query; 
query.bindVariable("path", QVariant(path)); 

query.setQuery("doc($path)/nzb/file/segments/segment/string()"); 
if(!query.isValid()) 
    throw QString("Invalid query."); 

QStringList segments; 
if(!query.evaluateTo(&segments)) 
    throw QString("Unable to evaluate..."); 

QString string; 
foreach(string, segments) 
    qDebug() << "String: " << string; 

Avec l'entrée suivante, il fonctionne comme prévu:

<?xml version="1.0" encoding="iso-8859-1" ?> 
<!DOCTYPE nzb PUBLIC "-//newzBin//DTD NZB 1.0//EN" "http://www.newzbin.com/DTD/nzb/nzb-1.0.dtd"> 
<nzb> 
    <file> 
     <groups> 
      <group>alt.binaries.cd.image</group> 
     </groups> 
     <segments> 
      <segment>[email protected]</segment> 
     </segments> 
    </file> 
</nzb> 

Cependant, avec l'entrée suivante, aucun résultat n'est renvoyé. Voici comment l'entrée doit être formatée, avec des attributs:

<?xml version="1.0" encoding="iso-8859-1" ?> 
<!DOCTYPE nzb PUBLIC "-//newzBin//DTD NZB 1.0//EN" "http://www.newzbin.com/DTD/nzb/nzb-1.0.dtd"> 
<nzb xmlns="http://www.newzbin.com/DTD/2003/nzb"> 
    <file poster="[email protected]" date="1225385180" subject="ubuntu-8.10-desktop-i386 - ubuntu-8.10-desktop-i386.par2 (1/1)"> 
     <groups> 
      <group>alt.binaries.cd.image</group> 
     </groups> 
     <segments> 
      <segment bytes="66196" number="1">[email protected]</segment> 
      <segment bytes="661967" number="1">[email protected]</segment> 
     </segments> 
    </file> 
</nzb> 

S'il vous plaît quelqu'un peut-il me dire ce que je fais mal?

Répondre

7

Je l'ai découvert est parce que je avais besoin de fournir un espace de noms par défaut, qui a pris des heures pour comprendre ...

La requête est maintenant:

declare default element namespace "http://www.newzbin.com/DTD/2003/nzb"; 
declare variable $path external; 
doc($path)/nzb/file/segments/segment/string() 
+0

+1 pour vous trouver au lieu de vous asseoir et d'attendre que quelqu'un vous réponde. :) Les espaces de noms constituent la source de confusion la plus fréquente pour les personnes non habituées à XML. – Tomalak

+0

Salut Tom, j'espère que je ne referai pas cette erreur :). – oscode

0

Peut-être utiliser le caractère générique d'espace de noms dans la requête?

doc($path)//*:file/*:segments/*:segment/string() 
Questions connexes