2011-01-13 40 views
3

在ActionScript 3中測試XML對象上屬性的存在的最佳方法是什麼?在as3中測試xml屬性的存在

http://martijnvanbeek.net/weblog/40/testing_the_existance_of_an_attribute_in_xml_with_as3.html是建議使用

if ([email protected] != [email protected]istingattribute) 

測試,我看到了意見建議使用:

if (node.hasOwnProperty('@test')) { // attribute qtest exists } 

但在這兩種情況下,測試是區分大小寫的。

XML Specs:「XML處理器應該以不區分大小寫的方式匹配字符編碼名稱」,所以我認爲屬性名稱也應該使用不區分大小寫的比較匹配。

謝謝

+0

籲...閃光只是不停止奇怪我復活節彩蛋... – jayarjo 2011-01-13 09:07:14

+0

儘管這不是一個解決方案,但我會將xml作爲字符串,小寫它,再次導入爲xml,並安全地使用區分大小寫的搜索。 – jayarjo 2011-01-13 09:14:06

+0

@jayarjo:...它會將XML中的所有字符數據內容小寫 - 不是一種安全的方式來處理除了不區分大小寫的屬性名稱搜索以外的任何其他用途的XML。 – weltraumpirat 2011-01-13 10:06:56

回答

9

請從XML規範重新仔細閱讀您的報價:

XML處理器應該在不區分大小寫的 方式

這是章匹配字符 編碼名稱4.3.3中描述的character encoding declarations的規格,並且它指的是只有的名稱存在於encoding的值中<?xml>處理指令,例如"UTF-8""utf-8"。我完全沒有理由將它應用於文檔中任何位置的屬性名稱和/或元素名稱。

事實上,在規範的第2.3節(Common Syntactic Constructs)中沒有提及此處,其中指定了名稱和名稱標記。對特殊字符等有一些限制,但對大小寫字母絕對沒有限制。

要做比較不區分大小寫的,你必須做在Flash:

for each (var attr:XML in [email protected]*) { 
    if (attr.name().toString().toLowerCase() == test.toLowerCase()) // attribute present if true 
} 

或者說:

var found:Boolean = false; 
for each (var attr:XML in [email protected]*) { 
    if (attr.name().toString().toLowerCase() == test.toLowerCase()) { 
     found = true; 
     break; 
    } 
} 
if (found) // attribute present 
else // attribute not present 
0

如何使用XML的contains()方法或XMLList的length()方法?

例如

var xml:XML = <root><child id="0" /><child /></root>; 

trace(xml.children()[email protected]());//test if any children have the id attribute 
trace(xml.child[1][email protected]());//test if the second node has the id attribute 
trace(xml.contains(<nephew />));//test for inexistend node using contains() 
trace(xml.children().nephew.length());//test for inexistend node using legth()