¿Puede E4X obtener el atributo de un nodo padre basado en el atributo de un hijo en cualquier nivel?
-
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?
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.