springstil
Goto Top

XML zu CSV in Powershell

Hallo Zusammen,

ich habe schon einmal hilfe gebraucht bei einem Skript in Powershell was XML zu CSV umwandelt. Ich dachte eigendlich in meinem jugendlichem leichtsinn, das ich dies dann auch alleine bewerkstelligen könnte und das skript umbauen kann wenn ich eine andere XML bekomme.

Leider ist das nicht der fall :D

<?xml version="1.0" encoding="UTF-8" standalone="no"?>  
<ns1:ORDERS xmlns:ns1="wbd:com.weltbild:schemas/ordermanagement/opentrans">  
<ns1:ORDER>
<ns1:ORDER_HEADER>
<ns1:ORDER_INFO>
<ns1:ORDER_ID>4500001256</ns1:ORDER_ID>
<ns1:ORDER_DATE>19.09.2019</ns1:ORDER_DATE>
<ns1:ORDER_PARTIES>
<ns1:BUYER_PARTY>
<ns1:PARTY>
<ns1:PARTY_ID type="GLN">4026411908746</ns1:PARTY_ID>  
</ns1:PARTY>
</ns1:BUYER_PARTY>
<ns1:SUPPLIER_PARTY>
<ns1:PARTY>
<ns1:PARTY_ID type="GLN">4042882000002</ns1:PARTY_ID>  
</ns1:PARTY>
</ns1:SUPPLIER_PARTY>
<ns1:INVOICE_PARTY>
<ns1:PARTY>
<ns1:PARTY_ID type="buyer_specific">700405566</ns1:PARTY_ID>  
<ns1:ADDRESS>
<ns1:TITLE>Frau</ns1:TITLE>
<ns1:NAME>Stefanie Blattner</ns1:NAME>
<ns1:STREET>Johanneskirchner Str. 8</ns1:STREET>
<ns1:ZIP>85774</ns1:ZIP>
<ns1:CITY>Unterföhring</ns1:CITY>
<ns1:COUNTRYCODE>DE</ns1:COUNTRYCODE>
</ns1:ADDRESS>
</ns1:PARTY>
</ns1:INVOICE_PARTY>
<ns1:SHIPMENT_PARTIES>
<ns1:DELIVERY_PARTY>
<ns1:PARTY>
<ns1:PARTY_ID type="buyer_specific">700405566</ns1:PARTY_ID>  
<ns1:ADDRESS>
<ns1:TITLE>Frau</ns1:TITLE>
<ns1:NAME>Stefanie Blattner</ns1:NAME>
<ns1:STREET>Johanneskirchner Str. 8</ns1:STREET>
<ns1:ZIP>85774</ns1:ZIP>
<ns1:CITY>Unterföhring</ns1:CITY>
<ns1:COUNTRYCODE>DE</ns1:COUNTRYCODE>
</ns1:ADDRESS>
</ns1:PARTY>
</ns1:DELIVERY_PARTY>
</ns1:SHIPMENT_PARTIES>
</ns1:ORDER_PARTIES>
<ns1:PRICE_CURRENCY>EUR</ns1:PRICE_CURRENCY>
<ns1:REMARK type="ClientReferenceNumber">520081097</ns1:REMARK>  
<ns1:TERMS_AND_CONDITIONS>ZZ</ns1:TERMS_AND_CONDITIONS>
</ns1:ORDER_INFO>
</ns1:ORDER_HEADER>
<ns1:ORDER_ITEM_LIST>
<ns1:ORDER_ITEM>
<ns1:LINE_ITEM_ID>0010</ns1:LINE_ITEM_ID>
<ns1:ARTICLE_ID>
<ns1:SUPPLIER_AID>8878791</ns1:SUPPLIER_AID>
<ns1:BUYER_AID type="buyer_specific">86264505</ns1:BUYER_AID>  
<ns1:DESCRIPTION_SHORT>miaVILLA Hakenleiste Leuchtturm Weiß</ns1:DESCRIPTION_SHORT>
</ns1:ARTICLE_ID>
<ns1:QUANTITY>1</ns1:QUANTITY>
<ns1:ORDER_UNIT>PCE</ns1:ORDER_UNIT>
<ns1:ARTICLE_PRICE type="upd_gros_customer">  
<ns1:PRICE_AMOUNT>39.99</ns1:PRICE_AMOUNT>
</ns1:ARTICLE_PRICE>
<ns1:ARTICLE_PRICE type="net_list">  
<ns1:PRICE_AMOUNT>20.00</ns1:PRICE_AMOUNT>
</ns1:ARTICLE_PRICE>
<ns1:REMARK type="Description">0821/2672151$$judith.hobner@XXX.com</ns1:REMARK>  
</ns1:ORDER_ITEM>
<ns1:ORDER_ITEM>
<ns1:LINE_ITEM_ID>0020</ns1:LINE_ITEM_ID>
<ns1:ARTICLE_ID>
<ns1:SUPPLIER_AID>9161395</ns1:SUPPLIER_AID>
<ns1:BUYER_AID type="buyer_specific">100450508</ns1:BUYER_AID>  
<ns1:DESCRIPTION_SHORT>miaVILLA Deckenleuchte Mare Blau/Grau</ns1:DESCRIPTION_SHORT>
</ns1:ARTICLE_ID>
<ns1:QUANTITY>1</ns1:QUANTITY>
<ns1:ORDER_UNIT>PCE</ns1:ORDER_UNIT>
<ns1:ARTICLE_PRICE type="upd_gros_customer">  
<ns1:PRICE_AMOUNT>59.99</ns1:PRICE_AMOUNT>
</ns1:ARTICLE_PRICE>
<ns1:ARTICLE_PRICE type="net_list">  
<ns1:PRICE_AMOUNT>31.25</ns1:PRICE_AMOUNT>
</ns1:ARTICLE_PRICE>
</ns1:ORDER_ITEM>
</ns1:ORDER_ITEM_LIST>
<ns1:ORDER_SUMMARY>
<ns1:TOTAL_ITEM_NUM>2</ns1:TOTAL_ITEM_NUM>
<ns1:TOTAL_AMOUNT>99.98</ns1:TOTAL_AMOUNT>
</ns1:ORDER_SUMMARY>
</ns1:ORDER>
</ns1:ORDERS>

so sieht meine XML datei aus die ich gerne in CSV umwandeln möchte. Ich brauche nicht unbedingt alle Felder davon. Nur würde ich auch gern Verstehen wie ich so eine XML datei in CSV umwandeln kann. Ich habe sowas schon mal für Otto gebraucht:

$xmlfiles = ls .\ -Filter *.xml -File
foreach($file in $xmlfiles){
    $xml = New-Object XML
    $xml.Load($file.Fullname)
    
    $xml.ottopartner.PurchaseOrder.OrderItem | %{
        [pscustomobject]@{
            OrderNo = $_.ParentNode.OrderNo
            OrderDate = $_.ParentNode.OrderDate
            Name = $_.ParentNode.DeliveryAddress.Address.Name
            Street = $_.ParentNode.DeliveryAddress.Address.Street
            Zip = $_.ParentNode.DeliveryAddress.Address.Zip
            City = $_.ParentNode.DeliveryAddress.Address.City
            Country = $_.ParentNode.DeliveryAddress.Address.Country
            ItemNo = $_.ItemNo
            EAN = $_.OrderSKU.EAN
            QuantityUnit = $_.QuantityUnit
            BuyingPrice = $_.OrderSKU.BuyingPrice
            Quantity = $_.OrderSKU.Quantity
        }
    } | export-csv (join-path $file.DirectoryName "$($file.BaseName).csv") -NoTypeInformation -Delimiter ";" -Encoding UTF8  
}

Nur ist der Aufbau der Otto Datei anders als bei der neuen XML Datei, weswegen ich auch nach vielen Probieren einfach nicht weiter komme. Vielleicht kann mir jemand versuchen zu erklären wie ich das Skript umschreiben müsste damit es Funktioniert face-smile

Content-Key: 661838

Url: https://administrator.de/contentid/661838

Printed on: May 2, 2024 at 16:05 o'clock

Mitglied: 147669
147669 Mar 12, 2021 updated at 16:00:27 (UTC)
Goto Top
$xmlfiles = ls .\ -Filter *.xml -File
foreach($file in $xmlfiles){
    $xml = New-Object XML
    $xml.Load($file.Fullname)
    
    $xml.Orders.Order.Order_Item_List.Order_Item | %{
        [pscustomobject]@{
            OrderNo = $_.ParentNode.ParentNode.Order_Header.Order_Info.Order_ID
            OrderDate = $_.ParentNode.ParentNode.Order_Header.Order_Info.Order_Date
            Name = $_.ParentNode.ParentNode.Order_Header.Order_Info.Order_Parties.Invoice_Party.Party.Address.Name
            Street = $_.ParentNode.ParentNode.Order_Header.Order_Info.Order_Parties.Invoice_Party.Party.Address.Street
            Zip = $_.ParentNode.ParentNode.Order_Header.Order_Info.Order_Parties.Invoice_Party.Party.Address.Zip
            City = $_.ParentNode.ParentNode.Order_Header.Order_Info.Order_Parties.Invoice_Party.Party.Address.City
            Country = $_.ParentNode.ParentNode.Order_Header.Order_Info.Order_Parties.Invoice_Party.Party.Address.CountryCode
            ItemNo = $_.Article_Id.Buyer_Aid.innerText
            QuantityUnit = $_.Order_Unit
            BuyingPrice = $_.Article_Price | ?{$_.type -eq 'upd_gros_customer'} | %{$_.Price_Amount}  
            Quantity = $_.Quantity
        }
    } | export-csv (join-path $file.DirectoryName "$($file.BaseName).csv") -NoTypeInformation -Delimiter ";" -Encoding UTF8  
}
Vielleicht kann mir jemand versuchen zu erklären wie ich das Skript umschreiben müsste
Dazu musst du nur wissen wie ein XML-DOM funktioniert und wie man darin navigiert. Da das hier .NET Objekte sind gilt auch die DOKU für das .NET

https://docs.microsoft.com/de-de/dotnet/api/system.xml.xmldocument?view= ...