¿Cómo filtrar los nodos xml por valores secundarios anidados en ActionScript 3?
actionscript-3 flash (3)
Tengo un escenario muy simple donde tengo una estructura similar a esta
<tours>
<tour>
<name>Italy 1</name>
<destinations>
<destination>Rome</destination>
<destination>Milan</destination>
<destinations>
</tour>
<tour>
<name>Italy 2</name>
<destinations>
<destination>Rome</destination>
<destination>Venice</destination>
<destinations>
</tour>
</tours>
Ahora quiero consultar todos los tours que van a Milán.
A continuación se muestra el formato lógico en el que puedo pensar basado en el estilo EX4
XmlData.tour.(destinations.destination.(name == "Milan"))
Pero, por supuesto, esto no funciona.
¿Cuál es la forma correcta de extraer estos datos sin usar ninguna lógica adicional?
1) xml mal formateado. (falta ''/'' en los destinos de cierre)
2) Parece que has encontrado algún tipo de error en AS3 E4X-finder. Esto fue realmente extraño, aquí hay una solución alternativa ...
var foo:XMLList = data.tour.destinations.(destination == "Milan");
trace("direct check: " + foo); //fails - 0 matches
trace("------");
for each(var child:XML in data.tour.destinations.destination) {
if (child == "Milan") {
trace("found match in foreach Milan");
}
}
Investigando más, parece que el motor E4X se estropea ya que tienes varios hijos dentro de una etiqueta con el mismo identificador ( <destination>
).
escribir a continuación hace que la "función de filtro" se comporte como se esperaba:
<destinations>
<destination2>Rome</destination2>
<destination>Milan</destination>
</destinations>
... eso es realmente extraño ... ¿Alguien que pueda dar más detalles sobre esto? Porque de acuerdo con los estándares xml de E4X debería ser posible hacerlo como se hizo en la pregunta.
Este script lo ayudará a crear un nuevo xml desde su XmlData, pero solo con tours que incluyen el destino a Milán:
var DESTINATION_TO_CHECK:String = "Milan";
var i:int;
var j:int;
var numberOfTours:int = XmlData.tour.length();
var numberOfDestinations:int;
var tours:String = "<tours to=''" + DESTINATION_TO_CHECK + "''>";
for (i = 0; i < numberOfTours; i++)
{
numberOfDestinations = XmlData.tour[i].destinations.destination.length();
for (j = 0; j < numberOfDestinations; j++)
{
if (XmlData.tour[i].destinations.destination[j] == DESTINATION_TO_CHECK)
{
tours += XmlData.tour[i];
}
}
}
tours += "</tours>";
trace(new XML(tours));
XmlData.tour.destinations.destination
es XMLList
. Contiene XML, que se parece a <destination>Milan</destination>
Cada uno de estos XML
tiene name
= destination
, por lo que no obtiene nada como resultado.
Prueba esto:
XmlData.tour.(destinations.destination.children().contains("Milan"));