PowerShell 解析 XML 不适用于单项

PowerShell parse XML do not work for single entry

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

谁能告诉我问题的原因是什么?

在 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)"
}

当只有一个 <sr> 节点时,您的代码不起作用,因为在那种情况下 $css.Env.Web.sr 不是 return 数组。 returned 节点没有 Length(或 Count)属性,因此您的 for 循环被简单地跳过。

这就是为什么在 XPath 表达式中使用 SelectNodes()(或 SelectSingleNode())实际上总是更可取的原因。

$sra = $css.SelectNodes('//sr') | Select-Object -Expand id

如果需要$sra是一个数组而不考虑<sr>个节点的数量,则添加数组子表达式运算符:

$sra = @($css.SelectNodes('//sr') | Select-Object -Expand id)