Может ли E4X получить атрибут родительского узла на основе атрибута ребенка любого уровня? - PullRequest
4 голосов
/ 15 сентября 2009

Рассмотрим этот фрагмент XML с «узлами», которые могут иметь неограниченные дочерние уровни элементов «подузла».

Я хочу найти @type атрибут node для любого заданного subnode на основе его атрибута @id. Например, если у меня есть идентификатор 9, я хочу вернуть type = "foo" сверху.

<xml>
    <node type="bar">
        <subnode id="4">
            <subnode id="5"/>
        </subnode>  
        <subnode id="6"/>
    </node>
    <node type="foo">
        <subnode id="7">
            <subnode id="8">
                <subnode id="9"/>
            </subnode>
        </subnode>
        <subnode id="10"/>
    </node>
</xml>

E4X, который я придумал, но который терпит неудачу:

xml.node.(subnode.(@id == '8')).@type 

Я могу понять, почему это не работает. Более разумно было бы следующее, но синтаксис не работает (в AS3):

xml.node.(..subnode.(@id == '8')).@type

Как это можно сделать?

Ответы [ 3 ]

5 голосов
/ 17 сентября 2009

Вы должны быть в состоянии получить значение типа, используя этот E4X:

xml.node.(descendants("subnode").@id.contains("8")).@type;
0 голосов
/ 16 сентября 2009

Попробуйте это

for each(var node:XML in xml.node)
{
    var subnodes:XMLList = node..subnode;
    if(subnodes.(@id == '9').length() != 0)
        return node.@type;
}

РЕДАКТИРОВАТЬ: Даже это должно работать:

if(node..subnode.(@id == '9').length() != 0)
0 голосов
/ 16 сентября 2009

Отказавшись от E4X, я использовал «хак» и сделал это вместо ActionScript. Вот как это сделать:

var p:XML = xml..subnode.(attribute('id').toLowerCase() === "8")[0];

//Traverse back up to the parent "node"           
while ( p.name().toString() === "subnode" ) {
    p = p.parent();
}

Alert.show(p.@type); //Should say "foo"

Кажется, все в порядке. Все равно был бы заинтересован в любом простом решении E4X.

...