xml - XPath 按节点、子节点和子子节点条件选择节点

标签 xml xpath nodes treenode

我想检索应用了节点、子节点和子子节点条件的所有节点

我尝试用这个 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/

相关文章:

xml - ASP.NET Core 1.0 Web API 不返回 XML

java - 树节点可以同时是根节点和叶节点吗?

java - 使用 Java 将 TXT 转换为 XML 的简单示例

HtmlUnit - 无法从 div 获取 anchor

XSLT 函数获取节点的 xpath

xpath - EclipseLink MOXy @XmlPath 支持谓词不等式

javascript - 使用javascript从XML字符串中获取节点值

c++ - 确定链表中的第一个节点

xml - Golang xml.Unmarshal 任意元素

c# - XmlSerializer 和类和 xml 属性中的不同字段