Сортировка xml-документа в powershell

Я хотел бы отсортировать следующий XML-документ с помощью powershell.

<car>
<germany>
    <manufacturer>Opel</manufacturer>
    <manufacturer>BMW</manufacturer>
    <manufacturer>Benz</manufacturer>
</germany>
<japan>
    <manufacturer>Nissan</manufacturer>
    <manufacturer>Daihatsu</manufacturer>
</japan></car>

Таким образом, элементы внутри Германии и Японии должны быть отсортированы.

В идеале я хотел бы прочитать xml из файловой системы и перезаписать существующий документ отсортированным.


person Henno    schedule 20.10.2010    source источник
comment
Где начинается и где заканчивается тег <car>?   -  person Rei Miyasaka    schedule 20.10.2010
comment
Ой!!! Забыл об этом, извини. Сразу после ‹/япония›   -  person Henno    schedule 20.10.2010


Ответы (1)


Наверняка есть много решений. Один быстрый это один:

$xml = [xml]"<car>
<germany>
    <manufacturer>Opel</manufacturer>
    <manufacturer>BMW</manufacturer>
    <manufacturer>Benz</manufacturer>
    <manufacturer>b</manufacturer>
    <manufacturer>a</manufacturer>
    <manufacturer>c</manufacturer>
</germany>
<japan>
    <manufacturer>Nissan</manufacturer>
    <manufacturer>Daihatsu</manufacturer>
</japan></car>"

$g = $xml.car.germany| select-xml 'manufacturer' | Select-Object -expand Node | sort '#text'
$j = $xml.car.japan | select-xml 'manufacturer' | Select-Object -expand Node | sort '#text'

@"
<car>
<germany>
    $( ($g | % { $_.OuterXml}) -join "`n`t" )
</germany>
<japan>
    $( ($j | % { $_.OuterXml}) -join "`n`t" )
</japan></car>
"@

Обратите внимание, что я использовал Select-Xml для извлечения производителей из xml, потому что $xml.car.germany.manufacturer вернул только массив строк (у вас, вероятно, были проблемы с этим). Мне не удалось получить исходный объект даже с помощью свойства PsBase. Вот почему я использовал Select-Xml.

person stej    schedule 20.10.2010
comment
Что не так с использованием $g = $xml.car.germany.manufacturer | sort? - person Keith Hill; 20.10.2010
comment
$xml.car.germany.manufacturer | sort возвращает массив строк. Вы хотели воссоздать xml как $xml.car.germany.manufacturer | sort | % { '<manufacturer>'+$_+'</manufacturer>' }? Я нашел очиститель подхода OuterXml на случай, если внутри будут какие-то другие атрибуты/элементы. Или - вы можете получить оригинальный XmlElement от $xml.car.germany.manufacturer | sort? Я не :| - person stej; 21.10.2010