2015-12-16 49 views
2

我有一個XML文件,它有大約10,000行,我想將一些數據提取到CSV文件。從XML中提取屬性和內部文本

我遇到的問題是提取id屬性和聯盟名稱標記的內部文本。如果任何人都可以闡明爲什麼ID不顯示以及如何獲取無損文本,這將是非常有幫助的。

重複樣本數據

<players> 
<towns> 
    <town> 
    <player> 
     <playername id="1">MyName</playername> 
     <playerrace>Human</playerrace> 
     <playeralliance> 
     <alliancename id="18">DaVS</alliancename> 
     <alliancetag>DaVS</alliancetag> 
     <alliancetax>0.01</alliancetax> 
     </playeralliance> 
    </player> 
    </town> 
    <town> 
    <player> 
     <playername id="2">Tonka</playername> 
     <playerrace>Human</playerrace> 
     <playeralliance> 
     <alliancename id="18">DaVS</alliancename> 
     <alliancetag>DaVS</alliancetag> 
     <alliancetax>0.01</alliancetax> 
     </playeralliance> 
    </player> 
    </town> 
    <town> 
    <player> 
     <playername id="2">Tonka</playername> 
     <playerrace>Human</playerrace> 
     <playeralliance> 
     <alliancename id="18">DaVS</alliancename> 
     <alliancetag>DaVS</alliancetag> 
     <alliancetax>0.01</alliancetax> 
     </playeralliance> 
    </player> 
    </town> 
    <town> 
    <player> 
     <playername id="2">Tonka</playername> 
     <playerrace>Human</playerrace> 
     <playeralliance> 
     <alliancename id="18">DaVS</alliancename> 
     <alliancetag>DaVS</alliancetag> 
     <alliancetax>0.01</alliancetax> 
     </playeralliance> 
    </player> 
    </town> 
    <town> 
    <player> 
     <playername id="2">Tonka</playername> 
     <playerrace>Human</playerrace> 
     <playeralliance> 
     <alliancename id="18">DaVS</alliancename> 
     <alliancetag>DaVS</alliancetag> 
     <alliancetax>0.01</alliancetax> 
     </playeralliance> 
    </player> 
    </town> 
    <town> 
    <player> 
     <playername id="2">Tonka</playername> 
     <playerrace>Human</playerrace> 
     <playeralliance> 
     <alliancename id="18">DaVS</alliancename> 
     <alliancetag>DaVS</alliancetag> 
     <alliancetax>0.01</alliancetax> 
     </playeralliance> 
    </player> 
    </town> 
    <town> 
    <player> 
     <playername id="2">Tonka</playername> 
     <playerrace>Human</playerrace> 
     <playeralliance> 
     <alliancename id="18">DaVS</alliancename> 
     <alliancetag>DaVS</alliancetag> 
     <alliancetax>0.01</alliancetax> 
     </playeralliance> 
    </player> 
    </town> 
    <town> 
    <player> 
     <playername id="2">Tonka</playername> 
     <playerrace>Human</playerrace> 
     <playeralliance> 
     <alliancename id="18">DaVS</alliancename> 
     <alliancetag>DaVS</alliancetag> 
     <alliancetax>0.01</alliancetax> 
     </playeralliance> 
    </player> 
    </town> 
    <town> 
    <player> 
     <playername id="2">Tonka</playername> 
     <playerrace>Human</playerrace> 
     <playeralliance> 
     <alliancename id="18">DaVS</alliancename> 
     <alliancetag>DaVS</alliancetag> 
     <alliancetax>0.01</alliancetax> 
     </playeralliance> 
    </player> 
    </town> 
    <town> 
    <player> 
     <playername id="2">Tonka</playername> 
     <playerrace>Human</playerrace> 
     <playeralliance> 
     <alliancename id="18">DaVS</alliancename> 
     <alliancetag>DaVS</alliancetag> 
     <alliancetax>0.01</alliancetax> 
     </playeralliance> 
    </player> 
    </town> 
    <town> 
    <player> 
     <playername id="3">Sinner</playername> 
     <playerrace>Human</playerrace> 
     <playeralliance> 
     <alliancename id="1">Harmless?</alliancename> 
     <alliancetag>TH</alliancetag> 
     <alliancetax>0.00</alliancetax> 
     </playeralliance> 
    </player> 
    </town> 
    <town> 
    <player> 
     <playername id="3">Sinner</playername> 
     <playerrace>Human</playerrace> 
     <playeralliance> 
     <alliancename id="1">Harmless?</alliancename> 
     <alliancetag>TH</alliancetag> 
     <alliancetax>0.00</alliancetax> 
     </playeralliance> 
    </player> 
    </town> 
    <town> 
    <player> 
     <playername id="3">Sinner</playername> 
     <playerrace>Human</playerrace> 
     <playeralliance> 
     <alliancename id="1">Harmless?</alliancename> 
     <alliancetag>TH</alliancetag> 
     <alliancetax>0.00</alliancetax> 
     </playeralliance> 
    </player> 
    </town> 
    <town> 
    <player> 
     <playername id="10">Kumomoto</playername> 
     <playerrace>Elf</playerrace> 
     <playeralliance> 
     <alliancename id="1">Harmless?</alliancename> 
     <alliancetag>TH</alliancetag> 
     <alliancetax>0.00</alliancetax> 
     </playeralliance> 
    </player> 
    </town> 
    </towns> 
</players> 

目前代碼

$xml.selectNodes('//playeralliance') | 
    select alliancename.id, allianceticker, alliancetaxrate 

輸出

PS C:\Users\jon> $xml.selectNodes('//playeralliance') | select alliancename.id, alliancename, alliancetag, alliancetax 

alliancename.id alliancename alliancetag alliancetax 
--------------- ------------ ----------- ----------- 
       alliancename DaVS   0.01   
       alliancename DaVS   0.01   
       alliancename DaVS   0.01   
       alliancename DaVS   0.01   
       alliancename DaVS   0.01   
       alliancename DaVS   0.01   
       alliancename DaVS   0.01   
       alliancename DaVS   0.01   
       alliancename DaVS   0.01   
       alliancename DaVS   0.01   
       alliancename TH    0.00   
       alliancename TH    0.00   
       alliancename TH    0.00   
       alliancename TH    0.00    

過去的代碼示例

[xml]$xml = Get-Content 'C:\Users\jhold\Desktop\Illyriad Data\sample.xml'; 

$xml.towns.town.player; 

foreach($item in $xml.playeralliance) 
{ 
    $allianceName = $item 
    #$allianceID = $item.id 
    #$allianceTicker = $item.allianceticker 
    #$allianceTax = $item.alliancetax 

    Write-host "Name: " $allianceName 
    #Write-host "ID: " $allianceID 
    #Write-host "Ticker: " $allianceTicker 
    #Write-host "Tax: " $allianceTax 
} 
+0

它不是很好,即使更新了XML數據形成 –

+0

。我試圖不發佈一堆相同的數據。 –

+0

16:00開始https://www.youtube.com/watch?v=m8k-oqBlntY –

回答

3

使用calculated properties此:

$xml.SelectNodes('//playeralliance') | 
    Select-Object @{n='allianceid';e={$_.alliancename.id}}, 
       @{n='alliancename';e={$_.alliancename.'#text'}}, 
       @{n='allianceticker';e={$_.alliancetag}}, 
       @{n='alliancetaxrate';e={$_.alliancetax}} 
+0

這是完美的。我能夠獲得我需要的一切,並且它非常乾淨地輸出到Csv。 –

1

這就是PowerShell的V3 +,如果我沒有記錯

PS C:\Users\joshua> [xml]$xml = Get-Content C:\Users\joshua\Desktop\sample.xml 

$xml.town.player 

$xml.town.player.playername.id 

$xml.town.player.playername.'#text' 

playername playerrace playeralliance 
---------- ---------- -------------- 
playername Elf  playeralliance 
10 
MyName 



PS C:\Users\joshua> 
+0

我沒有得到任何結果返回使用$ xml.towns.town.player.playeralliance。'#text' –

+0

您沒有文字節點 $ xml.town.player.playeralliance.alliancename。'#text' FoxTwo –

+0

我不明白你的意思,我沒有一個文本節點? –

1

。利用擴大財產......這對我的作品。

$item | select -expandproperty allianceticker