2010-01-29 11 views
8

PowerShell में, मैं निम्नलिखित एक्सएमएल है लगता है:powershell एक्सएमएल xpath

<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 का उपयोग करना चाहिए?

धन्यवाद!

उत्तर

12

मुझे इन दिनों XPath का उपयोग करने की प्राथमिकता है। मुझे लगता है कि item पर नाम टक्कर की तरह परेशान हैं 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} 
1

हां, XPath इसके लिए पर्याप्त होगा!

यह देखने के लिए Powershell to test your XPath देखें कि यह कैसे किया जा सकता है।

+0

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

+1

प्रदान करें बेहतर लिंक यह आलेख V2 से नए cmdlet 'select-Xml' का उपयोग नहीं करता है। यह बहुत आसान है: 'चयन-एक्सएमएल-एक्सएमएल $ xml -xpath' /Users/User[contains(./Friends/Friend/@Name, "बार")] | select -exp node' – stej

+0

मैं अपनी टिप्पणी को और संपादित करने में सक्षम नहीं हूं, इसलिए यहां जयकुल की पोस्ट का एक लिंक है: http://huddledmasses.org/xpath-and-namespaces-in-powershell/ – stej

3

इस मामले में मैं XPath का भी उपयोग करूंगा। @TomWij ने सही xpath प्रदान किया।

यदि xpath अभिव्यक्ति बहुत जटिल होगी, तो मैं निश्चित रूप से 'क्लासिक' दृष्टिकोण का उपयोग करता।

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

(इस मामले यदि आप पर स्क्रिप्ट मोड की जरूरत नहीं है, यह कोई फर्क नहीं पड़ता कोई Friends तत्व नहीं है। $_.Friends$null और $null.Friend रिटर्न वापस आ जाएगी $null रूप में अच्छी तरह और इतने पर। तो अंत में $null -eq 'Bar' झूठा रिटर्न देता है और तत्व कहां से ऑब्जेक्ट हटा दिया जाता है)

संबंधित मुद्दे