2010-04-21 7 views
5

Sto utilizzando il seguente codice per caricare un file XML (in realtà un NZB):Come si utilizza QXmlQuery correttamente? (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; 

con la seguente digitazione, funziona come previsto:

<?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> 

Tuttavia, con il seguente input non vengono restituiti risultati. Ecco come deve essere formattato l'input, con gli attributi:

<?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> 

Per favore qualcuno può dirmi cosa sto facendo male?

risposta

7

ho scoperto è perché avevo bisogno di fornire uno spazio dei nomi di default, che ha preso ore per capire ...

La query è ora:

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

+1 per scoprire se stessi invece di sedersi e aspettare che qualcuno risponda. :) I namespace sono la fonte di confusione più comune per le persone non utilizzate in XML. – Tomalak

+0

Saluti Tom, spero di non fare di nuovo questo errore :). – oscode

0

magari utilizzare il carattere jolly spazio dei nomi nella query?

doc($path)//*:file/*:segments/*:segment/string() 
Problemi correlati