高级XPath SelectNodes条件

时间:2015-06-13 10:50:47

标签: powershell xpath

我对XPath的理解达到了绊脚石。我可以毫不费力地进行基本选择,但我现在需要不仅根据它们所属的节点选择节点,还要根据它们是否包含特定节点来选择节点,并且我一直在寻找自己的节点。一个大的选择的路径,然后做循环和如果舞蹈削减它。不知何故,我认为我在XPath中错过了一些巧妙的技巧,可以在一个语句中完成这个。

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

那么,这是否可以完全在XPath语句中完成?如果没有,是否有一个漂亮的Powershell管道技巧?或者,我最好的选择是使用XPath来解决位置和循环问题,以及如何消除集合?

<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>

3 个答案:

答案 0 :(得分:2)

您可以使用以下XPath表单根据Computer的{​​{1}}属性和Location后代元素值返回id元素:

Set

答案 1 :(得分:1)

嗯,嗯。发一个问题,然后顿悟。我的Google搜索没有发现任何谓词的例子,除了特定节点的属性,或者Descendants比Child节点更深。但是在云雀上我把相对路径设置为Set到谓词,Woot,这是有效的!

$selection = $global:jobsXml.selectNodes("/Management/Computers/Location[@id='$($location)']/Computer[ConformSets/Set='$($set)']")

答案 2 :(得分:0)

您可以使用..从匹配(子)节点恢复工作:

$location = 'Amsterdam'
$set      = 'Arch'
$xpath    = "//Location[@id='$location']/Computer/*/Set[text()='$set']/../.."

$xml.SelectNodes($xpath)

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

$location = 'Amsterdam'
$set      = 'Arch'
$xpath    = "//Location[@id='$location']/Computer[ConformSets/Set='$set']"

$xml.SelectNodes($xpath)