我想检索所有节点,并应用一个节点、子节点和子节点条件。
我尝试使用这个xpath命令来接收它:
xmlDoc.SelectNodes("//WorkItem[WorkItemType[text()='Product Backlog Item'] and ./Childern/WorkItem/WorkItemType[text() = 'Task'] and /Childern/WorkItem/WorkItemType[text() != 'Product Backlog Item'] and ./Childern/WorkItem/WorkItemType[text() = 'Task']]");这没有给我任何节点。但是我期望Id为: 719和720的WorkItem节点,而不是717
我如何用XPath来表达这一点?
给定的xml如下所示:
<?xml version="1.0" encoding="utf-8"?>
<root>
<id>716</id>
<WorkItemType>Product Backlog Item</WorkItemType>
<Children>
<WorkItem>
<id>717</id>
<WorkItemType>Product Backlog Item</WorkItemType>
<Children>
<WorkItem>
<id>719</id>
<WorkItemType>Product Backlog Item</WorkItemType>
<Children>
<WorkItem>
<id>721</id>
<WorkItemType>Task</WorkItemType>
<Children>
<WorkItem>
<id>722</id>
<WorkItemType>Task</WorkItemType>
<Children/>
</WorkItem>
</Children>
</WorkItem>
</Children>
</WorkItem>
<WorkItem>
<id>720</id>
<WorkItemType>Product Backlog Item</WorkItemType>
<TreeLevel>2</TreeLevel>
<Children>
<WorkItem>
<id>724</id>
<WorkItemType>Task</WorkItemType>
<Children>
<WorkItem>
<id>726</id>
<WorkItemType>Task</WorkItemType>
<Children/>
</WorkItem>
</Children>
</WorkItem>
</Children>
</WorkItem>
<WorkItem>
<id>723</id>
<WorkItemType>Task</WorkItemType>
<Children>
<WorkItem>
<id>744</id>
<WorkItemType>Task</WorkItemType>
<Children/>
</WorkItem>
</Children>
</WorkItem>
</Children>
</WorkItem>
</Children>
</root>更新
由于Rander的输入,我添加了一些更多的解释:
在设计的时候,孩子们被包裹的程度还不清楚。我更新了我的问题。(我在xml文件中更正了我的->儿童错误)。
发布于 2015-12-04 16:44:19
还不完全清楚您试图实现什么,但是重新格式化您的代码,您似乎有几个重要的测试:
//WorkItem[
WorkItemType[text()='Product Backlog Item'] and
./Childern/WorkItem/WorkItemType[text() = 'Task'] and
/Childern/WorkItem/WorkItemType[text() != 'Product Backlog Item'] and
./Childern/WorkItem/WorkItemType[text() = 'Task']
]您对“等于'Task‘进行了两次测试,不应该同时检查它是否等于’Task‘,并且与'Product’项不同。
您可以使用//检查“任何子女或孙子女”,因此:
可翻译为:
//WorkItem[
WorkItemType[text()='Product Backlog Item'] and
not(Children//WorkItemType[text() != 'Task'])
]发布于 2015-12-04 16:47:27
而不是这个。
./Childern/WorkItem/WorkItemType[text() != 'Product Backlog Item']用这个:
not(./Childern/WorkItem/WorkItemType[text() = 'Product Backlog Item'])如果至少有一个true匹配条件(第一个文本节点子节点不等于'Product Backlog Item'),则前者的计算结果为'Product Backlog Item'。与后者形成对比,后者的计算结果只有在没有匹配条件(第一个文本节点子节点等于true )的情况下才算成WorkItemType。
因此,完整的XPath看起来如下(为可读性格式化):
//WorkItem[
WorkItemType[text()='Product Backlog Item']
and
./Childern/WorkItem/WorkItemType[text() = 'Task']
and
not(./Childern/WorkItem/WorkItemType[text() = 'Product Backlog Item'])
and
./Childern/WorkItem/WorkItemType[text() = 'Task']
]更新:
在回应最新问题时,我会这样做:
//WorkItem[WorkItemType[text()='Product Backlog Item']]
[not(.//WorkItem/WorkItemType/text() != 'Task')]https://stackoverflow.com/questions/34090489
复制相似问题