У меня есть строка XML в javascript (qml). Моя цель - отфильтровать информацию о разных строках. Мне нужен объект, содержащий имя строки (атрибут) и особенно обратный отсчет. Для одного имени строки есть поля offsets_count * countdown. Мне нужны все эти (в данном случае 2) значения обратного отсчета в массиве. И конечной целью является загрузка всей строки в ListModel вида: line(name, countdown(1,2,..x)).
Большая проблема заключается в доступе к атрибутам. В qml почему-то не поддерживаются стандартные функции для DOM-дерева: "У объекта нет такой функции, как getAttribute()" и другие, вроде getElementByTagName(). С XmlListModel я могу получить доступ к атрибутам, но только если есть только один. В каждом другом случае он возвращает unknown (насколько мне известно, в 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]); я извлекаю спички. Вторая итерация, найденная таким образом[1], дает мне 1 правильный обратный отсчет. Но как мне расширить эту концепцию, чтобы получить все обратные отсчеты?