¿Puede E4X obtener el atributo de un nodo padre basado en el atributo de un hijo en cualquier nivel?

StackOverflow https://stackoverflow.com/questions/1427810

  •  07-07-2019
  •  | 
  •  

Pregunta

Considere este fragmento XML con '' nodos '' que puede tener niveles secundarios ilimitados de "subnodo" elementos.

Quiero encontrar el atributo @type del nodo para cualquier subnodo , basado en su @id atributo. Por ejemplo, si tengo una identificación de 9, entonces quiero devolver el tipo = " foo " desde arriba.

<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>

El E4X que se me ocurrió, pero que falla es:

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

Puedo ver por qué no funciona. Lo que tendría más sentido es lo siguiente, pero la sintaxis falla (en AS3):

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

¿Cómo se puede hacer esto?

¿Fue útil?

Solución

Debería poder obtener el valor de tipo usando este E4X:

xml.node.(descendants("subnode").@id.contains("8")).@type;

Otros consejos

Prueba esto

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

EDITAR: incluso esto debería funcionar:

if(node..subnode.(@id == '9').length() != 0)

Habiendo renunciado a E4X, utilicé un "hack". y lo hice en ActionScript en su lugar. Así es como:

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"

Parece un desastre sin embargo. Todavía estaría interesado en cualquier solución E4X simple.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top