我对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>
答案 0 :(得分:2)
您可以使用以下XPath表单根据Computer
的{{1}}属性和Location
后代元素值返回id
元素:
Set
答案 1 :(得分:1)
$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)