2012-12-17 11 views
6

Ho un semplice scenario in cui ho una struttura simile a questoCome filtrare i nodi xml per valori figli nidificati in ActionScript 3?

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

Ora voglio interrogare tutti i tour che vanno a Milano.

Di seguito si riporta il formato logico che mi viene in mente in base a stile EX4

XmlData.tour.(destinations.destination.(name == "Milan")) 

Ma naturalmente questo non funziona.

Qual è il modo corretto di estrarre questi dati senza utilizzare alcuna logica aggiuntiva?

risposta

3

XmlData.tour.destinations.destination è XMLList. Contiene XML, che assomiglia a <destination>Milan</destination> Ognuno di questi XML ha name = destination, quindi non si ottiene nulla come risultato.

Prova questo:

XmlData.tour.(destinations.destination.children().contains("Milan")); 
+0

Interessante, che funziona come un incantesimo, sembra un po 'strano se confrontato con la documentazione E4X su come dovrebbe funzionare? E per OP: ho trovato http://www.senocular.com/flash/tutorials/as3withflashcs3/?page=4 che potrebbe fornirti informazioni abbastanza dettagliate su come lavorare con xml in AS3. –

+0

Ha funzionato molto bene. Apprezzo il tuo aiuto, grazie. –

0

Questo script vi aiuterà a creare un nuovo XML dal vostro XmlData, ma solo con tour incluso destinazione a Milano:

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)); 
1

1) xml male formattato. (manca '/' sulle destinazioni di chiusura)

2) Sembra che ci sia un qualche tipo di errore in AS3 E4X-finder. Questo è stato davvero strano, ecco una soluzione alternativa se ...

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"); 
    } 
} 

Inoltre indagare, sembra che le viti E4X-up del motore poiché si dispone di più figli all'interno di un tag con lo stesso identificatore (<destination>).

tipizzazione seguendo rende la "funzione di filtro" funziona come previsto:

<destinations> 
<destination2>Rome</destination2> 
<destination>Milan</destination> 
</destinations> 

.... questo è davvero strano ... Chiunque può elaborare su questo? Perché secondo gli standard xml di E4X dovrebbe essere possibile farlo come fatto nella domanda.

+0

commentato al più presto. Come ha dimostrato @AtomicRobot, avevo perso la testa :) – Avik

Problemi correlati