我已經得到了,並在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個正確的倒計時,但是如何擴展這個概念才能獲得所有的倒計時?