qt4.8
  • qxmlquery
  • 2016-06-11 8 views 0 likes 
    0

    Qt4.8で次の内容を解析しようとしています。QtとXqueryを持つノード内でxmlを解析する

    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; 
    

    出力は次のとおりです:私は、次のコード使用してコンテンツを表示することができるよ

    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>"); 
    

    let $result := fn:doc($xmlString)//Result \ 
    let $title := $result//dc:title/fn:string() \ 
    return ($title) 
    
    :印刷するには

    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> 
    

    は、私が使用しようとしました

    しかし、結果は空です。

    現時点では、回避策は$resultに別のQBufferに渡して同じプロセスを適用することです。

    わかりやすかったですか?

    答えて

    0

    デフォルトの名前空間が異なるため、1回のパスで情報を取得できないようです。結果にはxmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/"が必要です。

    、これは私が使用する第二のパスである:

     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';\ 
           for $i in fn:doc($xmlString1)//node() \ 
           let $title := if (fn:compare(fn:name($i), 'dc:title')=0) \ 
               then $i/fn:string() \ 
               else()\ 
           let $id := if (fn:compare(fn:name($i), 'container')=0) \ 
               then $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; 
    
    関連する問題