PDA

Просмотр полной версии : Оператор @ для несуществующего атрибута


zlatko
22.01.2008, 11:37
Для выборки нужных елементов из XmlList пользуюсь следующей конструкцией :


someList.children().(@someAttr == 'someValue');


Но проблема в том что у меня возможна ситуация когда атрибут someAttr не задан вообще. Тогда вылетает ошибка :


Error #1065: Variable @someAttr is not defined


В принцыпе логично, но как мне тогда поступать ? Проходить циклом весь список в поисках нужных елементов ?

wvxvw
22.01.2008, 13:29
var _xml:XML = <data>
<nodeA someAttr='111'>
<nodeToTrace />
</nodeA>
<nodeB />
</data>;

var _xmll:XMLList = _xml.children().(attribute('someAttr') == '111');
trace(_xmll.toXMLString());

etc
22.01.2008, 13:32
var xml:XML = <xml>
<item/>
<item>
<item attr="test"/>
</item>
<item/>
<item/>
</xml>;
var list:XMLList = xml..*.(attribute('attr')=='test');
trace(list.toXMLString());

wvxvw
22.01.2008, 13:35
Я вот тож думаю, а зачем проверять сначала наличие атрибута, а потом его еще с чем-то сравнивать... %)

zlatko
22.01.2008, 17:36
Спасибо за примеры ! Помогло !

zlatko
22.01.2008, 19:52
Гм...Теперь вот оказалось что к каждому елементу из результующего листа нужно добавить еще один атрибут - id його прямого родителя. Как я понимаю нужно с самого начала использовать цикл и обходить все елементы чтобы найти совпадения атрибута из нужным значением и тут же задать етому елементу новый атрибут - id родителя. Пожалуйста подтвердите что других способов нету, а то я не усну седня :)

etc
22.01.2008, 20:09
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());

zlatko
22.01.2008, 21:15
Как всегда я ошибался...Спасибо за красивое решение !

etc
22.01.2008, 22:50
Вообще-то этот способ только визуально неплох. В реальности код превращается в тучу циклов, просто вы их не пишете.

wvxvw
23.01.2008, 02:10
Если есть возможность модифицировать ХМЛ -- я бы использовал неймспейсы вместо размножения одинакового аттрибута для всех потомков...