2013-10-09 84 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 `