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