2

我正在研究 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

4 回答 4

1
xml.row.*.( /foo-[1-4]/.test(function::localName()) )
于 2009-10-20T03:10:23.120 回答
1

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

var foo = xml.row.*.(String(localName()).indexOf("foo-") == 0);
alert(foo.length() + "\n" + foo.toXMLString());
于 2009-10-20T05:12:54.007 回答
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()))]

它仍然使用循环,但它至少更具声明性。

编辑:就像评论中提到的以利亚格雷一样,如果您使用命名空间,您需要调用localName()name().localName. 当然,要完全正确,您还需要比较命名空间 URI。

此外,显然,SpiderMonkey (Firefox) 要求您在函数调用前加上function::过滤器谓词,因此过滤器看起来像这样:

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

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

于 2009-10-19T19:00:45.197 回答
0

一个与此行为相关的针对 Rhino的错误已被打开。如果你觉得勇敢,你可能想试试 Martin Blom 提出的补丁,正如对 bug 的评论中所指出的那样。

于 2011-09-15T06:07:31.403 回答