XML in CSV umwandeln
Hallo Leute
Ich habe folgende XML Datei die ich mit einem Batch in eine CSV umwandeln will. Mein Problem dabei ist das nur Gewisse Spalten genommen werden dürfen und eine Spalte auch noch kombiniert werden muß (
XML
csv
Die Artikelnummer ist dabei eine Kombinion aus <ProductID>AF2262</ProductID>mit - und <Size>4042</Size>
Kann mir jemand helfen?? Das umwandeln von XML in CSV bekomme ich hingefrickelt aber das Auswählen und vor allem das kombinieren schaffe ich nicht
Ich habe folgende XML Datei die ich mit einem Batch in eine CSV umwandeln will. Mein Problem dabei ist das nur Gewisse Spalten genommen werden dürfen und eine Spalte auch noch kombiniert werden muß (
XML
<?xml version="1.0" encoding="UTF-8"?><Orders>
<Order>
<OrderHeader>
<OrderID>1108025602</OrderID>
<Language>de</Language>
<Currency>EUR</Currency>
<TradingPartners>
<OrderingParty>
<Identifier>
<PartnerID>01055212424</PartnerID>
</Identifier>
<Address>
<CompanyName1>Unternehmen</CompanyName1>
<Street>Straße</Street>
<HouseNumber>
</HouseNumber>
<City>Ort</City>
<PostalCode>PLZ</PostalCode>
<Country>DE</Country>
</Address>
</OrderingParty>
<ShipToParty>
<Identifier>
<PartnerID>01055212424</PartnerID>
</Identifier>
<Address>
<CompanyName1>Unternehmen</CompanyName1>
<Street>Straße</Street>
<HouseNumber>
</HouseNumber>
<City>Ort</City>
<PostalCode>PLZ</PostalCode>
<Country>DE</Country>
</Address>
</ShipToParty>
<BillToParty>
<Identifier>
<PartnerID>01055212424</PartnerID>
</Identifier>
<Address>
<CompanyName1>Unternehmen</CompanyName1>
<Street>Straße</Street>
<HouseNumber>
</HouseNumber>
<City>Ort</City>
<PostalCode>PLZ</PostalCode>
<Country>DE</Country>
</Address>
</BillToParty>
</TradingPartners>
<Description>
</Description>
<BillingDetails>
<BillingAmount>
<Value>1536.07</Value>
<Currency>EUR</Currency>
</BillingAmount>
<PartnerToCustomerBillingDetails/>
</BillingDetails>
<Tax>
<Value>182.82</Value>
<Currency>EUR</Currency>
</Tax>
</OrderHeader>
<OrderItem>
<OrderItemID>000010</OrderItemID>
<DeliveryDate>2016-06-13</DeliveryDate>
<Product>
<Type>Material</Type>
<Identifier>
<ProductID>F44491</ProductID>
</Identifier>
<Description>Hose</Description>
</Product>
<Quantity>
<Value>1.00</Value>
<UoM>ST</UoM>
</Quantity>
<Price>
<Value>11.20</Value>
<Currency>EUR</Currency>
</Price>
<Tax>
<Value>1.51</Value>
<Currency>EUR</Currency>
</Tax>
<ShipToParty>
<Identifier>
<PartnerID>01055212424</PartnerID>
</Identifier>
<Address>
<CompanyName1>Unternehmen</CompanyName1>
<Street>Straße</Street>
<HouseNumber>
</HouseNumber>
<City>Ort</City>
<PostalCode>PLZ</PostalCode>
<Country>DE</Country>
</Address>
</ShipToParty>
<SubItem>
<DeliveryDate>2016-06-16</DeliveryDate>
<Size>L</Size>
<Quantity>
<Value>1</Value>
<UoM>ST</UoM>
</Quantity>
<Price>
<Value>11.20</Value>
<Currency>EUR</Currency>
<PriceBasisQuantity>1</PriceBasisQuantity>
</Price>
<RecommendedRetailerPrice>
<Value>22.95</Value>
<Currency>EUR</Currency>
<PriceBasisQuantity>1</PriceBasisQuantity>
</RecommendedRetailerPrice>
<TotalPrice>
<Value>11.20</Value>
<Currency>EUR</Currency>
</TotalPrice>
</SubItem>
</OrderItem>
<OrderItem>
<OrderItemID>000020</OrderItemID>
<DeliveryDate>2016-06-13</DeliveryDate>
<Product>
<Type>Material</Type>
<Identifier>
<ProductID>D82554</ProductID>
</Identifier>
<Description>Hose</Description>
</Product>
<Quantity>
<Value>30.00</Value>
<UoM>ST</UoM>
</Quantity>
<Price>
<Value>336.00</Value>
<Currency>EUR</Currency>
</Price>
<Tax>
<Value>45.40</Value>
<Currency>EUR</Currency>
</Tax>
<ShipToParty>
<Identifier>
<PartnerID>01055212424</PartnerID>
</Identifier>
<Address>
<CompanyName1>Unternehmen</CompanyName1>
<Street>Straße</Street>
<HouseNumber>
</HouseNumber>
<City>Ort</City>
<PostalCode>PLZ</PostalCode>
<Country>DE</Country>
</Address>
</ShipToParty>
<SubItem>
<DeliveryDate>2016-06-16</DeliveryDate>
<Size>L</Size>
<Quantity>
<Value>30</Value>
<UoM>ST</UoM>
</Quantity>
<Price>
<Value>11.20</Value>
<Currency>EUR</Currency>
<PriceBasisQuantity>1</PriceBasisQuantity>
</Price>
<RecommendedRetailerPrice>
<Value>22.95</Value>
<Currency>EUR</Currency>
<PriceBasisQuantity>1</PriceBasisQuantity>
</RecommendedRetailerPrice>
<TotalPrice>
<Value>336.00</Value>
<Currency>EUR</Currency>
</TotalPrice>
</SubItem>
</OrderItem>
<OrderItem>
<OrderItemID>000030</OrderItemID>
<DeliveryDate>2016-06-13</DeliveryDate>
<Product>
<Type>Material</Type>
<Identifier>
<ProductID>AF2262</ProductID>
</Identifier>
<Description>Socken</Description>
</Product>
<Quantity>
<Value>14.00</Value>
<UoM>ST</UoM>
</Quantity>
<Price>
<Value>68.60</Value>
<Currency>EUR</Currency>
</Price>
<Tax>
<Value>9.27</Value>
<Currency>EUR</Currency>
</Tax>
<ShipToParty>
<Identifier>
<PartnerID>01055212424</PartnerID>
</Identifier>
<Address>
<CompanyName1>Unternehmen</CompanyName1>
<Street>Straße</Street>
<HouseNumber>
</HouseNumber>
<City>Ort</City>
<PostalCode>PLZ</PostalCode>
<Country>DE</Country>
</Address>
</ShipToParty>
<SubItem>
<DeliveryDate>2016-06-16</DeliveryDate>
<Size>3739</Size>
<Quantity>
<Value>6</Value>
<UoM>ST</UoM>
</Quantity>
<Price>
<Value>4.90</Value>
<Currency>EUR</Currency>
<PriceBasisQuantity>1</PriceBasisQuantity>
</Price>
<RecommendedRetailerPrice>
<Value>9.95</Value>
<Currency>EUR</Currency>
<PriceBasisQuantity>1</PriceBasisQuantity>
</RecommendedRetailerPrice>
<TotalPrice>
<Value>29.40</Value>
<Currency>EUR</Currency>
</TotalPrice>
</SubItem>
<SubItem>
<DeliveryDate>2016-06-16</DeliveryDate>
<Size>4042</Size>
<Quantity>
<Value>8</Value>
<UoM>ST</UoM>
</Quantity>
<Price>
<Value>4.90</Value>
<Currency>EUR</Currency>
<PriceBasisQuantity>1</PriceBasisQuantity>
</Price>
<RecommendedRetailerPrice>
<Value>9.95</Value>
<Currency>EUR</Currency>
<PriceBasisQuantity>1</PriceBasisQuantity>
</RecommendedRetailerPrice>
<TotalPrice>
<Value>39.20</Value>
<Currency>EUR</Currency>
</TotalPrice>
</SubItem>
</OrderItem>
</Order>
</Orders>
csv
Fremdbelegnummer;Artikelnummer;Menge;Lieferdatum;EK Netto;USt;
1108025602;F44491-L;1;16.06.2016;11,2;19;
1108025602;D82554-L;30;16.06.2016;11,2;19;
1108025602;AF2262-3739;6;16.06.2016;4,9;19;
1108025602;AF2262-4042;8;16.06.2016;4,9;19;
Die Artikelnummer ist dabei eine Kombinion aus <ProductID>AF2262</ProductID>mit - und <Size>4042</Size>
Kann mir jemand helfen?? Das umwandeln von XML in CSV bekomme ich hingefrickelt aber das Auswählen und vor allem das kombinieren schaffe ich nicht
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 307003
Url: https://administrator.de/contentid/307003
Ausgedruckt am: 22.11.2024 um 12:11 Uhr
2 Kommentare
Neuester Kommentar
Hallo jocheng,
das macht man heutzutage mit aktuelleren Tools wie z.B. Powershell, gerade bei XML-Dokumenten ist Batch einfach kein guter Kandidat mehr.
Dazu nimmst du dieses Skript, speicherst es als converter.ps1
(min. PS 3.0)
Und führst es dann mit übergabe des Pfades zu XML-Datei aus:
Die erzeugte CSV-Datei wird dann im selben Order wie die XML-Datei abgelegt.
Beachte: Wenn du die erzeugte CSV-Datei direkt in Excel durch doppelklick öffnen willst, sollte man in den Zahlenwerten des Preises noch den Punkt durch ein Komma ersetzen, je nachdem wie Excel eingestellt ist.
In dem Fall wäre dann die Zeile für den EK-Netto noch so anzupassen:
Die Spalte für die Ust habe ich jetzt nicht in der XML-Datei ausmachen können, nur den tatsächlichen Ust-Wert - soll der Prozentwert dann stattdessen anhand des Einzelpreises manuell berechnet und eingetragen werden?
Grüße Uwe
p.s. einen generischen XML zu CSV Konverter von mir findest du auch hier:
CSV to XML Konverter
das macht man heutzutage mit aktuelleren Tools wie z.B. Powershell, gerade bei XML-Dokumenten ist Batch einfach kein guter Kandidat mehr.
Dazu nimmst du dieses Skript, speicherst es als converter.ps1
param(
[parameter(mandatory=$true)][string]$xmlpath
)
# XML Datei einlesen
$xml = new-Object XML; $xml.Load($xmlpath)
# Order ID (Fremdbelegnummer extrahieren)
$orderid = $xml.Orders.Order.OrderHeader.OrderID
# Für jedes OrderItem ...
$xml.Orders.Order.OrderItem | %{
# und für jedes Subitem des Orderitem ...
foreach($subitem in $_.Subitem){
# erstelle custom object mit den gewünschten Eigenschaften
[pscustomobject] @{
Fremdbelegnummer = $orderid
Artikelnummer = "$($_.Product.Identifier.ProductID)-$($subitem.Size)"
Menge = $subitem.Quantity.Value
Lieferdatum = get-date $subitem.DeliveryDate -Format 'dd.MM.yyyy'
'EK-Netto' = $subitem.Price.Value
}
}
} | export-csv "$([System.IO.Path]::GetDirectoryName($xmlPath))\$([System.IO.Path]::GetFilenameWithoutExtension($xmlPath)).csv" -Delimiter ";" -NoType -Encoding UTF8
Und führst es dann mit übergabe des Pfades zu XML-Datei aus:
powershell -Executionpolicy Bypass -File "C:\converter.ps1" "C:\Pfad\orderxyz.xml"
Beachte: Wenn du die erzeugte CSV-Datei direkt in Excel durch doppelklick öffnen willst, sollte man in den Zahlenwerten des Preises noch den Punkt durch ein Komma ersetzen, je nachdem wie Excel eingestellt ist.
In dem Fall wäre dann die Zeile für den EK-Netto noch so anzupassen:
'EK-Netto' = $subitem.Price.Value.replace('.',',')
Grüße Uwe
p.s. einen generischen XML zu CSV Konverter von mir findest du auch hier:
CSV to XML Konverter