I'm using PowerShell to parse XML content and display the results in a grid view. Here's the code I'm using:
$content = @"
<root>
<obj>
<name>John</name>
<age>20</age>
</obj>
<obj>
<name>Mike</name>
<age>30</age>
<height>180</height>
</obj>
</root>
"@
[xml]$doc = $content
$doc.root.obj | select * | ogv
The problem I'm running into is that not all properties are showing up in the grid view. For example, the grid view only contains the name, height, and some other built-in properties - the age property is missing.
I'd like to include all properties in the grid view, even if they're absent in some objects, and put empty or 0 for objects that don't have the corresponding property. How can I achieve this?
Select-Object *
means "take whatever you can find", causing Select-Object
to discover all the properties of the first object it receives as input.
Instead, gather a list of all possible property names from the document, then pass those to Select-Object
before outputting:
[xml]$doc = $content
# discover all distinct property names under `//root/obj/`
$propertyNames = $doc.root.obj.SelectNodes('./*') |Select-Object -ExpandProperty Name -Unique
# select and export/render
$doc.root.obj |Select-Object -Property $propertyNames |Out-GridView
Any property not present on the input object will end up with a $null
value, and Out-GridView
will render the corresponding cells empty