2013-10-09 55 views
1

我已经得到了,并在JavaScript(qml)中的XML字符串。我的目标是过滤关于不同线路的信息。我想要一个包含行名称(属性)的对象,尤其是倒计数。对于一个线路名称,有departures_count *倒计时字段。我希望所有这些(在当前情况下是2)数组中的倒数值。最终目标是将整行加载到以下格式的ListModel中:line(name, countdown(1,2,..x))用qml读取多个XML属性

最大的问题是访问属性。在qml中,不支持DOM树的标准函数:“对象没有getAttribute()”等其他函数,就像getElementByTagName()一样。有了XmlListModel,我可以访问属性,但只有一个。在其他情况下,它返回未知数(根据我的发现,qt中存在一个错误)。

我已经尝试过纯XmlListModel,但没有运气(请参阅:Parse XmlHttpRequest to XmlListModel) - 那里不支持多个条目。因此,我试图找到一个workarround:

要处理的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<ft> 
    <response> 
    <client device="" appName="" clientId="123" appVersion=""/> 
    <responseType>api_get_monitor</responseType> 
    <responseTime>2011-05-31 14:41:13</responseTime> 
    <monitor id="36469" clientexpiration=""> 
     <lines count="24"> 
     <line name="U1" type="ptMetro" towards="Leopoldau" direction="H" platform="U1_H" barrierFree="1" realtimeSupported="1"> 
      <departures count="2"> 
      <departure> 
       <departureTime delay="" countdown="3"/> 
      </departure> 
      <departure> 
       <departureTime delay="" countdown="6"/> 
      </departure> 
      <firstDeparture> 
       <departureTime delay="" countdown=""/> 
      </firstDeparture> 
      <lastDeparture> 
       <departureTime delay="" countdown=""/> 
      </lastDeparture> 
      </departures> 
     </line> 
     </lines> 
    </monitor> 
    <trafficInfos/> 
    <message messageCode="1">ok</message> 
    </response> 
</ft> 

1攀登对象XML树

随着

function getElementsByTagName(rootElement, tagName) { 
     var childNodes = rootElement.childNodes; 
     var elements = []; 
     for(var i = 0; i < childNodes.length; i++) { 
      if(childNodes[i].tagName === tagName) { 
       elements.push(childNodes[i]); 
      } 
     } 
     return elements; 
    } 

我能挖得到元素排成整个xml树。

attributeInterface.xml = depatures[0]; 
attributeInterface.query = "/" 
attributeInterface.roles.name = "countdown"; 
attributeInterface.roles.query = "@countdown/string()"; 

以及与此:

XmlListModel { 
    id: attributeInterface 

    onStatusChanged: { 
     for (var i = 0; i < count; i++) { 
      console.debug({"countdown": parseFloat(get(i).countdown) }); 
     }}} 

我试图让属性出来。但问题在于,赋值是无效的,因为xml元素是对象(DOM?但是这种方法不存在),而不是文本。

2正则表达式

所以我最后一个打赌就是使用正则表达式。有没有办法获得所有倒计时值?这是我最好的尝试,但它在某种程度上只是得到一个值(我试过+末找到所有的倒计时,但它wouldnt工作。/delay\=\"\d*\".countdown\=\"(\d*)\"+/

for(var i = 0; i<5; i++) console.debug(found[i]);是我如何找回比赛。第二次迭代,所以找到[1]给了我1个正确的倒计时,但是如何扩展这个概念才能获得所有的倒计时?

回答

1

经过搜索并玩了2天后,我明白了,我希望这不会再打扰任何人了 我找到2种可能的方式:

1 loopy loop

或向上DomTree(组织中的数字1)。问题):

http://doc.qt.digia.com/qt-maemo/qdeclarativeglobalobject.html

这方面是我一直在寻找的全部时间。它被记录为不合格(就像我发现的有关qml/qt的所有内容),但有一个属性需要读取属性字段:attributes(注意链接中的拼写错误)。它是属性的数组,因此attributes [1] .name是第二个att的名称。

此后我只需要一个简单的方法来爬上树,这是在组织描述。题。

2 XmlListModels

既然有depature计数,可以获取所有这些计数,然后莫名其妙地拨弄一起倒计时(所有在列表中)和相应的线(与info多少计数行)。

这现在只是2号,因为如果你没有提示每个节点有多少属性,这是行不通的。订单将会丢失。

XmlListModel { 
    id: lineXmlModel 
    query: "/ft/response/monitor/lines/line" 

    onStatusChanged: { 
     if (status === 1) { 
      console.debug("lineModel has: "+count+" items"); 
      for (var i = 0; i < count; i++) { 
       lineListModel.append({"line": get(i).line});// , "depaturesCount": parseFloat(get(i).depaturesCount) }); 
      } 
     } 
    } 

    // name = variable name, query fetches the data with XPATH 
    XmlRole { name: "line"; query: "@name/string()" } 

} // xmlModel 



XmlListModel { 
    id: depatureCountXmlModel 
    query: "/ft/response/monitor/lines/line/departures" 

    onStatusChanged: { 
     if (status === 1) { 
      console.debug("departureCountModel has: "+count+" items"); 
      for (var i = 0; i < count; i++) { 
       lineListModel.append({"line": get(i).line, "depatureCount": parseFloat(get(i).depaturesCount) }); 
      } 
     } 
    } 

    XmlRole { name: "depatureCount"; query: "@count/number()" } 

} // xmlModel 



XmlListModel { 
    id: countdownXmlModel 
    query: "/ft/response/monitor/lines/line/departures/departure/departureTime" 

    onStatusChanged: { 
     if (status === 1 && lineXmlModel.status === 1 && depatureCountXmlModel.status === 1) { 
      console.debug("CountdownModel has: "+count+" items"); 
      for (var i = 0; i < lineXmlModel.count; i++) { 
       console.debug("Line: "+ lineXmlModel.get(i).name + " number of depatures "+ depatureCountXmlModel.get(i).depatureCount); 
       // console.debug("countdown "+ parseFloat(get(i).countdown)); 
       // lineListModel.append({"countdown": parseFloat(get(i).countdown) }); 
      } 
     } 
    } 

    XmlRole { name: "countdown"; query: "@countdown/number()" } 
} 
0

嗨,我不知道这是否能解决您的问题。但是我有类似的问题,并且像这样解决了它(与你的问题有关)。 `

import QtQuick 2.0 
import QtQuick.XmlListModel 2.0 


ListView 
{ 
    width: 300; 
    height: 400; 

    spacing: 10 

    model: XmlListModel 
    { 
    xml: '<?xml version="1.0" encoding="UTF-8"?> 
<ft> 
    <response> 
    <client device="" appName="" clientId="123" appVersion=""/> 
    <responseType>api_get_monitor</responseType> 
    <responseTime>2011-05-31 14:41:13</responseTime> 
    <monitor id="36469" clientexpiration=""> 
     <lines count="24"> 
    <line name="U1" type="ptMetro" towards="Leopoldau" direction="H" platform="U1_H" barrierFree="1" realtimeSupported="1"> 
     <departures count="2"> 
     <departure> 
      <departureTime delay="1" countdown="3"/> 
     </departure> 
     <departure> 
      <departureTime delay="2" countdown="6"/> 
     </departure> 
     <firstDeparture> 
      <departureTime delay="3" countdown="99"/> 
     </firstDeparture> 
     <lastDeparture> 
      <departureTime delay="4" countdown="98"/> 
     </lastDeparture> 
     </departures> 
    </line> 
     </lines> 
    </monitor> 
    <trafficInfos/> 
    <message messageCode="1">ok</message> 
    </response> 
</ft>'; 

    query:"/ft/response/monitor/lines/line/departures/departure" 

    XmlRole { name:"delay" ; query: "departureTime/@delay/number()" } 
    XmlRole { name:"countdown" ; query: "departureTime/@countdown/number()" } 


    } 

    delegate: 
    Rectangle 
    { 
    color: "pink"; 
    width:parent.width; 
    height: col.height 
    Column 
    { 
    id: col 
    Text{ text: countdown } 
    Text{ text: delay } 
    } 
    } 

}// listView `