问题描述
<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>
$attribute = "pc25"
我可以创建一个包含所有节点名称的数组并存储其值,但是,如何循环遍历该数组以查找与可匹配对象的匹配项?
$array = @($xml.SelectNodes("//name"))
解决方法
您可以使用如下所示的foreach
[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>'
foreach ($var in $xml.bds.bd) {
$var
}
获取名称的名称属性值
foreach ($var in $xml.bds.bd) {
$var.servers.name
}
,
由于无论如何您都是通过System.Xml.XmlDocument.SelectNodes()
方法使用XPath查询,因此可以将名称过滤集成到该查询中(请注意,我使用$value
而不是$attribute
变量名称以避免混淆):
$array = @($xml.SelectNodes("//name[. = '$value']/../.."))
请注意,以上代码返回了包含<bd>
子路径中包含搜索词的servers/name
元素。如果您确实只希望使用<name>
元素,请省略/../..
部分。
一种表示上述内容的更健壮的方式,通过相关后代元素的内容直接匹配bd
元素,这些元素由它们的相对路径标识:
$array = @($xml.SelectNodes("/bds/bd[servers/name = '$value']"))