【问题标题】:Regex to modify xpath expression正则表达式修改 xpath 表达式
【发布时间】:2017-04-28 08:45:30
【问题描述】:

我必须使用我正在使用 DOMParser 的 Java 代码来验证 Xpath 表达式。我面临的问题是,对于默认命名空间,我需要先调整 xpath,然后才能通过代码对其进行评估。例如如果我想使用以下 xpath -

//party[@id='party1:abc']/abc:person[@id='Trader']/trade/abc:personId[@personIdScheme='urn:xyz:person-id:PEOPLESOFT']/text()

我需要将其传递给代码 -

//:party[@id='party1:abc']/abc:person[@id='Trader']/:trade/abc:personId[@personIdScheme='urn:xyz:person-id:PEOPLESOFT']/text()

所以基本上要求是在默认命名空间适用的所有相关节点之前放置一个:

有人可以帮助使用可以有效进行此转换的正则表达式吗?

【问题讨论】:

  • 我不确定这是否是最好的方法,我认为应该有一种方法可以设置默认命名空间之类的。
  • @Aaron 在代码中我们使用了 setNamespaceContext 并在命名空间缓存中添加了 DEAFULT_NS。但即便如此,Xpath 也需要进行调整。希望这是有道理的。
  • 你不想:在 abc 之前?
  • @kushal。引号中的任何内容都不应转换
  • 替代方法:为什么不使用在静态上下文中设置默认命名空间(用于元素和类型)的 XPath 2.0 解析器?

标签: java regex xml xpath


【解决方案1】:

如果步骤中还没有:,您似乎只是在/ 之后添加:,所以这可能有效:

match /(\w+[[/])
replace with /:\1

至少是works on your example data

【讨论】:

  • 不过,不要太相信这个答案,我怀疑正则表达式是解决您问题的相关解决方案,并且尝试使用它来限定每个可能的步骤将是一项艰巨的任务。例如,我没有理会谓词,因为您的所有谓词都只针对固定文本测试属性
  • 无论如何感谢您的帮助,但目前接受的答案似乎正在发挥作用
【解决方案2】:
String str = "//party[@id='party1:abc']/abc:person[@id='Trader']/trade/abc:personId[@personIdScheme='urn:xyz:person-id:PEOPLESOFT']/text()";
str = str.replaceAll("/(?=\\w.*?/)(?![^\\[/]*:)","/:");

正则表达式查找不是最后一个的/,并且后跟一个单词字符。
它还会忽略那些在[/ 之前已经有: 的人。

【讨论】:

  • 它可能适用于这个单一的测试用例,但它会在许多其他用例上失败。例如,如果“/”后有空格,或者使用语法 /text(),则会失败。
  • @MichaelKay 它必须紧跟一个单词字符。并且空格不是单词字符,因此它不会替换那些。因为它后面必须跟一个/,所以它会改变/text()/,而不是/text()。这应该在可接受的范围内,因为您通常看不到前者的 xpath。
  • 啊,“可接受的限制”。我似乎是老派,我倾向于认为软件必须始终正常工作,而不仅仅是在隔壁的星期二。
  • 那么可能不是YAGNI 原则的忠实拥护者。
  • 您在 StackOverflow 上花费的时间越多,您就越会意识到人们通过使用编码捷径让自己(和其他人)陷入混乱。
【解决方案3】:

我知道这不是你问的,但它可能符合你的目的:

String yourXPATH = "//party[@id='party1:abc']/abc:person[@id='Trader']/trade/abc:personId[@personIdScheme='urn:xyz:person-id:PEOPLESOFT']/text()";

String[] str = yourXPATH.slit("/");

String myStr = null;

while(int i=0; i<str.length; i++){
    if(i==0){
      myStr= str[i] +"/";


    }else{

    myStr = myStr + "/:" + str[i];

    }


}

//then you can use myStr as the New Xpath

【讨论】:

    【解决方案4】:

    如果您需要它来处理任何可能的 XPath 表达式,那么使用正则表达式的解决方案是不可能的,因为正则表达式的功能不足以解析像 XPath 这样的递归语法。您将需要一个完整的 XPath 解析器。周围有几个,例如雷克斯。

    【讨论】:

    • 您能否分享一些指向这些 XPath 解析器的链接?我很难找到好的。
    • 我们使用了三个:Saxon 产品中的 XPath 解析器,使用 Gunther Rademacher 的 REx 生成的解析器,以及位于 w3.org/2011/08/qt-applets 的 W3C 小程序。如果可以的话,我建议使用 W3C 版本:它以 XQueryX 格式生成输出,使用 XSLT 或 XQuery 转换应该相当容易,然后转换回 XPath 字符串形式。
    猜你喜欢
    • 2014-04-14
    • 1970-01-01
    • 2022-11-19
    • 2015-04-08
    • 2013-02-07
    • 1970-01-01
    相关资源
    最近更新 更多