xml - PowerShell - 将带有公共标头和项目的 XML 转换为 CSV
问题描述
我想使用 PowerShell 将 XML 转换为 CSV。我一直在看这个例子:Powershell - convert XML to CSV,这是一个很好的步骤,但我的 XML 结构和需求略有不同。我的 XML 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Transaction>
<FileName>001</FileName>
<IntermediaryCode>19000033</IntermediaryCode>
<ActualizationDate>20170314</ActualizationDate>
<SequenceNumber>001</SequenceNumber>
<NumberofRecords>3</NumberofRecords>
<AmountofRecords>30000</AmountofRecords>
<TXNDETAIL>
<RecordID>02</RecordID>
<SequenceNumber>1</SequenceNumber>
<TransactionType>01</TransactionType>
<ActionCode>01</ActionCode>
<TransactionID>17500515552017001</TransactionID>
<SellerCode>2200919TRY</SellerCode>
<BuyerCode>KOCZER</BuyerCode>
<TransactionReference> </TransactionReference>
<TransactionDescription1> </TransactionDescription1>
<TransactionDescription2> </TransactionDescription2>
<DocumentType>01</DocumentType>
<DocumentNumber>XXXXXXXXXXX</DocumentNumber>
<DocumentDate>20170301</DocumentDate>
<DocumentAmount>10000</DocumentAmount>
<CurrencyCode>949</CurrencyCode>
<TransactionAmount>10000</TransactionAmount>
<TransactionDueDate>20170505</TransactionDueDate>
<AdditionalInformation1> </AdditionalInformation1>
<AdditionalInformation2> </AdditionalInformation2>
<HashCode>XXXXXXXX</HashCode>
</TXNDETAIL>
<TXNDETAIL>
<RecordID>02</RecordID>
<SequenceNumber>2</SequenceNumber>
<TransactionType>01</TransactionType>
<ActionCode>01</ActionCode>
<TransactionID>17500515622017001</TransactionID>
<SellerCode>2200919TRY</SellerCode>
<BuyerCode>KOCZER</BuyerCode>
<TransactionReference> </TransactionReference>
<TransactionDescription1> </TransactionDescription1>
<TransactionDescription2> </TransactionDescription2>
<DocumentType>01</DocumentType>
<DocumentNumber>XXXXXXXXXXX</DocumentNumber>
<DocumentDate>20170301</DocumentDate>
<DocumentAmount>10000</DocumentAmount>
<CurrencyCode>949</CurrencyCode>
<TransactionAmount>10000</TransactionAmount>
<TransactionDueDate>20170505</TransactionDueDate>
<AdditionalInformation1> </AdditionalInformation1>
<AdditionalInformation2> </AdditionalInformation2>
<HashCode>XXXXXXXX</HashCode>
</TXNDETAIL>
<TXNDETAIL>
<RecordID>02</RecordID>
<SequenceNumber>3</SequenceNumber>
<TransactionType>01</TransactionType>
<ActionCode>01</ActionCode>
<TransactionID>17500515972017001</TransactionID>
<SellerCode>2200919TRY</SellerCode>
<BuyerCode>KOCZER</BuyerCode>
<TransactionReference> </TransactionReference>
<TransactionDescription1> </TransactionDescription1>
<TransactionDescription2> </TransactionDescription2>
<DocumentType>01</DocumentType>
<DocumentNumber>XXXXXXXXXXX</DocumentNumber>
<DocumentDate>20170301</DocumentDate>
<DocumentAmount>10000</DocumentAmount>
<CurrencyCode>949</CurrencyCode>
<TransactionAmount>10000</TransactionAmount>
<TransactionDueDate>20170505</TransactionDueDate>
<AdditionalInformation1> </AdditionalInformation1>
<AdditionalInformation2> </AdditionalInformation2>
<HashCode>XXXXXXXX</HashCode>
</TXNDETAIL>
</Transaction>
我想在每个 TXNDETAIL 前面放置 FileName 到 AmountofRecords 值:
"FileName";"IntermediaryCode";"ActualizationDate";"SequenceNumber";"NumberofRecords";"AmountofRecords";"RecordID";"SequenceNumber";"TransactionType";"ActionCode";"TransactionID";"SellerCode";"BuyerCode";"TransactionReference";"TransactionDescription1";"TransactionDescription2";"DocumentType";"DocumentNumber";"DocumentDate";"DocumentAmount";"CurrencyCode";"TransactionAmount";"TransactionDueDate";"AdditionalInformation1";"AdditionalInformation2";"HashCode"
"001";"19000033";"20170314";"001";"3";"30000";"02";"1";"01";"01";"17500515552017001";"2200919TRY";"KOCZER";"";"";"";"01";"XXXXXXXXXXX";"20170301";"10000";"949";"10000";"20170505";"";"";"XXXXXXXX"
"001";"19000033";"20170314";"001";"3";"30000";"02";"2";"01";"01";"17500515622017001";"2200919TRY";"KOCZER";"";"";"";"01";"XXXXXXXXXXX";"20170301";"10000";"949";"10000";"20170505";"";"";"XXXXXXXX"
"001";"19000033";"20170314";"001";"3";"30000";"02";"3";"01";"01";"17500515972017001";"2200919TRY";"KOCZER";"";"";"";"01";"XXXXXXXXXXX";"20170301";"10000";"949";"10000";"20170505";"";"";"XXXXXXXX"
通过使用此代码,我得到了 TXNDETAIL,但没有得到标题信息:
$Input = $args[0]
$Output = $args[1]
#read from file
[xml]$inputFile = Get-Content $input
#export xml as csv
$inputFile.Transaction.TXNDETAIL | Export-Csv $Output -NoTypeInformation -Delimiter:";" -Encoding:UTF8
如何将标题信息添加到每一行?
解决方案
您是对的,与您提到的上一个问题不同,在这种情况下,您的标头信息位于 xml 的不同部分。要捕获它,您必须使用 xpath:
因此,例如,尝试:
$headers = $inputfile.SelectNodes("//TXNDETAIL[1]/preceding-sibling::*") | Select-Object -ExpandProperty Name
在这种情况下,echo $headers
输出:
FileName
IntermediaryCode
ActualizationDate
SequenceNumber
NumberofRecords
AmountofRecords
这是您所需的标题信息。您可以使用它导出到 csv 等。
推荐阅读
- css - 缩放百分比时如何更改文本?
- excel - VBA/Userform - 将值从文本框传输到带有书签的 Word 不起作用
- reactjs - 如何使用 React Hook useState 更新 2 个对象
- c++ - 将参数转发到可变参数模板函数时如何添加参数值?
- flutter - Flutter CustomPainter - 从弧形刮边
- anylogic - 抓住块中动作的含义
- angular - 在fabricjs中将背景图像设置为iText
- android - 如何从文件夹中获取所有文件的文件创建日期并在 TextView 中显示 gridview android holder.creationdate.settext() 类似的东西?
- javascript - 在没有 onload 的情况下将函数附加到窗口 - React & Next.js
- database - 高性能多租户数据库迁移解决方案