我想检索应用了节点、子节点和子子节点条件的所有节点
我尝试用这个 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']]");
这没有给我提供任何节点。但我希望 WorkItem 节点的 ID 为:719 和 720 但不是 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>
更新
由于 Rolf Rander 的意见,我添加了一些更多的解释:
- 我想拥有 WorkItemType 'Product Backlog Item' 的 WorkItem-elements,其中只有 WorkItem-Elements of WorkItemType 'Task' 作为任何类型的 child ( child 、孙子、孙孙等...)。
设计时尚不清楚 child 封装的深度。我已经更新了我的问题。 (我更正了 xml 文件中的拼写错误 Childern -> Children)。
最佳答案
目前还不完全清楚你试图达到什么目的,但重新格式化你的代码似乎有几个冗余测试:
//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']
]
您测试了两次“等于‘任务’”,没有必要同时检查它等于‘任务’和不同于‘产品待办列表项’。
您可以使用//检查“任何子代或孙代”,因此:
- 任何工作项
- 使用 WorkItemType = 'Product Backlog Item',并且
- Children 下没有名称为 WorkItemType 且内容为“Task”的节点
可以翻译成:
//WorkItem[
WorkItemType[text()='Product Backlog Item'] and
not(Children//WorkItemType[text() != 'Task'])
]
关于xml - XPath 按节点、子节点和子子节点条件选择节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34090489/