Powershell xml в CSV выберите узел на основе информации о подмножестве

Я пытаюсь преобразовать файл XML в CSV. Для этого мне нужно проверить значения некоторых наборов ("laborid" и "kundenid"), а также подмножеств ("tourid" и "tourzeit") на основе подмножества с " befundtour " равным true :

      <customer>
    <laborid>XXXXX</laborid>
    <kundenid>AAAAA</kundenid>
    <ziellabor>BBB</ziellabor>
    <tourpos>
        <tourid>073316</tourid>
        <tourzeit>10:50:00</tourzeit>
        <MO>true</MO>
        <DI>true</DI>
        <MI>true</MI>
        <DO>true</DO>
        <FR>true</FR>
        <SA>false</SA>
        <SO>false</SO>
        <gpsLaenge>9151569</gpsLaenge>
        <gpsBreite>48432079</gpsBreite>
        <befundtour>true</befundtour>
        <abholtour>true</abholtour>
        <druck>true</druck>
        <versandtour>true</versandtour>
        <status>A</status>
    </tourpos>
    <tourpos>
        <tourid>773802</tourid>
        <tourzeit>00:50:00</tourzeit>
        <bemerkung><![CDATA[Briefkasten ist offen (Klappe)!]]></bemerkung>
        <MO>false</MO>
        <DI>false</DI>
        <MI>false</MI>
        <DO>false</DO>
        <FR>false</FR>
        <SA>false</SA>
        <SO>false</SO>
        <gpsLaenge>9151569</gpsLaenge>
        <gpsBreite>48432079</gpsBreite>
        <befundtour>false</befundtour>
        <abholtour>true</abholtour>
        <druck>true</druck>
        <versandtour>false</versandtour>
        <status>A</status>
    </tourpos>
</customer>

в конце концов, я хотел бы иметь что-то вроде этого:

ХХХХХ|0|ААААА|073316|10:50|

Но в итоге я получаю что-то вроде этого:

ХХХХХ|0|ААААА|073316 773802|10:50:00 00:50:00

Сценарий :

      $file= .\FFFFF.*.xml
if (Test-Path -path $file){
$xml = [xml](Get-Content $file)
$xml.tourCustomer.customer | Select-Object  @(
@{l="LaborId";e={$_.laborid}},
@{l="Kundennr";e={0}},
@{l="Kürzel";e={$_.kundenid}},
@{l="Tour";e={$_.tourpos.tourid}},
@{l="Zeit";e={$_.tourpos.tourzeit}}) | Where-Object {$null -ne $_.Tour -and $null -ne $_.Zeit} 
|ConvertTo-Csv -Delimiter '|'-NoTypeInformation  | % {$_ -replace '"', ""} |  Out-File 
.\output_2.csv -Force -Encoding UTF8
}else
{return
}

На самом деле у меня не может быть "LaborId" только для подмножества "befundtour" с true, но, к сожалению, у меня есть оба.

1 ответ

      $xml.tourCustomer.customer | Select-Object  @(
    @{l="LaborId";e={ $_.laborid }},
    @{l="Kundennr";e={ 0 }},
    @{l="Kürzel";e={ $_.kundenid }},
    @{l="Tour";e={ ($_.tourpos | where befundtour -eq 'true').tourid }},
    @{l="Zeit";e={ ($_.tourpos | where befundtour -eq 'true').tourzeit }}
)

выходы

Идентификатор труда: ХХХХХ
Куденнр : 0
Кюрзель: ААААА
Тур : 073316
Время : 10:50:00

или, пройдя через ConvertTo-CSV -NoTypeInformation

"LaborId", "Kundenr", "Kürzel", "Tour", "Zeit"
«ХХХХХ», «0», «ААААА», «073316», «10:50:00»

Это будет работать, пока есть только один <befundtour>true</befundtour>за <customer>. Если это не гарантируется, вам необходимо определить более конкретные условия фильтрации или использовать -joinчтобы сделать список значений "в столбце".

Другие вопросы по тегам