确定Flex中是否存在XML属性的最佳方法

时间:2008-09-29 15:33:00

标签: javascript flex actionscript-3

我从HTTPService调用获得了带有e4x结果格式的XML响应。


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

这似乎不起作用(它总是认为错误属性退出)这样做的最佳方法是什么?感谢。

编辑:我还试图将该属性与null和一个空字符串进行比较,但没有取得如此成功......

7 个答案:

答案 0 :(得分:11)

你找到了最好的方法:

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

attribute方法是检索属性的首选方法,如果您不知道它们是否存在。

答案 1 :(得分:5)

我喜欢这种方法因为a。)它很简单而且b。)Ely Greenfield使用它。 ;)

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

答案 2 :(得分:3)

您可以通过以下方式检查:

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

或动态

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

请注意,在您的示例中,两个点将检索所有级别上的所有后代,因此您将获得一个列表作为结果。如果没有Error属性,您将获得一个空列表。这就是为什么它永远不会等于null。

答案 3 :(得分:2)

假设在您的示例中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

答案 4 :(得分:2)

我喜欢使用以下语法来检查,因为它易于阅读,更少打字,并且它几乎成为最快的方法:

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

答案 5 :(得分:1)

我已经找到了解决方案,如果有更好的方法,我仍然感兴趣......

这将有效:


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

答案 6 :(得分:0)

你走了:

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

容易,嗯? :)