在as3中测试xml属性的存在

时间:2011-01-13 01:52:24

标签: flex actionscript-3

在ActionScript 3中测试XML对象上是否存在属性的最佳方法是什么?

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

进行测试
   if ( node.@test != node.@nonexistingattribute )

我看到建议使用的评论:

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

但在这两种情况下,测试都区分大小写。

来自XML Specs:“XML处理器应该以不区分大小写的方式匹配字符编码名称”所以我假设属性名称也应该使用不区分大小写的比较匹配。

谢谢

2 个答案:

答案 0 :(得分:9)

请仔细阅读XML规范中的引用:

  

XML处理器应匹配字符   在不区分大小写的情况下编码名称   方式

这是在描述character encoding declarations的规范的第4.3.3章中,它仅将 引用到encoding的{​​{1}}值中的名称处理指令,例如<?xml>"UTF-8"。我认为绝对没有理由将其应用于文档中任何其他位置的属性名称和/或元素名称。

事实上,在规范的第2.3节Common Syntactic Constructs中没有提到这一点,其中指定了名称和名称标记。对特殊字符等有一些限制,但对大写和小写字母完全没有限制

要使您的比较不区分大小写,您必须在Flash中执行此操作:

"utf-8"

或者更确切地说:

for each ( var attr:XML in xml.@*) {
   if (attr.name().toString().toLowerCase() == test.toLowerCase()) // attribute present if true
}

答案 1 :(得分:0)

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

e.g。

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

trace(xml.children().@id.length());//test if any children have the id attribute
trace(xml.child[1].@id.length());//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()