我在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中使这些表达式正常工作!
谢谢, 戴夫
答案 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;
}
最初的解决方案是最好的,这正是我想要的!