Ниже приведено наивное решение, предполагающее, что вы знаете глубину своего xml.Но, вероятно, вы можете сделать все это с помощью xqury и, таким образом, сделать это на стороне SQL
[xml]$x = "your xml here"
# ------ LEVEL 2 children
$L2 = $x | Select-Xml "//root/*/*"
foreach($n in $L2) {
$L1 = $n.node.ParentNode.LocalName
$CHILD = $n.node.localname
[PSCustomObject]@{L1=$L1; CHILD = $CHILD}
}
# ------ LEVEL 3 children
$L3 = $x | Select-Xml "//root/*/*/*"
foreach($n in $L3) {
$L1 = $n.node.ParentNode.ParentNode.LocalName
$CHILD = $n.node.localname
[PSCustomObject]@{L1=$L1; CHILD = $CHILD}
}
# ------ LEVEL 4 children
$L4 = $x | Select-Xml "//root/*/*/*/*"
foreach($n in $L4) {
$L1 = $n.node.ParentNode.ParentNode.ParentNode.LocalName
$CHILD = $n.node.localname
[PSCustomObject]@{L1=$L1; CHILD = $CHILD}
}
Также добавив версию sql xquery.Он все еще требует знания структуры и делает только один уровень за один раз, но он не имеет перекрестного применения / объединения, поэтому, вероятно, будет лучше работать с большими файлами
select
T.c.query('local-name(.)') as self
,T.c.query('local-name(..)') as parent
,T.c.query('local-name(../..)') as Gparent
,T.c.query('local-name(../../..)') as GGparent
from @x.nodes('/root/*/*/*/*') T(c)