正则表达式修改xpath表达式

时间:2017-04-28 08:45:31

标签: java regex xml xpath

我必须使用我正在使用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()

所以基本上要求是在所有相关节点之前放置:,其中默认命名空间适用。

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

4 个答案:

答案 0 :(得分:1)

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

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

至少works on your example data

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

String str = "//party[@id='party1:abc']/abc:person[@id='Trader']/trade/abc:personId[@personIdScheme='urn:xyz:person-id:PEOPLESOFT']/text()";
str = str.replaceAll("/(?=\\w.*?/)(?![^\\[/]*:)","/:");

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

答案 3 :(得分:0)

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