PowerShell解析XML不适用于单个条目

时间:2019-01-09 23:13:41

标签: powershell powershell-v2.0 powershell-v3.0 powershell-v4.0

我创建了一个脚本来解析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

有人会建议是什么原因吗?

2 个答案:

答案 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)