beta
beta

Reputation: 5686

Powershell XML grouping by multiple levels

I have an XML file with the following structure:

<XML>
    <Series key="A">
        <Observation>
           <Dimension value="2018-11-01" />
           <Value value="123" />
        </Observation>
        <Observation>
           <Dimension value="2018-11-02" />
           <Value value="456" />
        </Observation>
        <Observation>
           <Dimension value="2018-12-01" />
           <Value value="789" />
        </Observation>
        <Observation>
           <Dimension value="2018-12-02" />
           <Value value="222" />
        </Observation>
    </Series>
    <Series key="B">
        <Observation>
           <Dimension value="2018-11-01" />
           <Value value="123" />
        </Observation>
        <Observation>
           <Dimension value="2018-11-02" />
           <Value value="456" />
        </Observation>
        <Observation>
           <Dimension value="2018-12-01" />
           <Value value="789" />
        </Observation>
        <Observation>
           <Dimension value="2018-12-02" />
           <Value value="222" />
        </Observation>
    </Series>
</XML>

I want to group the XML per Series and per month of the value-Attribute of each contained Dimension.

I already know how to group by month:

$doc.SelectNodes("//Series/Observation", $ns) | Group-Object { $_.Dimension.value.Substring(0,7) }

But this results in only 2 groups 2018-11 and 2018-12. However, I need 4 groups, 2 for each Series. How can this be achieved?

Upvotes: 0

Views: 300

Answers (1)

Mathias R. Jessen
Mathias R. Jessen

Reputation: 174690

Reference the ParentNode property as the first property to group by:

$doc.SelectNodes('//Series/Observation') | Group-Object { $_.ParentNode.key },{ $_.Dimension.value.Substring(0,7) } -NoElement

and you will get a result like:

Count Name
----- ----
    2 A, 2018-11
    2 A, 2018-12
    2 B, 2018-11
    2 B, 2018-12

Upvotes: 2

Related Questions