Foreach通过XML文档与Powershell返回多个节点

时间:2017-07-18 14:11:38

标签: xml powershell

尝试从XML文档中收集服务器和环境信息。但是,当我使用foreach循环迭代文档时,它会返回树中的两个节点,而不是一次返回一个节点。

[xml]$xmlDoc = [xml](Get-Content("C:\temp\compareVHD_info.xml"))

foreach($env in $xmlDoc.pvs.env)
{
    if($env -eq "prod")
    { do stuff}
}

XML:

<pvs>
  <env>
    <prod>
        <primaryServer>
            <name>name</name>
            <storePath>path</storePath>
        </primaryServer>
        <secondaryServer>
            <name>name</name>
            <storePath>path</storePath>
        </secondaryServer>
    </prod>
    <nonProd>
        <primaryServer>
            <name>name</name>
            <storePath>path</storePath>
            <storePath>path</storePath>
            <storePath>path</storePath>
            <storePath>path</storePath>
        </primaryServer>
        <secondaryServer>
            <name>name</name>
            <storePath>path</storePath>
            <storePath>path</storePath>
            <storePath>path</storePath>
            <storePath>path</storePath>
        </secondaryServer>
    </nonProd>
  </env>
</pvs>

我正在尝试收集主要和辅助服务器名称,存储路径和存储路径。但是,当我使用上面的代码时,它会在$ env变量中返回“prod nonProd”

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

您发布的代码无法运行。您的XML数据只有一个<env>节点,因此您的循环遍历具有2个属性(prodnonProd)的单个对象,因此检查$env -eq "prod"将始终进行评估到$false。您真正想要的是选择<primaryServer>和/或<secondaryServer>节点并输出其子节点的值。

[xml]$xml = Get-Content 'C:\path\to\input.xml'

$xml.SelectNodes('//prod/primaryServer') | ForEach-Object {
    New-Object -Type PSObject -Property @{
        Name = $_.name
        Path = $_.storePath -join ';'
    }
} | Export-Csv 'C:\path\to\output.csv' -NoType

如果你想在同一个文件中使用主要版本和辅助版本,如果还有其他同级节点,则将XPath expression更改为//prod/*[self::primaryServer or self::secondaryServer],或者如果这些是唯一的孩子,则将//prod/*更改为<prod> {{1}}的节点。