AS3: Потомки с кратными состояниями

Пример моего списка XML:

<listnode>
   <nodeA id="1">
       <nodeB id="1" />
   </nodeA>
   <nodeA id="2">
       <nodeB id="2" />
   </nodeA>
</listnode>

<listnode>
   <nodeA id="2">
       <nodeB id="2" />
   </nodeA>
   <nodeA id="1">
       <nodeB id="3" />
   </nodeA>
   <nodeA id="5">
       <nodeB id="1" />
   </nodeA>
</listnode>

<listnode>
    ... etc

Я пытаюсь получить список XML на основе нескольких условий. С одним условием все в порядке, используя что-то вроде:

var  list:XMLList = list.(descendants("nodeA")[email protected]("1"));

Это дает мне список всех listnode в list, у которых есть любой потомок с именем nodeA с атрибутом id=1. >.

Как я могу получить тот же список, но также искать id узлов nodeB? Что-то типа:

var  list:XMLList = list.(descendants("nodeA")[email protected]("1") && nodeA.descendants("nodeB")[email protected]("3"));

В этом примере это должно дать мне список с одним узлом:

<listnode>
   <nodeA id="2">
       <nodeB id="2" />
   </nodeA>
   <nodeA id="1">
       <nodeB id="3" />
   </nodeA>
   <nodeA id="5">
       <nodeB id="1" />
   </nodeA>
</listnode>

Потому что у него есть nodeA с id=1, у которого есть nodeB с id=3.

Любые идеи?


person Albert R    schedule 21.04.2011    source источник
comment
@locrizak: спасибо за ответ, но я не понимаю, как точно применить это к моему коду. Не могли бы Вы уточнить?   -  person Albert R    schedule 21.04.2011
comment
var list:XMLList = list..nodeA.(@id == 1)..nodeB.(@id==3); Если это работает, я объясню, как это работает.   -  person locrizak    schedule 21.04.2011
comment
Это дает мне список nodeB, но мне нужен список listnode, которые соответствуют этим условиям... вы знаете, как это получить?   -  person Albert R    schedule 22.04.2011


Ответы (2)


ОБНОВЛЕНО

list.(descendants("nodeA").(@id.contains("1") && descendants("nodeB")[email protected]("3")).length() > 0)

Что насчет этого?

person Timofei Davydik    schedule 21.04.2011
comment
@Timofei Davydik: спасибо, но эта строка кода возвращает все узлы с любыми потомками с этими атрибутами, даже если узел B с id = 3 не находится внутри узла A с id = 1. Я хочу проверить id = 3 nodeB только внутри узлов nodeA с id = 1, и если оба верны, вернуть listnode, содержащий это. - person Albert R; 22.04.2011
comment
@Albert R О, я ошибся в первый раз, теперь понял. я постараюсь это исправить - person Timofei Davydik; 22.04.2011
comment
@Timofei Davydik: спасибо, я был бы очень признателен, я пробовал много разных вещей, но ничего не работает... - person Albert R; 22.04.2011
comment
@Timofei Davydik: это дает мне те же узлы, что и ваш предыдущий ответ. Он возвращает узлы, у которых есть потомок nodeB с id=3, даже если этот nodeB не находится внутри nodeA с id=1... - person Albert R; 22.04.2011
comment
@Albert R Вы уверены, что заменили код? Это дает мне только второй узел для вашего XML list.(descendants("nodeA").(@id.contains("1") && descendants("nodeB")[email protected]("3")).length() > 0) - person Timofei Davydik; 22.04.2011
comment
@Timofei Davydik: НАКОНЕЦ-ТО!!!! Теперь это работает! Я заменил код, но мне пришлось заменить что-то еще, чего у меня не было. Спасибо большое чувак!!!! Я уже сошел с ума от этого... Я очень ценю вашу помощь! - person Albert R; 22.04.2011

Да, условия можно комбинировать.

var list:XML = <list>
<listnode>
   <nodeA id="1">
       <nodeB id="1" />
   </nodeA>
   <nodeA id="2">
       <nodeB id="2" />
   </nodeA>
</listnode>

<listnode>
   <nodeA id="2">
       <nodeB id="2" />
   </nodeA>
   <nodeA id="1">
       <nodeB id="3" />
   </nodeA>
   <nodeA id="5">
       <nodeB id="1" />
   </nodeA>
</listnode>
</list>;
var result:XMLList = list.listnode.descendants("*").(@id=="1" && children().length() > 0); 
person alxx    schedule 21.04.2011
comment
Спасибо за ваш ответ. Дело в том, что я не вижу в вашей строке кода, где вы проверяете 2 условия, я вижу только одно... - person Albert R; 22.04.2011
comment
@id=="1" && children().length() > 0 - это два условия, объединенные И. Вы также можете использовать ИЛИ. - person alxx; 22.04.2011
comment
Спасибо alxx, я уже решил это благодаря Тимофею, но я также очень ценю ваш совет - person Albert R; 22.04.2011