JavaScript / Rhino:我可以在E4X查询中使用正则表达式来仅选择某些节点吗?

时间:2009-10-19 15:56:03

标签: javascript rhino e4x mirth

我正在研究Rhino(Mirth),我必须使用以下结构处理/解析XML:

<root>
<row>
<foo-1 />
<foo-2 />
<foo-3 />
<foo-4 />
...
<bar-1 />
<bar-2 />
<bar-3 />
<bar-4 />
...
<something-else-1 />
<something-else-2 />
</row>
</root>

我想只获取所有“foo”节点,尽可能避免使用循环。我一直在尝试像:

xml.row.(new RegExp("foo[1-4]").test()))

和同一行的一些变体,但它似乎不起作用。有没有任何E4X语法/方法来完成这个?我已经谷歌搜索了一段时间,我已经阅读了ECMAS文档,但我无法完成这项工作。

提前致谢!

4 个答案:

答案 0 :(得分:1)

xml.row.*.( /foo-[1-4]/.test(function::localName()) )

答案 1 :(得分:1)

顺便说一句,你也可以在没有正则表达式的情况下做到这一点。

var foo = xml.row.*.(String(localName()).indexOf("foo-") == 0);
alert(foo.length() + "\n" + foo.toXMLString());

答案 2 :(得分:0)

这是你应该能够做到的方式,但它在Rhino中不起作用:

xml.row.*.( /foo-[1-4]/.test(name()) ) // or localName()

目前,据我所知,您需要使用循环。

如果你不介意获取数组而不是XMLList ,并且你的Rhino版本支持数组理解,你可以使用它:

[foo for each (foo in xml.row.*) if (/foo-[1-4]/.test(foo.name()))]

它仍然使用一个循环,但它至少要声明一点。

修改:与评论中提到的Elijah Gray一样,如果您使用的是名称空间,则需要致电localName()name().localName。当然,要完全正确,您还需要比较命名空间URI。

另外,显然,SpiderMonkey(Firefox)要求您在过滤谓词中使用function::为函数调用加前缀,因此过滤器将如下所示:

/foo-[1-4]/.test(function::name()) // or function::localName()

通常,Rhino遵循SpiderMonkey的功能,因此当它支持谓词中的函数调用时,您可能需要function::前缀。

答案 3 :(得分:0)

A bug已针对此行为针对Rhino开放。如果你觉得自己很勇敢,你可能想尝试一下Martin Blom提出的patch,如对bug的评论中所述。