一直在尝试将多个XML文件中的某些数据提取到一个csv文件中。并不是很多编码人员,但是我已经能够使用powershell并获得一些所需的输出,但是脚本仅返回第一个XML条目并停止。请在下面查看XML输入(所有XML都遵循相同的输入),代码和所需的输出,我也将所需的输出也放在下面:
输入
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<Base Date='Update' Description='Test'>
< name='Test'>
<car>
<cars CarID='45678901987612923'>
<Information>
<Info CarName='Audi' CarColour='Blue'/>
<Info CarName='BMW' CarColour='Pink'/>
</Information>
<Owners>
<Owner OwnerStatus='Current'>
<OwnerInfo OwnerName='Joe Bloggs' OwnerAge='35'/>
</OwnerInfo>
</Owner>
</Owners>
</cars>
<cars CarID='87654346789012678'>
<Information>
<Info CarName='Audi' CarColour='Yellow'/>
<Info CarName='BMW' CarColour='Green'/>
</Information>
<Owners>
<Owner OwnerStatus='Current'>
<OwnerInfo OwnerName='Anne Smyth' OwnerAge='42'/>
</OwnerInfo>
</Owner>
</Owners>
</cars>
</car>
...
...
...
</name>
</Base>
代码
$items = Get-ChildItem C:\*.xml
foreach ($item in $items) {[xml]$xml = (Get-Content $item)
$cars = $xml.Base.name.car.cars.Information.Info.CarColour
$owner = $xml.Base.name.car.cars.Owners.Owner.OwnerInfo.OwnerName
$results = New-Object PSObject -Property @{
Audi= $cars[0]
BMW= $cars[1]
Owner= $owner[0]}
$results | Export-Csv -Path C:\test.csv -NoTypeInformation -Append}
当前输出
Audi BMW Owner
Blue Pink Joe Bloggs
所需的输出
Audi BMW Owner
Blue Pink Joe Bloggs
Yellow Green Anne Smyth
如上所述,以上内容适用于相同格式的多个xml,我只是不知道如何为每个XML的每个部分填充它,因此我可以获得完整的列表。
任何帮助将不胜感激!
答案 0 :(得分:0)
这似乎有些令人费解,但是可以。重新设计XML可能会有所帮助。
$items = Get-ChildItem C:\*.xml
foreach ($item in $items) {
$xml = [xml](Get-Content $item)
$xml.base.name.car.cars | Foreach-Object {
$results = [pscustomobject]@{
'Audi' = $_.information.info.where{$_.CarName -eq 'Audi'}.CarColour
'BMW' = $_.information.info.where{$_.CarName -eq 'BMW'}.Carcolour
'Owner' = $_.Owners.Owner.OwnerInfo.OwnerName
}
$results | Export-Csv -Path C:\test.csv -NoTypeInformation -Append
}
}
由于公共数据点始于$xml.base.name.car.cars
,并且恰好是一个集合,因此可以在该参考点处迭代对象。 where
方法有助于过滤结果。在应用.
条件之后,可以使用成员访问运算符CarColour
来访问where
属性。