我正在为现有的Perl脚本编写PowerShell包装器。 Perl脚本提供了几个参数,然后关闭并为我们配置所有HP iLO设备,并以XML格式返回结果。问题是结果是多个XML语句的一大块,即:
$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脚本吗?
答案 0 :(得分:1)
我认为在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:如果你可以指望它,那么在空行拆分肯定更容易:
[string]::Join("`n", $strResult) -split "`n`n"
答案 1 :(得分:0)
调整Perl或在其周围包装根元素应该可行。您还可以在空行上拆分返回的值,然后创建一个XML对象数组。
实际上我不确定根元素是否会起作用,因为每个位都有一个版本节点。
答案 2 :(得分:0)
另一种适用于我的方法是在整个输出周围包装一个根元素 删除版本控制元素。这确实使用SAX解析器为我解析 对于java