2012-08-23 143 views
1

排序XML我怎樣才能重新基於屬性名稱值的XML,然後將其保存在下面的命令 - 主機名,dnsdomain中,環境,HWSystemType,SystemType中,HWSystemModel按屬性名稱

謝謝你的幫助。

<Objects> 
    <Object> 
    <Property Name="Hostname">myServer</Property> 
    <Property Name="SystemType">Physical</Property> 
    <Property Name="HWSystemModel">Windows Server</Property> 
    <Property Name="HWSystemType">Unitary HW-System</Property> 
    <Property Name="DNSDomain">Domain.net</Property> 
    <Property Name="Environment">Testing</Property> 
</Object> 
</Objects> 
+0

你確定這就是你想要做什麼?通常,XML的目標是純粹專注於數據,而其他工具則是爲了演示而對XML進行操作。也許你可以多說一些你想要完成的事情的「大局」。 – David

+0

我還注意到您的結束標記(''和'')格式不正確。應該是:''和'' – David

+0

我注意到你沒有按照你指定的順序包含'HWSystemModel'。 – David

回答

-1

對於排序由@Name的XML(但要注意字母順序對您列出什麼不同),嘗試

Select-Xml -Path Your.xml -XPath //Property | Select-Object -ExpandProperty Node | Sort-Object -Property Name 
0

確定 - 在這裏你去。只需運行該腳本(sortxml.ps1)並將輸出重定向到您選擇的文件,例如sortxml.ps1 > sorted_xml_file.xml

注意:要求Powershell Community Extensions模塊爲Format-Xml

sortedxml.ps1:

# replace 'old.xml' with the path to your unsorted xmlfile 
[xml]$xml = gc old.xml 
[xml]$xmlnew = gc old.xml 

$names = @('Hostname', 'DNSDomain', 'Environment', 'HWSystemType', 'SystemType', 'HWSystemModel') 

$nodes = $xmlnew.Objects.Object.Property 
foreach($i in 0..($names.length - 1)) { 
    foreach($j in $xml.Objects.Object.Property) { 
     if($j.Name -eq $names[$i]) { 
      $nodes[$i].Name = $j.Name 
      $nodes[$i]."#text" = $j."#text" 
      break 
     } 
    } 
} 

Format-Xml -inputobject $xmlnew