I have the following xml:
<?xml version="1.0"?>
<AdminDirectorUsers>
<Users>
<User>
<UserName>PC1</UserName>
<Installation>
<Products>
<Product>
<ProductID>Product1</ProductID>
<Selected>Yes</Selected>
</Product>
<Product>
<ProductID>Product2</ProductID>
<Selected>No</Selected>
</Product>
<Product>
<ProductID>Product3</ProductID>
<Selected>No</Selected>
</Product>
<Product>
<ProductID>Product4</ProductID>
<Selected>Yes</Selected>
</Product>
</Products>
</Installation>
</User>
<User>
<UserName>PC2</UserName>
<Installation>
<Products>
<Product>
<ProductID>Product1</ProductID>
<Selected>Yes</Selected>
</Product>
<Product>
<ProductID>Product2</ProductID>
<Selected>Yes</Selected>
</Product>
<Product>
<ProductID>Product3</ProductID>
<Selected>No</Selected>
</Product>
<Product>
<ProductID>Product4</ProductID>
<Selected>Yes</Selected>
</Product>
</Products>
</Installation>
</User>
</Users>
</AdminDirectorUsers>
I would like to loop through and extract a list of each UserName with all ProductIDs that has a sibling node Selected with a value of Yes, while ignoring the values of No.
$path = 'C:\Temp\test.xml'
$xml = New-Object -TypeName XML
$xml.Load($Path)
$UserNode = $xml.SelectNodes('//User')
$ProductNode = $xml.SelectNodes('//Product')
foreach ($PC in $usernode)
{
$PC.username
foreach($Node in $ProductNode){
# Test if selected == 'yes'
if($Node.Selected -eq 'yes') {
$Node.ProductID
}
}
}
My output is:
PC1
Product1
Product4
Product1
Product2
Product4
PC2
Product1
Product4
Product1
Product2
Product4
...but I'm looking for:
PC1
Product1
Product4
PC2
Product1
Product2
Product4
I've tried many ways to do this but nothing seems to work. What am I missing?