Как я могу обнаружить дочерний элемент родительской переменной в E4X (в частности, Flex 3)?

У меня есть XML, который выглядит так:

<question>
    <type_elt>
        <opt_out_flag />
    </type_elt>
</question>

type_elt не является именем элемента; это может быть <single>, <multiple> или что-то еще, определенное во время выполнения. Как, учитывая это, я могу определить присутствие элемента opt_out_flag?

Я пробовал это (где xml относится к элементу question):

if (xml.*.opt_out_flag) {
    do_something();
}

но даже в случаях без opt_out_flag приведенное выше выражение возвращает true. Очевидно, я чего-то упускаю, но что это?


person Chris R    schedule 20.07.2009    source источник


Ответы (5)


Я считаю, что вы хотите использовать xml.*.hasOwnProperty('opt_out_flag'), а не то, что используете сейчас.

person quoo    schedule 20.07.2009

Попробуй это

xml..opt_out_flag

Он будет искать все вхождения

person Rahul Garg    schedule 21.07.2009

Можно ли гарантировать, что <opt_out_flag/> всегда будет в первом дочернем элементе <question>? Если да, то должно работать что-то вроде следующего:

(отказ от ответственности: я знаю, что это работает с атрибутами, но я не знаю, будет ли это работать с дочерними элементами)

if( "opt_out_flag" in xml.children()[0] ) {
    doSomething();
}
person Dan    schedule 20.07.2009
comment
Я не могу этого гарантировать, нет. Грамматика XML, который я обрабатываю, недооценена и носит своего рода произвольный характер, что затрудняет, если не делает невозможным, твердые утверждения о порядке или содержании элементов. - person Chris R; 20.07.2009
comment
О, хорошо. Тогда я бы подумал, что решение quoo, вероятно, именно то, что вам нужно. Если это решение не сработает, вам может потребоваться перебрать каждый дочерний элемент, проверяя наличие флага отказа - не очень красиво! - person Dan; 20.07.2009

Можете ли вы использовать метод потомков (который рекурсивно перемещается вниз по дереву), чтобы найти тег?

var optOutNodes:XMLList = xml.descendants("opt_out_flag");

if(optOutNodes.length())
{
   //do code here
}

Надеюсь, это то, что вы ищете.

person enzuguri    schedule 21.07.2009

Ты можешь использовать

var optOut:Boolean = xml..opt_out_flag != undefined

вы можете опустить часть! = undefined, но я бы оставил ее там для удобства чтения.

person sharvey    schedule 12.08.2009