2

私は 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

具体的には、SpiderMonkey エンジンを使用する Flash で JSFL を使用しています。

これまでの E4X に関する私の基本的な知識からすると、これはかなり予想外/バグだらけですよね? これらの式を ActionScript / FlashPlayer で問題なく動作させることができます。

ありがとう、デイブ

4

2 に答える 2

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>

誰かがこれについて私を訂正できるなら、私はとてもうれしいです、そうでなければ、私は私の元のフィルタリングがうまくいかなかった理由を知りたいだけです。

デイブ

于 2011-06-12T11:33:39.173 に答える