我有 javascript (qml) 中的 XML 字符串。我的目标是过滤有关不同行的信息。我想要一个包含行名(属性)的对象,尤其是倒计时。对于一个线路名称,有离开次数 * 倒计时字段。我想要一个数组中的所有这些(在当前情况下是 2 个)倒计时值。最终目标是将整行加载到表单的 ListModel 中:line(name, countdown(1,2,..x))
。
最大的问题是访问属性。在 qml 中不知何故不支持 DOM 树的标准函数:“对象没有 getAttribute() 之类的函数”和其他函数,例如 getElementByTagName()。使用 XmlListModel 我可以访问属性,但前提是只有一个。在另一种情况下,它返回未知(据我发现,qt 中有一个错误)。
我已经尝试过纯 XmlListModel,但没有运气(请参阅:Parse XmlHttpRequest to 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="" 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 爬上 Object 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 正则表达式
所以我最后的赌注是使用正则表达式。有没有办法获得所有倒计时值?这是我最好的尝试,但它以某种方式只得到一个值(我在最后尝试了 + 来查找所有倒计时,但它不起作用。/delay\=\"\d*\".countdown\=\"(\d*)\"+/
这
for(var i = 0; i<5; i++) console.debug(found[i]);
就是我检索匹配项的方式。第二次迭代,so found[1] 给了我 1 个正确的倒计时。但是我如何扩展这个概念来获得所有的倒计时呢?