2008-09-29 32 views
9

Tôi có phản hồi XML từ cuộc gọi HTTPService với định dạng kết quả e4x hay không.Cách tốt nhất để xác định xem thuộc tính XML có tồn tại trong Flex

 

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

Tôi đã thử:

 

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

này dường như không làm việc (nó luôn luôn nghĩ rằng các lối ra thuộc tính lỗi) là cách tốt nhất để làm điều này là gì? cảm ơn.

EDIT: Tôi cũng đã cố gắng để so sánh các thuộc tính null và một chuỗi rỗng không thành công như vậy ...

+0

Kiểm tra câu trả lời của tôi ở cuối. Tôi tin rằng đó là những gì bạn đang tìm kiếm! :) – Rihards

Trả lời

1

tôi đã tìm ra một giải pháp, tôi vẫn quan tâm nếu có một cách tốt hơn để làm điều này ...

này sẽ làm việc:

 

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

Giả sử rằng trong ví dụ của bạn event.result là một đối tượng XML các nội dung trong số đó là chính xác như bạn đăng, này nên làm việc (do thực tế rằng thẻ Validation là thẻ gốc của XML):

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

Ví dụ trên sẽ cho rằng một Error thuộc tính hiện có với một giá trị rỗng phải được coi là một "không- lỗi" trường hợp, tuy nhiên, vì vậy nếu bạn muốn biết nếu thuộc tính thực tồn tại hay không, bạn nên làm điều này:

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

bạn đã tìm thấy cách tốt nhất để làm điều đó:

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

Phương pháp attribute là cách ưa thích để truy xuất thuộc tính nếu bạn không biết liệu chúng có ở đó hay không.

+0

Tôi nghĩ rằng điều quan trọng là nhấn mạnh rằng điều này KHÔNG tương đương với 'event.result.Error.length()> 0' sẽ thất bại nếu Lỗi không tồn tại. Để biết thêm thông tin, hãy xem: http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000125.html – sixtyfootersdude

+0

Tôi nghĩ ý của bạn là "sự kiện @ Lỗi "vì event.result.Error sẽ tìm nút có tên" Lỗi "thay vì thuộc tính. –

3

Bạn có thể kiểm tra điều này theo cách sau:

if (undefined == [email protected]) 

hoặc động

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

Lưu ý rằng trong ví dụ của bạn, hai chấm sẽ lấy tất cả các con cháu trên tất cả các cấp, do đó bạn sẽ nhận được một danh sách như là một kết quả. Nếu không có thuộc tính Lỗi, bạn sẽ nhận được một danh sách trống. Đó là lý do tại sao nó sẽ không bao giờ bằng null.

5

Tôi thích phương pháp này vì a) đơn giản là đau đớn và b.) Ely Greenfield sử dụng nó. ;)

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

Đây là một mẹo tuyệt vời, tuy nhiên tôi muốn tiến thêm một bước nữa và gán một số giá trị cho thuộc tính nếu nó tồn tại. Tôi phải làm nó như thế nào? Tên thuộc tính của tôi là một biến chuỗi và tôi đã thử nút. {{AttrNameString} và nó hoạt động. bất kỳ ý tưởng? – Vatsala

+0

'XML (nút) .attribute (attrNameString) [0] =" một số giá trị ";' –

1

Tôi thích sử dụng cú pháp sau đây để kiểm tra vì nó dễ dàng để đọc, ít đánh máy và nó gần như gắn như là phương pháp nhanh nhất:

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

Để gán một giá trị trở lại thuộc tính rằng khi bạn don 't biết tên của nó trước khi tay sử dụng attribute phương pháp:

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

Tất cả trong những cách sau đây để kiểm tra nếu một thuộc tính tồn tại thu thập được từ các câu trả lời niêm yết trên ques này sự. Vì có quá nhiều nên tôi chạy mỗi trong trình gỡ lỗi 11.7.0.225. Giá trị bên phải là phương thức được sử dụng. Giá trị bên trái là thời gian thấp nhất tính bằng mili giây khi chạy mã một triệu lần. Dưới đây là kết quả:

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 

Hiệu suất mã kiểm tra:

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 
Các vấn đề liên quan