2012-12-17 111 views
6

मैं एक बहुत ही सरल परिदृश्य में जहाँ मैं एक संरचना इसएक्शनस्क्रिप्ट 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> 

अब मैं सभी पर्यटन कि मिलान करने के लिए जाने क्वेरी करना चाहते हैं के समान होता है।

नीचे तार्किक प्रारूप है कि मैं के EX4 शैली के आधार पर

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

लेकिन निश्चित रूप से यह काम नहीं करता सोच सकते है।

कोई अतिरिक्त तर्क उपयोग किए बिना इस डेटा को खींचने का सही तरीका क्या है?

उत्तर

3

XmlData.tour.destinations.destinationXMLList है। इसमें एक्सएमएल हैं, जो <destination>Milan</destination> जैसा दिखता है प्रत्येक XML में name = destination है, इसलिए आपको परिणाम के रूप में कुछ भी नहीं मिलता है।

इस प्रयास करें:

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

दिलचस्प, यह एक आकर्षण की तरह काम करता है, E4X- दस्तावेज़ीकरण के मुकाबले तुलना में थोड़ा अजीब लगता है कि यह कैसे काम करना चाहिए? और ओपी के लिए: मैंने पाया http://www.senocular.com/flash/tutorials/as3withflashcs3/?page=4 जो आपको एएस 3 में एक्सएमएल के साथ काम करने पर बहुत विस्तृत जानकारी दे सकता है। –

+0

यह बहुत अच्छा काम किया। मैं आपकी मदद की सराहना करता हूं धन्यवाद। –

0

यह स्क्रिप्ट आप अपने XmlData से एक नया xml बनाने के लिए मदद मिलेगी, लेकिन केवल मिलान करने के लिए गंतव्य सहित पर्यटन के साथ:

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) गलत तरीके से प्रारूपित एक्सएमएल। (बंद स्थलों पर 'गायब'/0)

2) आप एएस 3 ई 4 एक्स-फाइंडर में किसी प्रकार की बग में भाग लेते हैं। यह वास्तव में अजीब था, यहाँ हालांकि एक समाधान है ...

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

आगे की जांच कर रही है, यह ऊपर E4X इंजन शिकंजा की तरह लगता है के बाद से आप एक ही पहचानकर्ता (<destination>) के साथ एक टैग के अंदर कई बच्चे हैं।

टाइपिंग निम्नलिखित अपेक्षा के अनुरूप "फिल्टर समारोह" व्यवहार करते हैं बनाता है:

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

.... कि वास्तव में अजीब है ... जो कोई भी इस पर विस्तार से बता सकते हैं? क्योंकि ई 4 एक्स के एक्सएमएल-मानकों के मुताबिक सवाल में ऐसा करना संभव होना चाहिए।

+0

जल्द ही करने के लिए टिप्पणी की। जैसा कि @ एटॉमिकरोबोट ने दिखाया है, मैंने अपना दिमाग खो दिया है :) – Avik