首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高级XPath SelectNodes准则

高级XPath SelectNodes准则
EN

Stack Overflow用户
提问于 2015-06-13 10:50:47
回答 3查看 398关注 0票数 1

在我对XPath的理解中,我已经到了一个绊脚点。我可以在没有太多麻烦的情况下进行基本的选择,但是我现在需要选择节点,不仅要根据它们是哪个节点,而且还要基于它们是否包含特定的节点,并且我不断地沿着一个大选择的路径,然后做循环,如果跳舞来削减它。不知怎么的,我想我在XPath中错过了一些巧妙的技巧,可以在一条语句中准确地做到这一点。

因此,考虑到下面的XML,我希望最后得到一组计算机节点,它基于特定的位置id和集合中存在的特定值。所以,$location =阿姆斯特丹& $set = Viz应该只返回A-1计算机,但是$location =阿姆斯特丹& $set = Arch应该返回阿姆斯特丹的所有三台计算机。

那么,这是否完全可以在XPath语句中完成呢?如果没有,是否有一个精巧的Powershell管道技巧?还是我最好的选择是使用XPath来寻址位置和循环,以及是否将这些集合压缩?

代码语言:javascript
复制
<Management>
  <Computers>
    <Location id="Amsterdam">
      <Computer id="A-1">
        <ConformSets>
          <Set>Arch</Set>
          <Set>Viz</Set>
        </ConformSets>
      </Computer>
      <Computer id="A-2">
        <ConformSets>
          <Set>Arch</Set>
        </ConformSets>
      </Computer>
      <Computer id="A-3">
        <ConformSets>
          <Set>Arch</Set>
        </ConformSets>
      </Computer>
    </Location>
    <Location id="Berlin">
      <Computer id="B-1">
        <ConformSets>
          <Set>Viz</Set>
        </ConformSets>
      </Computer>
      <Computer id="B-2">
        <ConformSets>
          <Set>Arch</Set>
        </ConformSets>
      </Computer>
      <Computer id="B-3">
        <ConformSets>
          <Set>Arch</Set>
        </ConformSets>
      </Computer>
    </Location>
  </Computers>
</Management>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-13 10:55:52

您可以使用以下XPath表单根据Locationid属性和Set子代元素值返回Computer元素:

代码语言:javascript
复制
//Location[@id='some_id']/Computer[ConformSets/Set='some_set_value']
票数 2
EN

Stack Overflow用户

发布于 2015-06-13 11:09:36

好吧,该死的。发一个问题,然后有顿悟。我的Google搜索中没有找到除特定节点的属性之外的谓词示例,也没有找到比子节点更深的从属项示例。但是在一只云雀上,我把相对路径设置到谓词中,而Woot,这是可行的!

代码语言:javascript
复制
$selection = $global:jobsXml.selectNodes("/Management/Computers/Location[@id='$($location)']/Computer[ConformSets/Set='$($set)']")
票数 1
EN

Stack Overflow用户

发布于 2015-06-13 11:10:02

您可以使用..从匹配(子)节点返回:

代码语言:javascript
复制
$location = 'Amsterdam'
$set      = 'Arch'
$xpath    = "//Location[@id='$location']/Computer/*/Set[text()='$set']/../.."

$xml.SelectNodes($xpath)

或者(按照@har07的建议)为Computer节点使用带有相对路径的谓词:

代码语言:javascript
复制
$location = 'Amsterdam'
$set      = 'Arch'
$xpath    = "//Location[@id='$location']/Computer[ConformSets/Set='$set']"

$xml.SelectNodes($xpath)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30817821

复制
相关文章

相似问题

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