Flash Builder 4.6中使用E4X过滤的奇怪行为

时间:2012-08-16 15:16:28

标签: actionscript-3 flash-builder e4x

我的程序中有一种非常奇怪的行为,在尝试了很多东西并在这里搜索可能的答案但没有成功之后,我决定在这里问一个新的问题。 所以这是我的问题:

我正在使用describeType(),因此得到了一个描述我的类的E4X XML对象。我的类有一个没有参数的元数据[表]:

[Table]
class MyClass extends ORM
{
    [...]

调试时的XML对象是正确的:

trace(xmlDescription.metadata.@name[0]);
// output "Table"
trace(xmlDescription.metadata.(@name == "Table").length());
// output... 0!!!!

同样检查XML对象我得到了所需节点的正确结构:

<metadata name="Table"/>

在进行研究时,我记得XML.ignoreWhitespace属性。我试着在调用describeType()之前将其设置为false,但没有改变

所以任何想法我怎么能在XML类型变量中获取这个元数据节点,我应该在逻辑上使用它(但我得到null作为结果):

xmlDescription.metadata.(@name == "Table")[0]

???

提前致谢

PS:我正在使用Flash Builder 4.6

1 个答案:

答案 0 :(得分:0)

哇,在Facebook上分享这个问题并不希望得到任何答案之后,我得到了一位老同事的工作:

显然Flash Builder 4中出现了一个错误,我的问题在于它的范围。要“修复”它,你必须使用String类型的局部变量才能使它工作。 所以替换下面的代码就可以了:

// before:
public function uniqueMetadata( metadataName : String ) : ReflectionMetadata
{
    var x : XML = xmlDescription.metadata.(@name == metadataName)[0];
    // x is null here

// after
public function uniqueMetadata( metadataName : String ) : ReflectionMetadata
{
    var s : String = metadataName,
        x : XML = xmlDescription.metadata.(@name == s)[0];
    // x is not null and contain the desired node!

是的,奇怪的奇怪的解决方法。我真的不明白这样的错误是怎么发生的......

无论如何,现在它正在工作,我正在我的代码中寻找其他地方,我需要在执行一些E4X过滤之前复制相同类型的局部变量中的参数值