2010-10-20 57 views
4

我想使用PowerShell對以下xml文檔進行排序。在PowerShell中對xml文檔排序

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

因此,德國和日本國內的元素應該進行排序。

理想情況下,我想從文件系統中讀取xml,並用已排序的文件覆蓋現有的文檔。

+0

''標籤在哪裏開始和結束? – 2010-10-20 00:08:06

+0

糟糕!忘了那個,對不起。緊接着 – Henno 2010-10-20 00:13:11

回答

4

可能有很多解決方案。一個快速的是這個:

$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的原因。

+0

這有什麼錯用'$ G = $ xml.car.germany.manufacturer | sort'? – 2010-10-20 14:21:47

+1

'$ xml.car.germany.manufacturer | sort'返回字符串數組。你的意思是重新創建像$ xml.car.germany.manufacturer |這樣的xml排序| %{''+ $ _ +''}'?我發現'OuterXml'方法更清潔,以防內部會有其他屬性/元素。或者 - 你是否可以從'$ xml.car.germany.manufacturer獲取原始'XmlElement' | sort'?我沒有:| – stej 2010-10-21 04:39:59