多个XML解析为Csv

时间:2019-11-19 18:36:11

标签: xml powershell parsing

一直在尝试将多个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的每个部分填充它,因此我可以获得完整的列表。

任何帮助将不胜感激!

1 个答案:

答案 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属性。