получить xml значений с помощью powershell - PullRequest
1 голос
/ 07 мая 2020

Я хочу преобразовать, чтобы получить информацию в тегах xml с помощью powershell. Но вот с чем я столкнулся:

Select- Xml: невозможно преобразовать значение «System. Xml .XmlDocument» в тип «System. Xml .XmlDocument». Ошибка: «Указанный узел не может быть вставлен как допустимый дочерний узел этого узла, поскольку указанный узел имеет неправильный тип».

[xml]$xml=
@"
<BESAPI xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="BESAPI.xsd">
<Computer Resource="https://dsw11.lab.g:52311/api/computer/549"/>
<Computer Resource="https://dsw11.lab.g:52311/api/computer/550"/>
<Computer Resource="https://dsw11.lab.g:52311/api/computer/552"/>
<Computer Resource="https://dsw11.lab.g:52311/api/computer/551"/>
</BESAPI> 
"@


#I have tried these alternatives for result, but both of them are not working

#$result = Select-Xml -Content $xml -XPath "//Computer Resource" | foreach {$_.node.InnerXML}
$result = Select-Xml -Content $xml -XPath "//Computer Resource" | foreach {[pscustomobject]@($_.node.InnerXML)}

Я хочу получить идентификаторы из компьютерного ресурса. для этого снова,

foreach($str in $result)
{
$res = $str.split('/')[-1]
# next steps
}

Я много искал, но ничего не работает.

Заранее спасибо за вашу помощь.

Ответы [ 2 ]

3 голосов
/ 07 мая 2020
Select-Xml -xml $xml -XPath "//Computer" | 
  foreach { $_.node.Resource.split('/')[-1] }

549
550
552
551
0 голосов
/ 07 мая 2020

Go по каждому атрибуту Resource и извлеките элемент листа из URL-адреса с помощью Split-Path:

foreach ($url in $xml.BESAPI.Computer.Resource) {
    Split-Path -Path $url -Leaf
}

Или используя Foreach-Object если вы предпочитаете использовать конвейеры вместо перечисления foreach:

$xml.BESAPI.Computer.Resource | ForEach-Object {
    Split-Path -Path $_ -Leaf
}

Вывод:

549
550
552
551

Из документации для -Leaf:

Указывает, что этот командлет возвращает только последний элемент или контейнер в пути. Например, по пути C: \ Test \ Logs \ Pass1.log он возвращает только Pass1.log.


Update

As @ Йерун Мостерт упомянул в комментариях, что полные URL-адреса не являются путями, поэтому Split-Path -Leaf может вызвать проблемы.

Более безопасным решением было бы преобразовать URL-адрес в объект System.Uri, а затем использовать вместо него свойство System.Uri.LocalPath:

foreach ($url in $xml.BESAPI.Computer.Resource) {
    Split-Path -Path ([uri]$url).LocalPath -Leaf
}

Или просто используйте split, аналогично js2010's ответ:

foreach ($url in $xml.BESAPI.Computer.Resource) {
    ($url -split "/")[-1]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...