我有一个像这样的实体的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
我应该如何构建表达式?
答案 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
。