jocheng
Goto Top

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
<?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 face-sad

Content-ID: 307003

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

Ausgedruckt am: 05.11.2024 um 21:11 Uhr

colinardo
Lösung colinardo 13.06.2016 aktualisiert um 18:40:35 Uhr
Goto Top
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
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  
(min. PS 3.0)

Und führst es dann mit übergabe des Pfades zu XML-Datei aus:
powershell -Executionpolicy Bypass -File "C:\converter.ps1" "C:\Pfad\orderxyz.xml"
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:
'EK-Netto' = $subitem.Price.Value.replace('.',',')
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
jocheng
jocheng 13.06.2016 um 17:56:25 Uhr
Goto Top
hat super geholfen und klappt. Auch das mit dem Punkt und Komma habe ich noch verwendet. Wobei
'EK-Netto' = $subitem.Price.Value.replace('.',',')  
Richtig war um den Punkt zu erstzen (nur fals es jemand liest der das gleiche sucht)

DANKE dir colinardo