Spidermonkey中的E4X过滤

时间:2011-06-11 21:51:46

标签: e4x spidermonkey jsfl

我在SpiderMonkey中使用E4X,并且大部分语言看起来都非常可靠,但我无法过滤工作:

var xml = <root>
    <person id="dave">Dave</person>
    <person id="ian">Ian</person>
    <person>John</person>
</root>

trace( xml.*.(name() == 'person') );
trace( xml.*.(attribute('@id')) );

预期:

<person id="dave">Dave</person>
<person id="ian">Ian</person>
<person>John</person>

<person id="dave">Dave</person>
<person id="ian">Ian</person>

结果:

ReferenceError: name is not defined
ReferenceError: attribute is not defined

我甚至无法使hasOwnProperty()工作:

xml.*.(trace( hasOwnProperty('@id') ));

false
false
false

具体来说,我在Flash中使用JSFL,它使用SpiderMonkey引擎。

到目前为止,根据我对E4X的基本知识,这是非常意外/错误的,对吧?因为我可以在ActionScript / FlashPlayer中使这些表达式正常工作!

谢谢, 戴夫

2 个答案:

答案 0 :(得分:2)

好的,所以我尝试了很多东西,但我仍然无法使原始语法工作,所以我能得到的最好(考虑到这是一个非常好的解决方法)是扩展XMLList原型并添加filter()方法:

XMLList.prototype.function::filter = function(callback)
{
    var output  = new XMLList();
    var length  = input.length();
    for(var i = 0; i < length; i++)
    {
        if(callback(input[i], i, input))
        {
            output += input[i];
        }
    }
    return output;
}

所以使用以下XML ...

var xml = <root>
    <person id="dave">Dave</person>
    <person id="ian">Ian</person>
    <person>John</person>
    <group>
        <person id="jane">Jane</person>
        <person>Sarah</person>
    </group>
</root>

抓取和过滤节点非常直观:

// old
var nodes = xml..person.( hasOwnProperty('@id') );

// new
var nodes = xml..person.filter( function(node){ return node.hasOwnProperty('@id'); } );

<person id="dave">Dave</person>
<person id="ian">Ian</person>
<person id="jane">Jane</person>

如果有人可以纠正我,我会非常高兴,如果没有,我只想知道为什么我的原始过滤不起作用。

戴夫

答案 1 :(得分:0)

filter函数发布的here的答案进行了小幅修正:

XMLList.prototype.function::filter = function(callback)
{
    var output  = new XMLList();
    var input = this;
    var length  = input.length();
    for(var i = 0; i < length; i++) {
        //console.println(i + ", " + input[i]);
        if(callback(input[i], i, input))
        {
            //console.println("Yes");
            output += input[i];
        }
    }
    //console.println('output = ' + output);
    return output;
}

最初的解决方案是最好的,这正是我想要的!