Я думаю, что проще всего разбить в декларации 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"