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()))]

それでもループを使用しますが、少なくとももう少し宣言的です。

編集:コメントで言及されているElijah Grayのように、名前空間を使用している場合は、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 によって提案されたパッチを試してみることをお勧めします。

于 2011-09-15T06:07:31.403 に答える