在我对XPath的理解中,我已经到了一个绊脚点。我可以在没有太多麻烦的情况下进行基本的选择,但是我现在需要选择节点,不仅要根据它们是哪个节点,而且还要基于它们是否包含特定的节点,并且我不断地沿着一个大选择的路径,然后做循环,如果跳舞来削减它。不知怎么的,我想我在XPath中错过了一些巧妙的技巧,可以在一条语句中准确地做到这一点。
因此,考虑到下面的XML,我希望最后得到一组计算机节点,它基于特定的位置id和集合中存在的特定值。所以,$location =阿姆斯特丹& $set = Viz应该只返回A-1计算机,但是$location =阿姆斯特丹& $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>发布于 2015-06-13 10:55:52
您可以使用以下XPath表单根据Location的id属性和Set子代元素值返回Computer元素:
//Location[@id='some_id']/Computer[ConformSets/Set='some_set_value']发布于 2015-06-13 11:09:36
好吧,该死的。发一个问题,然后有顿悟。我的Google搜索中没有找到除特定节点的属性之外的谓词示例,也没有找到比子节点更深的从属项示例。但是在一只云雀上,我把相对路径设置到谓词中,而Woot,这是可行的!
$selection = $global:jobsXml.selectNodes("/Management/Computers/Location[@id='$($location)']/Computer[ConformSets/Set='$($set)']")发布于 2015-06-13 11:10:02
您可以使用..从匹配(子)节点返回:
$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)https://stackoverflow.com/questions/30817821
复制相似问题