2012-12-17 10 views
6

Mam bardzo prosty scenariusz, gdzie mam strukturę podobną do tejJak filtrować węzły XML za pomocą zagnieżdżonych wartości potomnych w 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> 

teraz chcę zapytać wszystkie wycieczki, które idą do Mediolanu.

Poniżej jest logiczną Format że mogę myśleć na podstawie stylu EX4

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

Ale oczywiście to nie działa.

Jaki jest poprawny sposób pobierania tych danych bez użycia dodatkowej logiki?

Odpowiedz

3

XmlData.tour.destinations.destination to XMLList. Zawiera XML, które wygląda tak, jak <destination>Milan</destination> Każdy z nich ma XML, więc nie otrzymujesz nic jako wynik.

Spróbuj tego:

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

Ciekawe, że działa jak urok, wydaje się trochę dziwne w porównaniu z dokumentacją E4X, jak to powinno działać? I do OP: znalazłem http://www.senocular.com/flash/tutorials/as3withflashcs3/?page=4, który może dostarczyć ci szczegółowych informacji na temat pracy z xml w AS3. –

+0

To działało bardzo dobrze. Doceniam twoją pomoc dzięki. –

0

Ten skrypt pomoże Ci utworzyć nową XML z XmlData, ale tylko z tym cel wycieczki do Mediolanu:

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) źle sformatowane xml. (brakujące "/" w miejscu docelowym)

2) Wygląda na to, że natknąłeś się na jakiś błąd w wyszukiwarce E3x AS3. To było bardzo dziwne, tutaj jest obejście chociaż ...

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

Dalsze śledztwo, wydaje się, że śruby E4X silnikiem w górę, ponieważ masz wiele dzieci wewnątrz znacznika z tego samego identyfikatora (<destination>).

wpisując następujące sprawia, że ​​„Funkcja filtrowania” zachowują się zgodnie z oczekiwaniami:

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

.... to naprawdę dziwne ... Każdy, kto może opracowania na ten temat? Ponieważ zgodnie ze standardami xml E4X powinno być możliwe zrobienie tego tak jak zrobiono w pytaniu.

+0

skomentował wkrótce. Jak pokazał @AtomicRobot, straciłem rozum :) – Avik

Powiązane problemy