2016-11-23 61 views
0

說我有一個XPath字符串,如/Results/Bill[Item[id]]/id。我需要將名稱空間信息添加到路徑,以便將路徑轉換爲:/*:Results/*:Bill[*:Item[*:id]]/*:id使用正則表達式修改XPath字符串,Java

我想使用正則表達式來做到這一點,像「prepend」*:「任何字母數字字符,前面沒有另一個字母數字字符」。然而,我沒有太多的正則表達式知識,也不知道這會對應什麼正則表達式(我計劃在有正則表達式時使用Java的replaceAll()函數)。另外,任何人都可以想到一個反例,我的想法不行?我只是用簡單的謂詞(即方括號中沒有and,or等)對XPath字符串執行替換操作。

+0

如果您所需要的只是將'*:'替換爲任何字母數字/下劃線的單詞,請將'\ w +'替換爲'*:$ 0'。 –

回答

1

您可能會得到一個正則表達式解決方案來處理某種類型的XPath表達式子集,但您永遠無法使用它處理所有XPath表達式。 XPath語法太複雜了。

(在最初的提案最明顯的缺陷是它失敗的變量的名稱,如$var,像count(..)函數名和軸的名字,如parent::*@code。你可以解決由之前或符號後,檢查相關的標點檢查註釋或字符串文本中的文本有點棘手,但將「div」作爲元素名稱與作爲運算符的「div」區分開來,遠遠超出了正則表達式方法所能做到的:它需要一個完整的上下文相關的解析器。

更好的建議:使用爲XPath表達式提供解析樹的工具,修改該解析樹,然後將修改後的樹重新序列化爲XPath語法。

請參閱Gunther Rademacher的Rex工具或W3C XQuery解析器小程序(都可以通過Google輕鬆找到)可以做些什麼。