我有一个带有谓词选择的XPath表达式 使用嵌套元素中的人名和ID XPathNavigator.Select方法。
这有效:
root/all_clients/client/client_name_and_ID[client_ID = 'xxx']
这也有效:
root/all_clients/client[client_name_and_ID/client_ID = 'xxx']/client_name_and_ID
当我将谓词提升到下一个级别时,它不起作用:
root/all_clients[client/client_name_and_ID/client_ID = 'xxx']/client/client_name_and_ID
我没有得到任何过滤,而是整套。
这是由于ASP.NET内部的XPath固有的限制, 或者我在做一些愚蠢的事情?
以下是相关XML文件的片段:
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="file:///n:\Projects\XML\Medical\Example_01.xsd">
<all_clients>
<client>
<client_name_and_ID>
<first_name>Fred</first_name>
<middle_name>James</middle_name>
<last_name>Bowman</last_name>
<client_ID>1</client_ID>
</client_name_and_ID>
</client>
<client>
<client_name_and_ID>
<first_name>Mark</first_name>
<middle_name>David</middle_name>
<last_name>Colder</last_name>
<client_ID>2</client_ID>
</client_name_and_ID>
</client>
<client>
<client_name_and_ID>
<first_name>Joe</first_name>
<last_name>Lewis</last_name>
<client_ID>3</client_ID>
</client_name_and_ID>
</client>
<client>
<client_name_and_ID>
<first_name>Sam</first_name>
<last_name>Plank</last_name>
<client_ID>4</client_ID>
</client_name_and_ID>
</client>
</all_clients>
</root>
答案 0 :(得分:0)
最后一个查询匹配包含任何匹配客户端的all_clients元素。然后,它会选择此all_clients下的客户端,而不应用过滤器,因此它会选择所有客户端元素。
您应该在XPath结束时保存过滤器。首先选择所需的元素类型,然后对这些元素应用过滤器。试试这些XPath:
<!-- Select client_ID element. -->
root/all_clients/client/client_name_and_ID/client_ID[. = 'xxx']
<!-- Select client_name_and_ID element. -->
root/all_clients/client/client_name_and_ID[client_ID = 'xxx']
<!-- Select client element. -->
root/all_clients/client[client_name_and_ID/client_ID = 'xxx']
答案 1 :(得分:0)
这是正常的。所有client
个节点都是all_clients
节点的子节点。因此,它始终符合条件“所有名为all_clients
的元素至少有一个后代client/client_name_and_ID/client_ID = 'xxx'
的匹配”,这是您编码的。