xml - 如何在PowerShell中使用多个XML根元素拆分字符串?

标签 xml perl powershell

我正在为现有的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/

相关文章:

Go 中的 XML - 如何获取任一标记并将其与结构的字段匹配?

Perl 进程文件句柄

perl - 根据当前文件的内容从 awk 搜索/读取另一个文件,是否可能?

powershell - 错误计数和$Error自动变量不一致

powershell - 使用非字符串作为 $env : variable

java - 使用 java 使用给定的键解析复杂的 json 和 xml,无需使用 pojo

xml - XSL 显示属性名称

html - XSLT 转换未显示任何数据

perl - 如何在 perl 脚本中使用 Selenium Remote Driver 最大化/最小化 firefox 浏览器窗口

powershell - 我可以在Powershell读取主机中使用现有变量吗