尝试从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”
提前感谢您的帮助!
答案 0 :(得分:5)
您发布的代码无法运行。您的XML数据只有一个<env>
节点,因此您的循环遍历具有2个属性(prod
和nonProd
)的单个对象,因此检查$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}}的节点。