Как можно разбить строку с несколькими корневыми элементами XML в PowerShell? - PullRequest
2 голосов
/ 10 августа 2009

Я пишу оболочку PowerShell для существующего сценария Perl. Сценарий 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 приводит к ошибке: «Существует несколько корневых элементов

У кого-нибудь есть мысли о том, как можно разделить эти XML-операторы в PowerShell, чтобы сделать их действительными? Я думал, может быть, «фиктивный» корневой элемент может быть в порядке? Или я должен смотреть на настройку основного скрипта Perl?

Ответы [ 3 ]

1 голос
/ 10 августа 2009

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

Другой способ, который мне подходит, - обернуть корневой элемент вокруг всего вывода и удалить элементы управления версиями. Это правильно анализирует меня с помощью SAX-анализатора для Java

0 голосов
/ 10 августа 2009

Либо настройка Perl, либо оборачивание корневого элемента вокруг него должны работать. Вы также можете разделить возвращаемое значение на пустые строки, а затем создать массив объектов XML.

На самом деле я не уверен, что корневой элемент будет работать, так как у каждого из этих битов есть узел версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...