Динамический доступ к дочерним узлам XML E4X ActionScript 3

Я хочу создать служебную функцию, которая требует динамического доступа к дочерним узлам XML.

Пример XML:

var xml:XML = 
<root>
    <section>
        <lt target='foo'/>
        <lt target='foo1'/>
        <lt target='foo2'/>
    </section>
    <section1>
        <lt target='foo'/>
        <lt target='foo1'/>
        <lt target='foo2'/>
    </section1>
</root>;

Я хочу иметь доступ ко всем узлам lt независимо от их родительского узла. Обычно это делается так:

var xList:XMLList = xml..lt;

//Output

xList = 
<lt target='foo'/>
<lt target='foo1'/>
<lt target='foo2'/>
<lt target='foo'/>
<lt target='foo1'/>
<lt target='foo2'/>

Это работает нормально, однако мне нужно получить доступ к узлу lt, не зная имени заранее. Например...

var nodeName:String = 'lt';
var xList:XMLList = xml..[nodeName]; //<-- Does not work.

Я надеялся сделать это без использования цикла for. Любые идеи?

Спасибо,

Виктор


person Victor Diaz    schedule 02.02.2012    source источник
comment
Не бери в голову. Я разобрался и поставил бы в качестве ответа, но мне пришлось ждать 8 часов. Но на случай, если кто-то еще смотрит, синтаксис следующий: var xList:XMLList = new XMLList(xml.descendants(node));   -  person Victor Diaz    schedule 03.02.2012
comment
Ах, вы подумали, что это почти то же самое. Но я не думаю, что вам тоже понадобится new XMLList.   -  person Peter Hall    schedule 03.02.2012


Ответы (3)


Вам наверняка просто понадобится:

 var nodeName:String = "lt";
 var xList:XMLList = xml.descendants( nodeName );
person Peter Hall    schedule 03.02.2012

Предполагая, что все они имеют одинаковую глубину в вашем xml, вы можете использовать * в качестве подстановочного знака. Например:

var xml:XML = <root>
    <obj1>
        <test>a</test>
    </obj1>
    <obj2>
        <test>b</test>
    </obj2>
    <obj2>
        <lala>
            <test>c</test>
        </lala>
    </obj2>
</root>;
trace(xml.*.test);

Следы:

<test>a</test>
<test>b</test>

xml.children().test, кстати, сделал бы то же самое.

person Martin    schedule 02.02.2012
comment
Это тоже работает ... var list: XMLList = xml. * [Node]; Спасибо! - person Victor Diaz; 03.02.2012
comment
Кстати, как получить <test>c</test>? - person Hoang Huynh; 18.12.2013

Вы хотите использовать операторы в скобках E4X, также называемые фильтрами. А также используйте подстановочный знак для возврата всех дочерних элементов. Очень мощный, он позволит вам искать, используя строку.

trace("trace",xml..*.(localName() =='lt'));
person Plastic Sturgeon    schedule 03.02.2012
comment
Прохладный! список переменных: XMLList = xml .. *. (localName () == узел) - person Victor Diaz; 03.02.2012