powershell xml xpath - PullRequest
       19

powershell xml xpath

9 голосов
/ 29 января 2010

в 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>

Как я могу получить всех пользователей, у которых есть "Бар" как друг? (В этом примере это будет Foo, Foo3).

Должен ли я использовать xpath?

Спасибо!

Ответы [ 3 ]

13 голосов
/ 30 января 2010

У меня есть предпочтение использовать XPath в эти дни. Я столкнулся с проблемами при использовании xml-адаптера PowerShell, которые раздражают, как конфликт имен в item:

$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}
3 голосов
/ 29 января 2010

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

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

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

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

1 голос
/ 29 января 2010

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

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

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