【问题标题】:Multiple XML Parsing to Csv多个 XML 解析为 Csv
【发布时间】:2020-03-15 08:52:25
【问题描述】:

一直试图从多个 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的每个部分填充它,所以我可以得到一个完整的列表。

任何帮助将不胜感激!

【问题讨论】:

    标签: xml powershell parsing


    【解决方案1】:

    这似乎有点令人费解,但它确实有效。也许重新设计 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 方法有助于过滤结果。成员访问运算符. 可用于在应用where 条件后访问CarColour 属性。

    【讨论】:

    • 完美,感谢详细解释。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2015-06-20
    • 2015-05-26
    • 2017-05-06
    • 1970-01-01
    • 2020-01-09
    • 2017-06-15
    相关资源
    最近更新 更多