powershell xml xpath
Yes, XPath would be sufficient for that!
Check Powershell to test your XPath to see how it can be done.
In this case I would use XPath as well. @TomWij provided the correct xpath.
In case that the xpath expression would be too complicated, I would for sure used the 'classic' approach.
$x.Users.User | ? { $_.Friends.Friend.Name -eq 'Bar' }
(in this case if you don't have script mode on, it doesn't matter that there is no Friends
element. $_.Friends
will return $null
and $null.Friend
returns $null
as well and so on. So finally $null -eq 'Bar'
returns false and the element is removed by Where-Object)
I have a preference for using XPath these days. I've run into issues using PowerShell's xml adapter that are annoying like the name collision on 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}