xpath表达式匹配以变量结尾的文本

时间:2013-01-24 07:02:12

标签: java regex xpath

我有一个像这样的实体的XML:

<Entity>
    <Name>Lwresd_Dns_Server|LwresdDnsServer</Name>
 </Entity   

<Entity>
   <Name>Lwresd_Dns_Server_Data|LwresdDnsServerData</Name>
</Entity>

我的xpath表达式是
        XPathExpression expr = xpath1.compile("//Entity[matches(Name,'" +line+ "')]");

其中line是值为LwresdDnsServer的变量。

上面的xpath表达式匹配两个实体,我需要它只匹配第一个实体,即

Lwresd_Dns_Server|LwresdDnsServer

我应该如何构建表达式?

2 个答案:

答案 0 :(得分:1)

我相信这应该可以解决问题:

XPathExpression expr = 
    xpath1.compile("//Entity[contains(concat('|', Name, '|'),'|" +line+ "|')]");

这会将| s中包含的实体名称与| s中包含的变量名称进行比较,因此您可以得到类似的内容:

contains('|Lwresd_Dns_Server|LwresdDnsServer|', '|LwrestDnsServer|') => Yes
contains('|Lwresd_Dns_Server_Data|LwresdDnsServerData|', '|LwrestDnsServer|') => No

结果,只选择了两个实体中的第一个。

如果您想要找到 line结尾的实体(而不仅仅是那些包含完全匹配的实体),那么您可以这(假设值保证不包含字符$ - 如果有可能它包含$,你应该选择一个肯定不会包含的不同分隔符,或者使用Dimitre Novatchev's回答这个问题):

XPathExpression expr = 
    xpath1.compile("//Entity[contains(concat(Name, '$'),'" +line+ "$')]");

我没有在XPath中使用matches()函数(它在XPath 1.0中不受支持),但我怀疑如果您的XPath评估程序,以下内容也适用于在实体名称的末尾查找值支持matches()

XPathExpression expr = 
    xpath1.compile("//Entity[matches(Name,'" +line+ "$')]");

此处,$是字符串结尾的RegEx符号。

答案 1 :(得分:0)

这是一个XPath 1.0表达式,它实现了XPath 2.0函数ends-with($s, $t)的功能

substring($s, string-length($s) - string-length($t) +1) = $t

您可以使用特定字符串替换上面的$s$t