powershell xml xpath

В 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?

Спасибо!

10
задан Yuval Peled 29 January 2010 в 20:37
поделиться

3 ответа

У меня есть предпочтение для использования 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}
14
ответ дан 3 December 2019 в 20:41
поделиться

В этом случае я бы тоже использовал XPath. @TomWij предоставил правильный xpath.

В случае, если бы выражение xpath было слишком сложным, я бы наверняка использовал 'классический' подход.

$x.Users.User | ? { $_.Friends.Friend.Name -eq 'Bar' }

(в данном случае, если у вас не включен режим скрипта, не имеет значения, что нет элемента Friends. $_.Friends вернёт $null и $null.Friend вернёт $null и так далее. Итак, наконец $null -eq 'Bar' возвращает false и элемент удаляется Where-Object)

.
3
ответ дан 3 December 2019 в 20:41
поделиться

Да, XPath было бы достаточно для этого!

Проверьте Powershell для проверки XPath, чтобы посмотреть, как это можно сделать.

1
ответ дан 3 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: