文書から特定のXMLデータを選択する際に問題があります。 基礎となるデータはマーケティングイベントです。ドキュメントごとに複数のイベントが存在する可能性があります。各イベントの中には複数の出席者と登録者がいます。 foreach
ループ内のSelectNodes()
を使い始め、ハッシュテーブルに読み込んでからCSVに変換しました。特定のノードプロパティを選択してください
これはうまくいきましたが、複数のイベントでは行が矛盾していました。イベントIDは他のレコードデータと同期していませんでした。 私は現在、XML全体をCSVにエクスポートし、そこからETLツールを制御することを考えています。
ここでは私の理解に間隙があり、CSVに複数の特定のXML属性を選択する方法を知っている人がいるかどうか疑問に思っていました。
私のPowerShellのコード:
cls
[xml]$xml = Get-Content ("D:\sample.xml")
$dataTable = @()
$eventNodes = $xml.SelectNodes('//event')
foreach ($event in $eventNodes) {
$eventid = $event.eventid
$eventtitle = $event.eventtitle.InnerText
$eventtime = $event.eventtime
# get registrant data
$registrantNodes = $xml.SelectNodes('//registrant')
foreach ($registrant in $registrantNodes) {
$firstname = $registrant.firstname.InnerText
$lastname = $registrant.lastname.InnerText
$city = $registrant.city.InnerText
$state = $registrant.state.InnerText
$country = $registrant.country.InnerText
$company = $registrant.company.InnerText
$workphone = $registrant.workphone.InnerText
$email = $registrant.email.InnerText
# get attendee data
$attendeeNodes = $xml.SelectNodes('//attendee')
foreach ($attendee in $attendeeNodes) {
$attendedlive = $attendee.attendedlive.InnerText
$attendedarchive = $attendee.attendedarchive.InnerText
# put all data into holding table
$dataEntry = New-Object PSObject -Property @{
FirstName = $firstname;
LastName = $lastname;
City = $city;
State = $state;
Country = $country;
Company = $company;
WorkPhone = $workphone;
Email = $email;
AttendedLive = $attendedlive;
AttendedArchive = $attendedarchive;
EventID = $eventid;
EventTitle = $eventtitle;
EventTime = $eventtime;
Orginization = 'North America';
}
$dataTable += $dataEntry
}
}
}
# display holding table
$dataTable
$dataTable | Export-Csv -Force -Path "D:\output.csv" -NoTypeInformation
私は、サンプルのXMLファイルhereをアップロードしました。レイアウトは次のようになります。
このようにXMLファイルをロードしないでください。 PowerShellでXMLファイルをロードする正しい方法は、 '$ xml = New-Object xml; $ xml.Load($ path) 'となります。このようにすると、XMLファイルのエンコーディングが自動的に検出されます。 'Get-Content'を使うと、ファイルのエンコーディングが' Get-Content'のデフォルトと一致しないときにデータを破壊します。それはスマートではない指交差と同等です。 – Tomalak