2008-09-29 3 views
9

Ich habe eine XML-Antwort von einem HTTPService-Aufruf mit dem e4x-Ergebnisformat.Die beste Möglichkeit festzustellen, ob ein XML-Attribut in Flex existiert

 

<?xml version="1.0" encoding="utf-8"?> 
<Validation Error="Invalid Username/Password Combination" /> 
 

Ich habe versucht:

 

private function callback(event:ResultEvent):void { 
    if([email protected]) { 
     // error attr present 
    } 
    else { 
     // error attr not present 
    } 
} 
 

Dies nicht zu funktionieren scheint (es denkt immer, dass die Fehler Attribut Exits), was der beste Weg, dies zu tun ist? Vielen Dank.

EDIT: Ich habe auch das Attribut zu vergleichen versucht leere Zeichenfolge auf null und eine ohne einen solchen Erfolg ...

+0

Überprüfen Sie meine Antwort am Ende. Ich glaube es ist das was du gesucht hast! :) – Rihards

Antwort

1

ich eine Lösung herausgefunden haben, ich bin interessiert noch, ob es einen besseren Weg dies zu tun ...

Dies funktioniert:

 

private function callback(event:ResultEvent):void { 
    if(event.result.attribute("Error").length()) { 
     // error attr present 
    } 
    else { 
     // error attr not present 
    } 
} 
 
2

Unter der Annahme, dass in Ihrem Beispiel event.result ist ein XML Objekt dessen Inhalt genau wie Sie auf dem Laufenden, dies sollte (aufgrund der Tatsache, dass die Validierung Tag des Root-Tag des XML ist) arbeiten:

var error:String = [email protected]; 
if (error != "") 
    // error 
else 
    // no error 

Das obige Beispiel wird davon ausgegangen, dass ein bestehendes Error Attribut mit einem leeren Wert sollte als „no- behandelt werden Fehler“Fall, obwohl, wenn Sie also, wenn das Attribut wissen wollen tatsächlich existiert oder nicht, sollten Sie dies tun:

if (event.result.hasOwnProperty("@Error")) 
    // error 
else 
    // no error 
11

Sie den besten Weg gefunden zu haben, es zu tun:

event.result.attribute("Error").length() > 0 

Die Methode attribute ist die bevorzugte Methode zum Abrufen von Attributen, wenn Sie nicht wissen, ob sie vorhanden sind oder nicht.

+0

Ich denke, dass es wichtig ist zu betonen, dass dies NICHT äquivalent zu "event.result.Error.length()> 0" ist, was fehlschlagen wird, wenn der Fehler nicht existiert. Für weitere Informationen siehe: http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000125.html – sixtyfootersdude

+0

Ich denke, du meintest, "Veranstaltung .result. @ Fehler "da event.result.Error nach dem Knoten mit dem Namen" Error "statt nach dem Attribut suchen würde. –

3

Sie können dies auf folgende Weise:

if (undefined == [email protected]) 

oder dynamisch

if (undefined == [email protected][attributeName]) 

Beachten Sie, dass die beiden Punkte in Ihrem Beispiel werden alle Nachkommen auf allen Ebenen abrufen so Sie erhalten eine Liste als Ergebnis. Wenn keine Fehlerattribute vorhanden sind, erhalten Sie eine leere Liste. Deshalb wird es nie gleich Null sein.

5

Ich mag diese Methode, weil a.) Es ist schmerzhaft einfach und b.) Ely Greenfield verwendet es. ;)

if("@property" in node){//do something} 
+0

Dies ist ein guter Tipp, aber ich würde gerne einen Schritt weiter gehen und dem Attribut einen Wert zuweisen, wenn es existiert. Wie mache ich es? Mein Attributname ist in einer String-Variablen, und ich habe versucht, Knoten. @ {AttrNameString} und es funktioniert nicht. irgendwelche Ideen? – Vatsala

+0

'XML (Knoten) .attribute (attrNameString) [0] =" irgendein Wert ";' –

1

Ich mag die folgende Syntax verwenden, um zu überprüfen, weil es einfach ist, zu lesen, weniger tippen und es fast als die schnellste Methode gebunden:

if ("@style" in item) // do something 

Um einen Wert zuweisen zurück zu diesem Attribut, wenn Sie don ‚t wissen, den Namen, bevor Hand die attribute Methode:

var attributeName:String = "style"; 
var attributeWithAtSign:String = "@" + attributeName; 
var item:XML = <item style="value"/>; 
var itemNoAttribute:XML = <item />; 

if (attributeWithAtSign in itemNoAttribute) { 
    trace("should not be here if attribute is not on the xml"); 
} 
else { 
    trace(attributeName + " not found in " + itemNoAttribute); 
} 

if (attributeWithAtSign in item) { 
    item.attribute(attributeName)[0] = "a new value"; 
} 

All folgenden werden Möglichkeiten zu testen, ob ein Attribut aus den Antworten aufgelistet auf diesen ques gesammelt existiert tion. Da es so viele waren, lief ich jeweils im 11.7.0.225 Debug-Player. Der Wert auf der rechten Seite ist die verwendete Methode. Der Wert auf der linken Seite ist die niedrigste Zeit in Millisekunden, die benötigt wird, wenn der Code eine Million Mal ausgeführt wird. Hier sind die Ergebnisse:

807 item.hasOwnProperty("@style") 
824 "@style" in item 
1756 [email protected][0] 
2166 (undefined != [email protected]["style"]) 
2431 (undefined != item["@style"]) 
3050 XML(item).attribute("style").length()>0 

Leistung Test Code:

var item:XML = <item value="value"/>; 
var attExists:Boolean; 
var million:int = 1000000; 
var time:int = getTimer(); 

for (var j:int;j<million;j++) { 
    attExists = XML(item).attribute("style").length()>0; 
    attExists = XML(item).attribute("value").length()>0; 
} 

var test1:int = getTimer() - time; // 3242 3050 3759 3075 

time = getTimer(); 

for (var j:int=0;j<million;j++) { 
    attExists = "@style" in item; 
    attExists = "@value" in item; 
} 

var test2:int = getTimer() - time; // 1089 852 991 824 

time = getTimer(); 

for (var j:int=0;j<million;j++) { 
    attExists = (undefined != [email protected]["style"]); 
    attExists = (undefined != [email protected]["value"]); 
} 

var test3:int = getTimer() - time; // 2371 2413 2790 2166 

time = getTimer(); 

for (var j:int=0;j<million;j++) { 
    attExists = (undefined != item["@style"]); 
    attExists = (undefined != item["@value"]); 
} 

var test3_1:int = getTimer() - time; // 2662 3287 2941 2431 

time = getTimer(); 

for (var j:int=0;j<million;j++) { 
    attExists = item.hasOwnProperty("@style"); 
    attExists = item.hasOwnProperty("@value"); 
} 

var test4:int = getTimer() - time; // 900 946 960 807 

time = getTimer(); 

for (var j:int=0;j<million;j++) { 
    attExists = [email protected][0]; 
    attExists = [email protected][0]; 
} 

var test5:int = getTimer() - time; // 1838 1756 1756 1775 
Verwandte Themen