В Powershell предположите, что у меня есть следующий xml:
<Users>
<User Name="Foo">
<Friends>
<Friend Name="Bar"/>
</Friends>
</User>
<User Name="Foo2" />
<User Name="Foo3">
<Friends>
<Friend Name="Bar"/>
</Friends>
</User>
</Users>
Как я могу получить всех пользователей, которые имеют "Панель" как друга? (В этом примере это было бы Нечто, Foo3).
Я должен использовать xpath?
Спасибо!
У меня есть предпочтение для использования XPath в эти дни. Я столкнулся с проблемами, используя XML-адаптер PowerShell, который раздражает, как и имя столкновения на :
:
$xml = [xml]@'
<Users>
<User Name="Foo">
<Friends>
<Friend Name="Bar"/>
</Friends>
</User>
<User Name="Foo2" />
<User Name="Foo3">
<Friends>
<Friend Name="Bar"/>
</Friends>
</User>
</Users>
'@
Select-Xml '//User[contains(Friends/Friend/@Name, "Bar")]' $xml |%{$_.Node.Name}
В этом случае я бы тоже использовал XPath. @TomWij предоставил правильный xpath.
В случае, если бы выражение xpath было слишком сложным, я бы наверняка использовал 'классический' подход.
$x.Users.User | ? { $_.Friends.Friend.Name -eq 'Bar' }
(в данном случае, если у вас не включен режим скрипта, не имеет значения, что нет элемента Friends
. $_.Friends
вернёт $null
и $null.Friend
вернёт $null
и так далее. Итак, наконец $null -eq 'Bar'
возвращает false и элемент удаляется Where-Object)
Да, XPath было бы достаточно для этого!
Проверьте Powershell для проверки XPath, чтобы посмотреть, как это можно сделать.