2016-09-23 73 views
0

我有一個xml文件,其中包含兩個不同的值,我試圖在每行中捕獲這些值。我試圖使用Powershell將它們解析爲一個csv,兩列,一個是設備ID,另一個是MAC地址,標題。任何建議將不勝感激。下面是xml文件看起來像我將使用的示例。感謝您的時間。Powershell將xml值解析爲csv

<?xml version="1.0" encoding="utf-8"?> 
<DeviceConfig> 
    <Device RegisterID="1021" MacID="A4F1E85D7D86" /> 
    <Device RegisterID="1022" MacID="A4F1E85D056E" /> 
    <Device RegisterID="1023" MacID="A4F1E85CAAEE" /> 
    <Device RegisterID="1024" MacID="A4F1E85DB284" /> 
    <Device RegisterID="1025" MacID="A4F1E85D7021" /> 
    <Device RegisterID="1026" MacID="A4F1E85D034A" /> 
    <Device RegisterID="1027" MacID="A4F1E85CAD59" /> 
    <Device RegisterID="1028" MacID="A4F1E85DAFA2" /> 
    <Device RegisterID="1029" MacID="A4F1E85D050E" /> 
    <Device RegisterID="1030" MacID="A4F1E85DAF89" /> 
    <Device RegisterID="1031" MacID="A4F1E85DA80E" /> 
</DeviceConfig> 

回答

3

您可以用您對實際文件的Get-Content調用替換我的字符串,但這適用於我,並且不需要帶入.NET類。

代碼

$xml = @" 
<?xml version="1.0" encoding="utf-8"?> 
<DeviceConfig> 
    <Device RegisterID="1021" MacID="A4F1E85D7D86" /> 
    <Device RegisterID="1022" MacID="A4F1E85D056E" /> 
    <Device RegisterID="1023" MacID="A4F1E85CAAEE" /> 
    <Device RegisterID="1024" MacID="A4F1E85DB284" /> 
    <Device RegisterID="1025" MacID="A4F1E85D7021" /> 
    <Device RegisterID="1026" MacID="A4F1E85D034A" /> 
    <Device RegisterID="1027" MacID="A4F1E85CAD59" /> 
    <Device RegisterID="1028" MacID="A4F1E85DAFA2" /> 
    <Device RegisterID="1029" MacID="A4F1E85D050E" /> 
    <Device RegisterID="1030" MacID="A4F1E85DAF89" /> 
    <Device RegisterID="1031" MacID="A4F1E85DA80E" /> 
</DeviceConfig> 
"@ 

$xmlData = [xml]$xml 

$xmlData.DeviceConfig.ChildNodes | ConvertTo-Csv -NoTypeInformation 

輸出

"RegisterID","MacID" 
"1021","A4F1E85D7D86" 
"1022","A4F1E85D056E" 
"1023","A4F1E85CAAEE" 
"1024","A4F1E85DB284" 
"1025","A4F1E85D7021" 
"1026","A4F1E85D034A" 
"1027","A4F1E85CAD59" 
"1028","A4F1E85DAFA2" 
"1029","A4F1E85D050E" 
"1030","A4F1E85DAF89" 
"1031","A4F1E85DA80E" 

有了這些信息,你應該能夠取得進展......

+0

我也喜歡這種方法。 –

+0

這工作完美 - 非常感謝你的協助!通過使用Export-csv而不是ConvertTo-csv,我可以像我想要的那樣將文件導出爲.csv文件。乾杯! – LilithGoddess

+0

我想添加一條額外的信息到.csv文件中每行的開頭。在我的大腳本中,我有一個用於$ servername的變量,並且我想在此.csv中添加一個「Server Name」列,並在每行(在RegisterID和MacID之前)中添加$ servername的值。任何想法如何最好的方法呢?謝謝! – LilithGoddess

-1

你需要在這裏使用.Net類,純PS不會幫助。幸運的是,這很容易。

Add-Type -AssemblyName System.Xml.Linq 
$xe = [System.Xml.Linq.XElement]::Parse($xml) 
$xe.Elements() | % {$_.Attribute('RegisterID').Value + ", " + $_.Attribute('MacID').Value} 

這將打印出您需要輸出的內容。保存到文件被許多其他答覆覆蓋。

+0

其實,我發現,這是沒有必要使用.Net類。感謝您的幫助! – LilithGoddess

2

我認爲這樣的事情會起作用。在這裏,我從一個字符串中讀取XML,你可以從文件中導入它:

$xml = @" 
<?xml version="1.0" encoding="utf-8"?> 
<DeviceConfig> 
    <Device RegisterID="1021" MacID="A4F1E85D7D86" /> 
    <Device RegisterID="1022" MacID="A4F1E85D056E" /> 
    <Device RegisterID="1023" MacID="A4F1E85CAAEE" /> 
    <Device RegisterID="1024" MacID="A4F1E85DB284" /> 
    <Device RegisterID="1025" MacID="A4F1E85D7021" /> 
    <Device RegisterID="1026" MacID="A4F1E85D034A" /> 
    <Device RegisterID="1027" MacID="A4F1E85CAD59" /> 
    <Device RegisterID="1028" MacID="A4F1E85DAFA2" /> 
    <Device RegisterID="1029" MacID="A4F1E85D050E" /> 
    <Device RegisterID="1030" MacID="A4F1E85DAF89" /> 
    <Device RegisterID="1031" MacID="A4F1E85DA80E" /> 
</DeviceConfig> 
"@ 

$csv = ` 
    Select-Xml -Content $xml -XPath "//Device" ` 
    | Select -ExpandProperty Node ` 
    | ConvertTo-Csv -NoTypeInformation 

$csv 

這是$csv內容:

"RegisterID","MacID" 
"1021","A4F1E85D7D86" 
"1022","A4F1E85D056E" 
"1023","A4F1E85CAAEE" 
"1024","A4F1E85DB284" 
"1025","A4F1E85D7021" 
"1026","A4F1E85D034A" 
"1027","A4F1E85CAD59" 
"1028","A4F1E85DAFA2" 
"1029","A4F1E85D050E" 
"1030","A4F1E85DAF89" 
"1031","A4F1E85DA80E" 

您應該能夠編寫出一個文件,如果你需要。

+0

這是一個很好的方法。如果xml很簡單並且/或者你不需要構建查詢,我喜歡'[xml]'類型的轉換。 –