PowerShell-将具有公共标头和项目的XML转换为CSV

问题描述 投票:0回答:1

我想使用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 powershell csv
1个回答
0
投票

您是对的,与您之前提到的问题不同,在这种情况下,您的标头信息位于xml的不同部分。要捕获它,您将必须使用xpath:

例如,尝试:

$headers = $inputfile.SelectNodes("//TXNDETAIL[1]/preceding-sibling::*") | Select-Object -ExpandProperty Name

在这种情况下,echo $headers输出:

FileName
IntermediaryCode
ActualizationDate
SequenceNumber
NumberofRecords
AmountofRecords

这是您所需的标题信息。您可以使用它导出到csv等。

© www.soinside.com 2019 - 2024. All rights reserved.