1

我有一个带有这样的实体的 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 是一个具有 value 的变量LwresdDnsServer

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

Lwresd_Dns_Server|LwresdDnsServer

我应该如何构建表达式来做到这一点?

4

2 回答 2

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实体(而不仅仅是那些包含与其完全匹配的实体),那么您可以这样做(假设这些值保证不包含该字符$- 如果有可能它包含 a $,您应该选择一个绝对不包含的不同分隔符,或者使用 Dimitre Novatchev 对这个问题的回答):

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

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

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

这里,$是字符串结尾的正则表达式符号。

于 2013-01-24T07:16:37.027 回答
0

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

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

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

于 2013-01-24T13:13:11.403 回答