2016-11-23 27 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轻松找到)可以做些什么。