How to Include All Properties in GridView Even if They're Absent in Some Objects?

34 views Asked by At

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. enter image description here

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?

1

There are 1 answers

0
Mathias R. Jessen On BEST ANSWER

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