首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XPath按节点、子节点和子节点条件选择节点

XPath按节点、子节点和子节点条件选择节点
EN

Stack Overflow用户
提问于 2015-12-04 14:23:47
回答 2查看 418关注 0票数 3

我想检索所有节点,并应用一个节点、子节点和子节点条件。

我尝试使用这个xpath命令来接收它:

代码语言:javascript
复制
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如下所示:

代码语言:javascript
复制
<?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的输入,我添加了一些更多的解释:

  • 我想要WorkItem-- WorkItemType 'Product‘的元素,其中只有WorkItem-- WorkItemType 'Task’的元素作为任何类型的子类(子代、孙子孙辈等等)。

在设计的时候,孩子们被包裹的程度还不清楚。我更新了我的问题。(我在xml文件中更正了我的->儿童错误)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-04 16:44:19

还不完全清楚您试图实现什么,但是重新格式化您的代码,您似乎有几个重要的测试:

代码语言:javascript
复制
//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 =“Product项目”,以及
  • 没有名为WorkItemType和内容“Task”的子节点

可翻译为:

代码语言:javascript
复制
//WorkItem[
     WorkItemType[text()='Product Backlog Item'] and
     not(Children//WorkItemType[text() != 'Task'])
]
票数 3
EN

Stack Overflow用户

发布于 2015-12-04 16:47:27

而不是这个。

代码语言:javascript
复制
./Childern/WorkItem/WorkItemType[text() != 'Product Backlog Item']

用这个:

代码语言:javascript
复制
not(./Childern/WorkItem/WorkItemType[text() = 'Product Backlog Item'])

如果至少有一个true匹配条件(第一个文本节点子节点不等于'Product Backlog Item'),则前者的计算结果为'Product Backlog Item'。与后者形成对比,后者的计算结果只有在没有匹配条件(第一个文本节点子节点等于true )的情况下才算成WorkItemType

因此,完整的XPath看起来如下(为可读性格式化):

代码语言:javascript
复制
//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']
]

更新:

在回应最新问题时,我会这样做:

代码语言:javascript
复制
//WorkItem[WorkItemType[text()='Product Backlog Item']]
          [not(.//WorkItem/WorkItemType/text() != 'Task')]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34090489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档