2 Stimmen

Herausfinden, ob die XMLList von AS3 einen String als Knotenwert enthält

Gibt es ein XMLList-Äquivalent zu Array.indexOf?

Zum Beispiel.

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

... richtig? aber was ist, wenn ich das habe -

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

es muss einen einfacheren Weg geben, um zu überprüfen, ob einer der Knoten in der XMLList einen bestimmten Wert hat, als durch alle von ihnen zu schleifen, richtig? etwas ähnlich wie -

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

Sinn machen?

5voto

cynicaljoy Punkte 1967

Ich habe eine Demo zusammengestellt, die zeigt, wie man es ohne Schleifen machen kann. Allerdings erfordert es ein wenig mehr Vorarbeit. Aber es zahlt sich aus, wenn Sie gehen, um die Werte eine Menge zu überprüfen.

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

Die Grundidee ist, dass Sie den Index der ersten item und subtrahieren Sie dies von der childIndex() des übereinstimmenden Ergebnisses mit Hilfe der E4X-Suche.

1voto

sberry Punkte 121520

Ich denke, die einzige Möglichkeit ist, eine Schleife durch die XMLList zu ziehen. Die andere Option, die Sie haben, ist zu verwenden: enthält() Das hilft Ihnen aber nur, wenn Sie tatsächlich nur wissen wollen, ob indexOf() == || != -1 .

Ich bin nicht sicher, wie die XMLList tatsächlich in der zugrunde liegenden C++ gespeichert ist, aber wenn es wirklich nur ein Array ist, dann ist eine lineare Suche O(n) das Beste, was Sie tun werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X