问题描述
<bds>
<bd>
<id>10</id>
<user>john</user>
<servers>
<name>pc24</name>
</servers>
</bd>
<bd>
<id>12</id>
<user>peter</user>
<servers>
<name>pc25</name>
</servers>
</bd>
我有一个函数,我希望它返回一个XML文件,其中包含从节点挂起的所有元素。
$collection = "bds"
$attribute = "name"
$obj = "pc25"
function test () {
if ($xml.SelectNodes("//$attribute").name -eq "name") {
return $xml.SelectNodes("//$attribute").parentnode | Where $attribute -eq $obj
}
else {
return $false
}
}
<id>12</id>
<user>peter</user>
<servers>
<name>pc25</name>
</servers>
解决方法
您可以使用稍微更聪明的XPath来选择节点,然后使用InnerXml
属性来获取所需的输出字符串:
PS> $xml = [xml] @"
<bds>
<bd>
<id>10</id>
<user>john</user>
<servers>
<name>pc24</name>
</servers>
</bd>
<bd>
<id>12</id>
<user>peter</user>
<servers>
<name>pc25</name>
</servers>
</bd>
</bds>
"@
PS> $xml.SelectNodes("bds/bd[servers/name = 'pc25']").InnerXml
<id>12</id><user>peter</user><servers><name>pc25</name></servers>
注意-bds/bd[servers/name = 'pc25']
的意思是“找到所有具有值bds/bd
的子servers/name
节点的pc25
个节点”。
然后您可以根据需要使用XPath字符串中的变量值将其重新安装到函数中。