1

一部の XML を並べ替えていますが、特定の一意でない属性に基づいて要素を並べ替えたいと考えています。これにより、同様の要素をグループ化できます。これらのグループ内では、元の順序を維持する必要があります。問題は、ソート時にこれらのグループ内の順序が変更され、再ソートすると順序が再び変更されることです。XML のコンテンツが変更されていない場合に変更しない並べ替えが必要です (そうしないと、SVN の差分が見苦しくなります)。簡単な例を次に示します。

$xml = [xml]@"
<root>
  <element name="a" number="1" />
  <element name="b" number="1" />
  <element name="c" number="1" />
  <element name="d" number="2" />
  <element name="e" number="2" />
  <element name="f" number="2" />
  <element name="g" number="3" />
  <element name="h" number="3" />
</root>
"@

Write-Host "`nFirst Sort produces this:"
$result1 = $xml.SelectNodes('//element') | Sort-Object -Property 'number'
Write-Host (($result1 | select -ExpandProperty 'number') + " <---Sorted on")
Write-Host (($result1 | select -ExpandProperty 'name') + " <---Order not maintained")

Write-Host "`nSorting the (already sorted) results of First Sort produces this:"
$result2 = $result1 | Sort-Object -Property 'number'
Write-Host (($result2 | select -ExpandProperty 'number') + " <---Sorted on")
Write-Host (($result2 | select -ExpandProperty 'name') + " <---Order changed again")

出力は次のとおりです。

First Sort produces this:
1 1 1 2 2 2 3 3  <---Sorted on
c b a f e d h g  <---Order not maintained

Sorting the (already sorted) results of First Sort produces this:
1 1 1 2 2 2 3 3  <---Sorted on
a b c d e f g h  <---Order changed again

この例では、「番号グループ」内で元の「名前」の順序を維持する必要があります。

これを元の順序に維持し、複数回並べ替えたときに同じ結果になる簡単な方法を考えられる人はいますか?

元の順序を表すダミー属性を追加しないようにしています。より決定論的な別の .NET ソート関数があるのではないでしょうか? 私は検索しましたが、同等のグループ内での順序付けに関心がある人は誰もいなかったようです。

ありがとう。

4

2 に答える 2

1

自然順を表すものがまだない場合は、Add-Memberを使用してインデックスプロパティを追加できます。

$nodes = @($xml.SelectNodes('//element'))
for ($i=0; $i -lt $nodes.Count; $i++) 
{
    $nodes[$i] = $nodes[$i] | Add-Member -MemberType NoteProperty "Index" $i -PassThru
}

$result1 = $nodes | Sort-Object name, Index

そうすれば、何度並べ替えても同じ注文が保証されます。

更新:PowerShellv2の構文を追加

于 2012-04-23T20:38:35.227 に答える
0

両方のプロパティに関して並べ替えます。

$xml.SelectNodes('//element') | Sort-Object -Property number, name

これにより、次の出力が生成されます。

name     number
----     ------
a        1
b        1
c        1
d        2
e        2
f        2
g        3
h        3
于 2012-04-23T18:05:26.020 に答える