выяснить, содержит ли ASM XMLList строку в качестве значения узла - PullRequest
2 голосов
/ 26 июля 2010

Есть ли XMLList, эквивалентный Array.indexOf?

Например -

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

имеет смысл?

Ответы [ 2 ]

5 голосов
/ 26 июля 2010

Я собрал демонстрацию того, как вы можете сделать это без зацикливания.Хотя это требует немного больше предварительной работы.Хотя это окупается, если вы собираетесь много проверять значения.

<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, а затем вычитаете его из childIndex()совпал результат с использованием поиска E4X.

1 голос
/ 26 июля 2010

Я думаю, что единственная ставка - пройти через XMLList.Другой вариант, который у вас есть, это использовать: содержит () Хотя это поможет только в вашей ситуации, если вы на самом деле хотите узнать, indexOf() == || != -1.

Я не уверен вXMLList на самом деле хранится в базовом C ++, но если он действительно является просто массивом, то лучше всего использовать линейный поиск O (n).

...