Просмотр полной версии : Оператор @ для несуществующего атрибута
Для выборки нужных елементов из XmlList пользуюсь следующей конструкцией :
someList.children().(@someAttr == 'someValue');
Но проблема в том что у меня возможна ситуация когда атрибут someAttr не задан вообще. Тогда вылетает ошибка :
Error #1065: Variable @someAttr is not defined
В принцыпе логично, но как мне тогда поступать ? Проходить циклом весь список в поисках нужных елементов ?
var _xml:XML = <data>
<nodeA someAttr='111'>
<nodeToTrace />
</nodeA>
<nodeB />
</data>;
var _xmll:XMLList = _xml.children().(attribute('someAttr') == '111');
trace(_xmll.toXMLString());
var xml:XML = <xml>
<item/>
<item>
<item attr="test"/>
</item>
<item/>
<item/>
</xml>;
var list:XMLList = xml..*.(attribute('attr')=='test');
trace(list.toXMLString());
Я вот тож думаю, а зачем проверять сначала наличие атрибута, а потом его еще с чем-то сравнивать... %)
Спасибо за примеры ! Помогло !
Гм...Теперь вот оказалось что к каждому елементу из результующего листа нужно добавить еще один атрибут - id його прямого родителя. Как я понимаю нужно с самого начала использовать цикл и обходить все елементы чтобы найти совпадения атрибута из нужным значением и тут же задать етому елементу новый атрибут - id родителя. Пожалуйста подтвердите что других способов нету, а то я не усну седня :)
var xml:XML = <xml id="0">
<item/>
<item id="1">
<item attr="test"/>
</item>
<item attr="test"/>
<item/>
</xml>;
xml..*.(attribute('attr')=='test' && (parent().children()[childIndex()].@id=parent().@id));
trace(xml.toXMLString());
Как всегда я ошибался...Спасибо за красивое решение !
Вообще-то этот способ только визуально неплох. В реальности код превращается в тучу циклов, просто вы их не пишете.
Если есть возможность модифицировать ХМЛ -- я бы использовал неймспейсы вместо размножения одинакового аттрибута для всех потомков...
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.