2010-01-29 51 views
8

在PowerShell中, 假設我有以下XML:PowerShell的XML的XPath

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

謝謝!

回答

12

我最近有一種使用XPath的偏好。我碰到使用PowerShell的XML適配器,它是煩人喜歡這個名字碰撞上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} 
1

是的,XPath就足夠了!

檢查Powershell to test your XPath看看它是如何完成的。

+0

/Users/User[contains(./Friends/Friend/@Name,「酒吧」) – 2010-01-29 20:41:54

+1

請提供更好的鏈接。本文不使用V2中的新的cmdlet'Select-Xml'。它更方便:'Select-Xml -xml $ xml -xpath'/Users/User[contains(./Friends/Friend/@Name,「Bar」)]'|選擇-exp node' – stej 2010-01-29 20:47:56

+0

我無法再編輯我的評論,所以這裏是一個鏈接Jaykul的帖子:http://huddledmasses.org/xpath-and-namespaces-in-powershell/ – stej 2010-01-29 20:55:45

3

在這種情況下,我也會使用XPath。 @TWWij提供了正確的xpath。

如果xpath表達式太複雜,我肯定會使用'classic'方法。

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

(在這種情況下,如果你沒有腳本模式上,也不要緊,有沒有Friends元素。$_.Friends將返回$null$null.Friend回報$null以及等等。所以最後$null -eq 'Bar'返回false並且該元素被Where-Object刪除)