2010-04-21 9 views
5

estoy usando el siguiente código para cargar en un archivo XML (en realidad un NZB):¿Cómo uso QXmlQuery correctamente? (XQuery/XPath Qt)

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; 

mediante la siguiente entrada, funciona como se esperaba:

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

Sin embargo, con la siguiente entrada no se devuelven resultados. Esta es la forma en la entrada debe tener el formato, con atributos:

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

Por favor alguien puede decirme lo que estoy haciendo mal?

Respuesta

7

he descubierto que es porque tenía que suministrar un espacio de nombres predeterminado, que tomó horas para averiguar ...

La consulta es ahora:

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

+1 para averiguar usted mismo en lugar de sentarse y esperar a que alguien responda. :) Los espacios de nombres son la fuente de confusión más común para las personas que no usan XML. – Tomalak

+0

¡Saludos, Tom, espero no volver a cometer este error :). – oscode

0

uso pueden ser el comodín espacio de nombres en la consulta?

doc($path)//*:file/*:segments/*:segment/string() 
Cuestiones relacionadas