Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parsing XML with QML XmlListModel

Tags:

xml

qml

I've been having problems parsing an xml file with XmlListModel, this is the XML file

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
        <ns1:searchResponse xmlns:ns1="http://tempuri.org">
             <return xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="unnamed_struct_use_soapval[10]">
                <item>
                    <title xsi:type="xsd:string">Es Messi deportista del año en Israel</title>
                    <excerpt xsi:type="xsd:string">El grupo editorial.............</excerpt>
                    <img xsi:type="xsd:string">http://www.noticiasmvs.com/media/fotos/9edd0407a7bd0a47df3ece7869678c4a.jpg</img>
                    <url xsi:type="xsd:string">http://www.noticiasmvs.com/xmlapp/article.php?noticia_id=52872</url>
                    <pubdate xsi:type="xsd:string">miércoles 28 de diciembre de 2011, 03:01:54</pubdate>
                 </item>
                 <item>
                    <title xsi:type="xsd:string">Primera ronda de los playoffs NBA</title>
                    <excerpt xsi:type="xsd:string">Resultados de los partidos ya disputados y programa de los que restan por jugar de la primera ronda de los playoffs de la NBA</excerpt>
                    <img xsi:type="xsd:string">     http://www.noticiasmvs.com/media/fotos/7b9e23b87817132e9a1771cad7de819d.jpg</img>
                    <url xsi:type="xsd:string">http://www.noticiasmvs.com/xmlapp/article.php?noticia_id=4982</url>
                    <pubdate xsi:type="xsd:string">viernes 30 de abril de 2010, 01:27:17</pubdate>
                </item>
             </return>
         </ns1:searchResponse>
     </SOAP-ENV:Body>
 </SOAP-ENV:Envelope>

I parse it whit this XmlListModel

XmlListModel {
    query: "/SOAP-ENV/SOAP-ENV/ns1/return/item"

    id:searchParser
    XmlRole{ name: "title"; query: "title/string()"}
    XmlRole{ name: "excerpt"; query: "excerpt/string()"}
    XmlRole{ name: "img"; query: "img/string()"}
    XmlRole{ name: "url"; query: "url/string()"}
    XmlRole{ name: "pubdate"; query: "pubdate/string()"}

}

at the end it returns status ready but with no elements in the model, what am I doing wrong??

like image 780
iandamecsican Avatar asked Dec 29 '11 17:12

iandamecsican


1 Answers

Your query string is not correct: You have to write the element name including its namespace. The XPath expression should look like that:

/SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:searchResponse/return/item

To use namespaces in a query, you have to declare them as in XQuery. Here an example:

import QtQuick 1.1

Rectangle {
    XmlListModel {
        id: searchParser

        source: "data.xml"  // contains XML content
        query: "/SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:searchResponse/return/item"

        namespaceDeclarations: "declare namespace SOAP-ENV = 'http://schemas.xmlsoap.org/soap/envelope/';
                                declare namespace ns1 = 'http://tempuri.org';"

        XmlRole { name: "title";    query: "title/string()" }
        XmlRole { name: "excerpt";  query: "excerpt/string()" }
        XmlRole { name: "img";      query: "img/string()" }
        XmlRole { name: "url";      query: "url/string()" }
        XmlRole { name: "pubdate";  query: "pubdate/string()" }

        onCountChanged: console.log("count:", count)
    }
}
like image 77
hiddenbit Avatar answered Nov 20 '22 18:11

hiddenbit