2016-11-16 83 views
0

我有一個利用PowerShell解析XML數據並導出爲XLS格式的腳本。這個腳本在XML不復雜的情況下工作。但是,當節點具有多個屬性時,它不會。解析XML多參數

目前,獲取一個節點的屬性我使用:

$Switch = $xml.DC.Rack[$i] | %{$_.NetworkSwitch} | Select-Object -Unique 

不過,我需要的位置,地址和VLAN的詳細信息。這是什麼樣的節點看起來像一個例子:

<NetworkSwitch Location="ABC" Address="XX.XXX.XXX.XX" Vlan="YY" /> 

這裏是我的PS1的副本:

$xmlFile = "D:\My.xml" 
$xPath = "//Rack" 
[xml]$xml = Get-Content $xmlFile -Raw 

$NodeCount = $xml.SelectNodes($xPath).Count 

for ($i = 1; $i -le $NodeCount; $i++) 
{ 
    $Switch = $xml.DC.Rack[$i] | %{$_.NetworkSwitch} | Select-Object -Unique 
    Write-Host "$($Switch)" 
} 

回答

0

爲什麼不使用Select-XML?我沒有你的XML文檔的完整樣本,但這可能會滿足你的需求。

$xml = @" 
<?xml version="1.0" encoding="utf-8"?> 
<Switches> 
    <NetworkSwitch Location="ABC" Address="XX.XXX.XXX.XX" Vlan="YY" /> 
    <NetworkSwitch Location="DEF" Address="XX.XXX.XXX.XX" Vlan="ZZ" /> 
    <NetworkSwitch Location="GHI" Address="XX.XXX.XXX.XX" Vlan="XX" /> 
</Switches> 
"@ 
Select-Xml -Content $xml -XPath "//NetworkSwitch" | Select-Object -ExpandProperty Node 

這將返回以下:

Location        Address        Vlan 
--------        -------        ---- 
ABC         XX.XXX.XXX.XX      YY 
DEF         XX.XXX.XXX.XX      ZZ 
GHI         XX.XXX.XXX.XX      XX 

這些都是你可以存儲和隨意操縱System.Xml.XmlElement對象。您還可以進一步優化XPath語句以僅檢索必要的屬性。例如,如果您只希望將以下xml信息更改爲:

Select-Xml -Content $xml -XPath "//NetworkSwitch/@Vlan" | Select-Object -ExpandProperty Node 

#text 
----- 
YY 
ZZ 
XX 
0

有沒有必要先確定機架的數量。只需撥打SelectNodes()用適當的XPath表達式上$xml,並選擇在輸出所需的屬性:

$xml.SelectNodes('//Rack/NetworkSwitch') | 
    Select-Object -Unique Location, Address, Vlan 

如果你想以CSV格式輸出導入Excel中管上面的語句爲Export-Csv

... | Export-Csv 'C:\path\to\output.csv' -NoType