qt4.8 - parsing xml inside a node with Qt and Xquery -


i'm trying parse following content qt4.8.

qstring l_dynamicresult("<?xml version=\"1.0\"?>\                   <u:browseresponse xmlns:u=\"urn:schemas-upnp-org:service:contentdirectory:1\">\                   <result>&lt;didl-lite xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/didl-lite/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:sec=&quot;http://www.sec.co.kr/&quot; xmlns:dlna=&quot;urn:schemas-dlna-org:metadata-1-0/&quot;&gt;&lt;container id=&quot;0/1&quot; parentid=&quot;0&quot; restricted=&quot;1&quot;&gt;&lt;dc:title&gt;fichiers&lt;/dc:title&gt;&lt;upnp:class&gt;object.container.storagefolder&lt;/upnp:class&gt;&lt;/container&gt;&lt;container id=&quot;0/0&quot; parentid=&quot;0&quot; restricted=&quot;1&quot;&gt;&lt;dc:title&gt;tv&lt;/dc:title&gt;&lt;upnp:class&gt;object.container.storagefolder&lt;/upnp:class&gt;&lt;/container&gt;&lt;container id=&quot;0/5&quot; parentid=&quot;0&quot; restricted=&quot;1&quot;&gt;&lt;dc:title&gt;flux rss&lt;/dc:title&gt;&lt;upnp:class&gt;object.container.storagefolder&lt;/upnp:class&gt;&lt;/container&gt;&lt;/didl-lite&gt;</result>\                   <numberreturned>3</numberreturned>\                   <totalmatches>3</totalmatches>\                   <updateid>0</updateid>\                    </u:browseresponse>"); 

i'm able display content using following code:

qbytearray l_array; qbuffer l_buffer(&l_array); l_buffer.setdata(l_dynamicresult.toutf8()); l_buffer.open(qiodevice::readonly); l_info = "declare namespace xs='http://www.w3.org/2001/xmlschema';\          declare namespace fn='http://www.w3.org/2005/xpath-functions';\       declare namespace dc='http://purl.org/dc/elements/1.1';\ let $result := fn:doc($xmlstring)//result/fn:string()  \ return ($result )                     "; qstringlist l_cdscontent; l_q.bindvariable("xmlstring", &l_buffer); l_q.setquery(l_info); l_res = l_q.evaluateto(&l_cdscontent); log("query res=")<<(l_res ?"ok":"error"); qdebug()<<"l_cdscontent="<<l_cdscontent; 

the output is:

l_cdscontent=<didl-lite xmlns="urn:schemas-upnp-org:metadata-1-0/didl-lite/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:sec="http://www.sec.co.kr/" xmlns:dlna="urn:schemas-dlna-org:metadata-1-0/"><container id="0/1" parentid="0" restricted="1"><dc:title>fichiers</dc:title><upnp:class>object.container.storagefolder</upnp:class></container><container id="0/0" parentid="0" restricted="1"><dc:title>tv</dc:title><upnp:class>object.container.storagefolder</upnp:class></container><container id="0/5" parentid="0" restricted="1"><dc:title>flux rss</dc:title><upnp:class>object.container.storagefolder</upnp:class></container></didl-lite> 

to print , tried use:

 let $result := fn:doc($xmlstring)//result \  let $title := $result//dc:title/fn:string()  \  return ($title )    

but result empty.

for now, workaround $result pass qbuffer apply same process.

did miss obvious ?

it seems not possible info in 1 pass because default namespaces different: result requires xmlns="urn:schemas-upnp-org:metadata-1-0/didl-lite/".

for information, second pass use:

        qbytearray l_array1;         qbuffer l_buffer1(&l_array1);         qstring l_xml(l_cdscontent.at(0));         l_buffer1.setdata(l_xml.toutf8());         l_buffer1.open(qiodevice::readonly);         l_info = "declare default element namespace 'urn:schemas-upnp-org:metadata-1-0/didl-lite' ;\             declare namespace fn='http://www.w3.org/2005/xpath-functions';\               declare namespace dc='http://purl.org/dc/elements/1.1';\               declare namespace upnp='urn:schemas-upnp-org:metadata-1-0/upnp';\               declare namespace sec='http://www.sec.co.kr';\               declare namespace dlna='urn:schemas-dlna-org:metadata-1-0';\               $i in fn:doc($xmlstring1)//node() \                 let $title := if (fn:compare(fn:name($i ), 'dc:title')=0) \                               $i/fn:string() \                               else ()\                 let $id := if (fn:compare(fn:name($i ), 'container')=0) \                               $i/@id/fn:string() \                             else () \              return ($id, $title)\               ";         qxmlquery l_q1;         l_q1.bindvariable("xmlstring1", &l_buffer1);         l_q1.setquery(l_info);         qstringlist l_result;         l_res = l_q1.evaluateto(&l_result);         log("query res=")<<(l_res ?"ok":"error");         qdebug()<<"l_result="<<l_result; 

Comments

Popular posts from this blog

wordpress - (T_ENDFOREACH) php error -

Export Excel workseet into txt file using vba - (text and numbers with formulas) -

Using django-mptt to get only the categories that have items -