2015-12-16 5 views
2

У меня есть XML-файл, содержащий около 10 000 строк, которые я хотел бы извлечь в CSV-файл.Извлечение атрибутов и внутреннего текста из XML

У меня возникла проблема с извлечением атрибута 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    

Past Пример кода

[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

это AINT даже хорошо сформированы –

+0

Обновленный XML-данных. Я пытался не публиковать кучу тех же данных. –

+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

это v3 + PowerShell, если я правильно помню

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 
Смежные вопросы