我正在为现有的Perl脚本编写PowerShell包装器。 Perl脚本会提供几个参数,然后关闭并为我们配置所有HP iLO设备,然后以XML格式返回结果。问题是结果作为多个XML语句的一大 Blob 出现,即:
$strResult = & "perl locfg.pl -s $iloInterface -f $configXML"
<?xml version="1.0"?>
<RIBCL VERSION="2.22"/>
<RESPONSE
STATUS="0x0000"
MESSAGE='No error'
/>
</RIBCL>
<?xml version="1.0"?>
<RIBCL VERSION="2.22"/>
<RESPONSE
STATUS="0x0000"
MESSAGE='No error'
/>
</RIBCL>
等等
然后尝试将
$strResult
转换为XML会导致错误:“存在多个根元素有人对我如何在PowerShell中拆分这些XML语句以使其有效有任何想法吗?我在想,也许是一个“虚拟”根元素?还是应该调整底层Perl脚本?
最佳答案
我认为在XML声明<?xml ...
处拆分最容易。首先,您获得的XML并不是一个string
,而是一个String[]
,因此我们需要将它们连接起来:
[string]::Join("`n", $strresult)
ETA:
join
运算符是Powershell 2中的新增功能,我使用[string]::Join
对其进行了更改。然后,我们可以在XML声明中将它们拆分:
-split "<\?xml"
现在我们返回了多个字符串,每个字符串为空(对于第一个字符串),或者包含带有残缺声明的XML。首先让我们去掉空的:
| ? { $_.Trim() }
删除所有空格后,将查看字符串是否为非空。现在我们需要在剥离后添加声明:
| % { "<xml$_" }
现在我们还可以转换为XML:
| %{ [xml] $_ }
但是请注意,最初的XML是错误的。
<RIBCL VERSION="2.22"/>
是一个自动关闭的根元素,在RESPONSE
元素之后,您要再次关闭RIBCL
元素。当我在打开的/
元素的末尾删除RIBCL
时,一切正常:PS Home:\> (gc t.txt) -join "`n" -split "<\?xml" | >> ? { $_.Trim() } | >> % { "<?xml$_" } | >> % { [xml] $_ } >> xml RIBCL --- ----- version="1.0" RIBCL version="1.0" RIBCL
ETA: If you can count on it, then it's certainly easier to split at the empty line, though:
[string]::Join("`n", $strResult) -split "`n`n"
关于xml - 如何在PowerShell中使用多个XML根元素拆分字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1253017/