Лучший способ определить, существует ли атрибут XML во Flex - PullRequest
9 голосов
/ 29 сентября 2008

У меня есть XML-ответ от вызова HTTPService с форматом результата e4x.


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

Я пробовал:


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

Кажется, это не работает (всегда думает, что атрибут error завершен). Каков наилучший способ сделать это? спасибо.

РЕДАКТИРОВАТЬ: Я также попытался сравнить атрибут с нулевой и пустой строкой без такого успеха ...

Ответы [ 7 ]

11 голосов
/ 29 сентября 2008

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

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

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

5 голосов
/ 09 марта 2009

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

if("@property" in node){//do something}
3 голосов
/ 29 сентября 2008

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

if (undefined == event.result.@Error)

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

if (undefined == event.result.@[attributeName])

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

2 голосов
/ 13 июня 2013

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

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

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

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

Код теста производительности:

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 != item.@["style"]);
    attExists = (undefined != item.@["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 = item.@style[0];
    attExists = item.@value[0];
}

var test5:int = getTimer() - time; // 1838 1756 1756 1775
2 голосов
/ 29 сентября 2008

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

var error:String = event.result.@Error;
if (error != "")
    // error
else
    // no error

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

if (event.result.hasOwnProperty("@Error"))
    // error
else
    // no error
1 голос
/ 29 сентября 2008

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

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


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

0 голосов
/ 26 октября 2010

Вот, пожалуйста:

if(event.result.@error[0]){
    //exists 
}

Полегче, а? :)

...