我正在研究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文档,但我无法完成这项工作。
提前致谢!
答案 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)