我创建了一个脚本来解析XML文件中的所有服务器名称。条目多于1个时效果很好。
当XML中只有一个条目时,该脚本将无法正常工作。
这是XML:
<Env>
<Web>
<sr id="Server001"></sr>
<sr id="Server002"></sr>
<sr id="Server003"></sr>
</Web>
</Env>
这是PowerShell脚本:
# Load servers list
$pth = "C:\Support\Auto\Config_xml\TEST.xml"
[xml]$css = Get-Content $pth
#
Write-Host "Preparing servers list...."
$sra = @()
for ($i=0; $i -le $css.Env.Web.sr.Length -1; $i++) {
$svn = $css.Env.Web.sr[$i].id
$sra += $svn
}
$sra
有人会建议是什么原因吗?
答案 0 :(得分:0)
调试此类问题,如以下ISE或VSCode中的代码所示。请注意我如何转储类型以查看发生了什么。
x1
Object[]
x2
XmlElement
此外,使用foreach
可以处理数组和单个对象...
$x1 = [xml]@'
<Env>
<Web>
<sr id="Server001"></sr>
<sr id="Server002"></sr>
<sr id="Server003"></sr>
</Web>
</Env>
'@
"x1"
$x1.Env.Web.sr.GetType().Name
$x2 = [xml]@'
<Env>
<Web>
<sr id="Server004"></sr>
</Web>
</Env>
'@
"x2"
$x2.Env.Web.sr.GetType().Name
"foreach1"
foreach($item in $x1.Env.Web.sr)
{
"ID is $($item.id)"
}
"foreach2"
foreach($item in $x2.Env.Web.sr)
{
"ID is $($item.id)"
}
答案 1 :(得分:0)
当只有一个<sr>
节点时,您的代码将不起作用,因为在这种情况下,$css.Env.Web.sr
不会返回数组。返回的节点没有Length
(或Count
)属性,因此您的for
循环只是跳过了。
这就是为什么在XPath表达式中使用SelectNodes()
(或SelectSingleNode()
)实际上总是可取的原因。
$sra = $css.SelectNodes('//sr') | Select-Object -Expand id
如果需要$sra
作为数组而不考虑<sr>
节点的数量,请添加数组子表达式运算符:
$sra = @($css.SelectNodes('//sr') | Select-Object -Expand id)