如何在PowerShell中拆分包含多个XML根元素的字符串?

时间:2009-08-10 03:38:29

标签: xml perl powershell

我正在为现有的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脚本吗?

3 个答案:

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