2008-09-29 3 views
9

У меня есть ответ XML от вызова HTTPService с форматом результата e4x.Лучший способ определить, существует ли атрибут XML в Flex

 

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

Я попытался:

 

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

Это не похоже на работу (он всегда думает, что выходит из атрибутов ошибки), что это лучший способ сделать это? Благодарю.

EDIT: Я также попытался сравнить атрибут NULL и пустую строку без такого успеха ...

+0

Проверьте свой ответ в конце. Я считаю, что это то, что вы искали! :) – Rihards 2010-10-25 22:08:48

ответ

1

я понял, решение, я все еще интересно, если есть лучший способ чтобы сделать это ...

Это будет работать:

 

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

Если предположить, что в вашем примере event.result является XML объект, содержание которой в точности, как вы писали, это должно работать (из-за того, что проверка тега является корневой тег XML):

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

В приведенном выше примере предположим, что существующий Error атрибут с пустым значением следует рассматривать как «нет- ошибка»случай, хотя, так что если вы хотите знать, если атрибут фактически существует или нет, вы должны сделать это:

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

вы нашли лучший способ сделать это:

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

Метод attribute является предпочтительным способом получения атрибутов, если вы не знаете, находятся они там или нет.

+0

Я думаю, что важно подчеркнуть, что это НЕ эквивалентно `event.result.Error.length()> 0`, который потерпит неудачу, если Ошибка не существует. Для получения дополнительной информации см .: http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000125.html – sixtyfootersdude 2011-02-18 22:21:20

+0

Я думаю, вы имели в виду, "событие .result. @ Ошибка ", так как event.result.Error будет искать узел с именем« Ошибка »вместо атрибута. – 2013-06-13 11:20:30

3

Вы можете проверить это следующим образом:

if (undefined == [email protected]) 

или динамически

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

Обратите внимание, что в вашем примере, эти две точки будут получать все потомки на всех уровнях, так что вы получите список в результате. Если атрибутов ошибки нет, вы получите пустой список. Вот почему он никогда не будет равным нулю.

5

Мне нравится этот метод, потому что a.) Это очень просто и b). Эли Гринфилд использует его. ;)

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

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

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

Чтобы присвоить значение обратно в этот атрибут, когда дон «знаю имя его, прежде чем руки использовать attribute метод:

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

Все следующие способы, чтобы проверить, если атрибут существует, собранная из ответов, перечисленных на этом Ques Тион. Так как было так много, я побежал каждый в отладочном проигрывателе 11.7.0.225. Значение справа - используемый метод. Значение слева - это самое низкое время в миллисекундах, которое требуется при запуске кода один миллион раз. Вот результаты:

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 

Performance Код проверки:

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 
Смежные вопросы