2010-04-21 10 views
5

Używam następujący kod do załadowania w pliku XML (faktycznie NZB):Jak poprawnie używać QXMLQuery? (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; 

za pomocą następującego kodu, to działa zgodnie z oczekiwaniami:

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

Jednak z następującymi danymi wejściowymi nie są zwracane żadne wyniki. W ten sposób dane wejściowe powinny być sformatowane, z atrybutami:

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

Czy ktoś może mi powiedzieć, co robię źle?

Odpowiedz

7

odkryłem, że to dlatego, że muszę dostarczyć domyślnej przestrzeni nazw, które miały godzin, aby dowiedzieć ...

Kwerenda jest teraz:

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

+1 za znalezienie się zamiast siedzenia i czekanie, aż ktoś odpowie. :) Przestrzenie nazw są najczęstszym źródłem nieporozumień dla osób nieużywających XML. – Tomalak

+0

Pozdrawiam Toma, mam nadzieję, że już nie popełnię tego błędu :). – oscode

0

Może używać przestrzeni nazw wieloznacznych w kwerendzie?

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