Powershell: 按子节点值对元素排序的XML

3

如何使用Powershell按照“Tuple”列表的第二个节点(“integer”类型)进行降序排序此xml。

因此,结果将是xml,但第一个元素将是COMPUTERSF34,然后是COMPUTER123。

   <Result>
                <Tuple>
                    <Answer type="string">COMPUTERSF34</Answer>
                    <Answer type="integer">93</Answer>
                </Tuple>
                <Tuple>
                    <Answer type="string">NYCCOMPUTER01</Answer>
                    <Answer type="integer">44</Answer>
                </Tuple>
                <Tuple>
                    <Answer type="string">COMPUTER_05</Answer>
                    <Answer type="integer">45</Answer>
                </Tuple>
                <Tuple>
                    <Answer type="string">COMPUTER56</Answer>
                    <Answer type="integer">38</Answer>
                </Tuple>
                <Tuple>
                    <Answer type="string">COMPUTER123</Answer>
                    <Answer type="integer">51</Answer>
                </Tuple>
    ...
    </Result>

为什么?数据文件不应该需要排序,这是使用它的应用程序在读取时应该做的事情。据我所知,您需要按单词分组(修剪数字),然后按数字排序组成员(修剪单词并转换为int),并按字母顺序对组进行排序。 - Frode F.
1个回答

5

试试这个:

$xml = [xml]@'
   <Result>
                <Tuple>
                    <Answer type="string">COMPUTERSF34</Answer>
                    <Answer type="integer">93</Answer>
                </Tuple>
                <Tuple>
                    <Answer type="string">NYCCOMPUTER01</Answer>
                    <Answer type="integer">44</Answer>
                </Tuple>
                <Tuple>
                    <Answer type="string">COMPUTER_05</Answer>
                    <Answer type="integer">45</Answer>
                </Tuple>
                <Tuple>
                    <Answer type="string">COMPUTER56</Answer>
                    <Answer type="integer">38</Answer>
                </Tuple>
                <Tuple>
                    <Answer type="string">COMPUTER123</Answer>
                    <Answer type="integer">51</Answer>
                </Tuple>
    </Result>
'@
$sorted = $xml.Result.Tuple | sort {[int]$_.Answer[1].'#text'} -desc
$lastChild = $sorted[-1]
$sorted[0..($sorted.Length-2)] | Foreach {$xml.Result.InsertBefore($_,$lastChild)}
$xml.Save('c:\foo.xml')

技巧在于将每个已排序的节点(除了最后一个)插入到新的(排序后)最后一个节点之前。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接