【问题标题】:XPath string modification using regex, Java使用正则表达式、Java 修改 XPath 字符串
【发布时间】:2016-11-23 17:36:15
【问题描述】:

假设我有一个像 /Results/Bill[Item[id]]/id 这样的 XPath 字符串。我需要将命名空间信息添加到路径中,以便将路径转换为:/*:Results/*:Bill[*:Item[*:id]]/*:id

我正在考虑使用正则表达式来执行此操作,例如“将“*:”添加到任何前面没有另一个字母数字字符的字母数字字符”。但是,我没有太多的正则表达式知识,也不知道这对应于什么正则表达式(一旦我有了正则表达式,我打算使用 Java 的 replaceAll() 函数)。另外,谁能想到一个我的想法行不通的反例?我将使用简单的谓词(即方括号之间没有andor 等)对XPath 字符串执行替换操作。

【问题讨论】:

  • 如果您只需要在任何字母数字/下划线单词前面加上 *:,请将 \w+ 替换为 *:$0

标签: java regex xpath


【解决方案1】:

您可能会得到一个正则表达式解决方案来处理 XPath 表达式的某种子集,但您永远不会让它处理所有 XPath 表达式。 XPath 语法太复杂了。

(您最初提案中最明显的错误是它在变量名(如$var)、函数名(如count(..))和轴名(如parent::*@code)上失败。你可以通过检查符号之前或之后的相关标点符号。检查 cmets 或字符串文字中的文本有点棘手。但是将“div”作为元素名称与“div”作为运算符区分开来,远远超出了正则表达式方法的能力:它需要一个完整的上下文相关解析器。)

更好的建议:使用为您提供 XPath 表达式解析树的工具,修改该解析树,然后将修改后的树重新序列化为 XPath 语法。

例如,看看可以使用 Gunther Rademacher 的 Rex 工具或 W3C XQuery 解析器小程序(都可以通过 google 轻松找到)来完成什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多