2010-07-26 3 views
2

Array.indexOf와 동일한 XMLList가 있습니까? 예를 들어AS3의 XMLList에 문자열이 노드 값으로 포함되어 있는지 확인하십시오.

-

var array:Array = ['one','two']; 
trace(array.indexOf('two')); // returns 1, since it's at the second position 
trace(array.indexOf('three')); // returns -1, since it isn't found 

... 맞죠? 거기에있어

var xml:XML = <list><item>one</item><item>two</item><list> 
var xmlList:XMLList = list.item; 

권리, XMLList 내의 노드 중 하나가 그들 모두를 통해 반복보다 특정 값이 있는지 확인하는 쉬운 방법이 -하지만이있어 어떤 경우에? ~

xmlList.indexOfChildByNodeValue('two'); // returns 1, because it's the second child 
xmlList.indexOfChildByNodeValue('three'); // returns -1, because it doesn't match any children 

의미가 있으십니까?

답변

5

반복하지 않고 수행 할 수있는 방법에 대한 데모를 작성했습니다. 그것은 조금 더 선행 작업을 요구하지만. 비록 당신이 값을 많이 점검하려고한다면 그것은 보상을받습니다.

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" applicationComplete="_init();"> 
    <fx:Declarations> 
     <fx:XML id="movieList" source="http://www.movies.com/rss-feeds/jen-yamato-reviews-rss" /> 
    </fx:Declarations> 
    <fx:Script> 
     <![CDATA[ 
      import mx.logging.ILogger; 
      import mx.logging.Log; 
      import mx.logging.LogEventLevel; 
      import mx.logging.targets.TraceTarget; 

      public static const MOVIE_TITLE:String = "Inception"; 

      private var _logger:ILogger = Log.getLogger("Sandbox"); 

      private function _init() :void 
      { 
       var traceTarget:TraceTarget = new TraceTarget(); 
       traceTarget.level = LogEventLevel.ALL; 
       Log.addTarget(traceTarget); 

       var xmlList:XMLList = movieList..item; 

       var firstItem:XML = movieList..item[0]; 
       var firstItemIndex:int = firstItem.childIndex(); 
       _logger.info("First Item Index: " + firstItemIndex); 

       var item:XML = xmlList.(title == MOVIE_TITLE)[0]; 
       _logger.info("Contains: " + xmlList.contains(item) + " // " + item.childIndex()); 

       var actualIndex:int = (item.childIndex() - firstItemIndex); 
       _logger.info("Actual Index: " + actualIndex); 

       _logger.info("Result: " + xmlList[actualIndex]); 
      } 
     ]]> 
    </fx:Script> 

</s:Application> 

기본 개념

는 당신이 첫 번째 item의 인덱스를 저장하고 빼기 것입니다 그 E4X 검색을 사용하여 일치하는 결과의 childIndex()에서.

+0

와우, overachiever! E4X로 할 수있는 멋진 방법이 있다는 것을 알았습니다 - 그래서 예제의 고기는 "movieList..item (title == 'MovieTitle')"입니까? 그것은 각 아이템 노드가 타이틀 노드를 가지고 있기 때문에 효과가 있습니다. 제 경우 엔 아이템 노드가 노드 값으로 만 영화 제목을 포함한다고 상상해보십시오. 그게 끝날까요? "movieList .. (item == 'MovieTitle')"? –

+1

예를 들면 다음과 같습니다 : xmlList. (toString() == "one") – Patrick

+0

@ matt-lohkamp - 하하, 고마워. 내 대답은 여기에 게시하기 전에 샌드 박스에서 정확한지 확인하고 싶습니다. Patrick은 예제를 사용하여이를 수행하는 방법에 맞습니다. 나는 개인적으로'toString()'보다는'text()'를 사용할 것이다. 설명서를 확인하고 가장 필요한 스위트 룸을 결정하십시오. http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/XML.html – cynicaljoy

1

유일한 방법은 XMLList를 반복하는 것입니다. 가지고있는 다른 옵션은 다음을 사용하는 것입니다 : contains()indexOf() == || != -1의 여부 만 알고 싶다면이 방법이 도움이 될 수 있습니다.

XMLList가 기본 C++에 실제로 저장되는 방법이 확실하지 않지만 실제로 배열 일 경우 선형 검색 O (n)이 최선을 다할 것입니다.

+0

필자는 Linear 검색을 통해 Array.indexOf에 대한 본질적 내용을 이해할 수 있다고 생각합니다. 그렇습니다. 아마도 맞을 것입니다. 나는 그 코드 행을 실제로 작성하는 쉬운 방법이 없도록하고 싶었다. XMLList.contains()를 살펴 봤지만 XML 노드와 일치합니다.이 상황에서는 노드의 텍스트 값 (XML.toString()) 만 알고 다른 속성의 값은 아닙니다 -이 함수를 추측합니다. 노드 값에 대한 일치가 아닌 정확한 일치를 원합니다. 감사합니다. –