2016-11-23 4 views
0

/Results/Bill[Item[id]]/idのようなXPath文字列があります。パスに名前空間情報を追加する必要があります。そのため、パスは/*:Results/*:Bill[*:Item[*:id]]/*:idに変換されます。regex、Javaを使用したXPath文字列の変更

正規表現を使用すると、別の英数字が前に付いていない任意の英数字に "prepend" *などのようなものがあります。しかし、私は非常に正規表現の知識を持っていないし、これに対応する正規表現(私は正規表現を持っていると私はJavaのreplaceAll()関数を使用する予定です)を知りません。また、誰かが私の考えがうまくいかない反例を考えることができますか?簡単な述語でXPath文字列の置換操作を実行するだけです(つまり角括弧の間にはandorなどはありません)。

+0

必要なものがすべて英数字/アンダースコアの単語の前にある場合は、 '\ w +'を '*:$ 0'に置き換えます。 –

答えて

1

ある種のXPath式のサブセットで動作する正規表現の解決法が得られるかもしれませんが、すべてのXPath式では動作しません。 XPath文法は複雑すぎます。

(あなたの最初の提案の中で最も明白なバグが、それは$varのような変数名に失敗したことをparent::*または@codeようcount(..)と軸名などの関数名です。あなたは、シンボルの前または後に、関連する句読点をチェックすることによってこれを解決できますコメントや文字列リテラル内のテキストをチェックするのはちょっと難しいですが、 "div"を要素名として "div"を演算子として見分けることは、正規表現アプローチができることを超えています。

XPath式の解析ツリーを提供するツールを使用して、その解析ツリーを変更し、修正されたツリーをXPath構文に再シリアル化します。

たとえば、Gunther RademacherのRexツールやW3C XQueryパーサーアプレット(どちらもgoogleで簡単に見つかりました)を使って何ができるかを参照してください。

関連する問題