2010-10-20 63 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