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><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></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
Post a Comment