如何在Powershell中的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>

我有属性变量,其值为pc25。

$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']"))