2010-01-29 31 views
8

, aşağıdaki xml olduğunu varsayalım:Powershell xml xpath PowerShell içinde

<Users> 
    <User Name="Foo"> 
     <Friends> 
     <Friend Name="Bar"/> 
     </Friends> 
    </User> 
    <User Name="Foo2" /> 
    <User Name="Foo3"> 
     <Friends> 
     <Friend Name="Bar"/> 
     </Friends> 
    </User> 
    </Users> 

nasıl arkadaş olarak bir "Bar" olan tüm kullanıcıların alabilirim? (Bu örnekte Foo, Foo3 olacaktır).

Xpath kullanmalı mıyım?

Teşekkürler!

cevap

12

Bu günlerde XPath kullanmayı tercih ediyorum. Ben item isim çarpışma gibi rahatsız edici PowerShell en xml adaptörü kullanarak sorunları çalıştırmak:

$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

Evet, bunun için XPath yeterli olurdu!

Nasıl yapılacağını görmek için Powershell to test your XPath'u kontrol edin.

+0

/Users/User[contains(./Friends/Friend/@Name, "Bar")] –

+1

verin daha iyi bağlantı. Bu makale V2'den yeni cmdlet 'Select-Xml' kullanmıyor. Çok daha kullanışlı: 'Seç Xml -xml $ xml -xpath '/Users/User[contains(./Friends/Friend/@Name," Bar ")]' | select -exp node ' – stej

+0

Artık yorumumu düzenleyemiyorum, bu yüzden burada Jaykul'un gönderisine bir bağlantı var: http://huddledmasses.org/xpath-and-namespaces-in-powershell/ – stej

3

Bu durumda XPath'ı da kullanacağım. @TomWij, doğru xpath sağladı.

Xpath ifadesinin çok karmaşık olması durumunda, 'klasik' yaklaşımı kesinlikle kullanırdım.

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

(size komut modu yoksa bu durumda, hiçbir Friends unsur olduğunu fark etmez. $_.Friends$null ve $null.Friend döner dönecektir $null yanı vb. Sonunda $null -eq 'Bar' false değerini döndürür ve öğe Object-Object tarafından kaldırılır)