Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[XML] Converteren XML naar CSV

Pagina: 1
Acties:

Vraag


  • Yagermeister
  • Registratie: December 2001
  • Laatst online: 08:17

Yagermeister

Bedrijfsprutser on call

Topicstarter
Ik ben op dit moment bezig om een script te schrijven die de openstaande orders van een Bol account doet downloaden om deze daarna in een CSV te zetten zodat ik verdere bewerkingen kan doen hiermee.

Het lukt me makkelijk genoeg om de orders te downloaden van alle Bol orders zodat ik een XML file heb met daarin de open staande orders zoals het voorbeeld hieronder:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?xml version="1.0" encoding="UTF-8"?>
<Orders xmlns="https://plazaapi.bol.com/services/xsd/v2/plazaapi.xsd">
<Order>
 <OrderId>4123456789</OrderId>
 <DateTimeCustomer>2017-02-09T12:39:48.000+01:00</DateTimeCustomer>
 <DateTimeDropShipper>2017-02-09T12:39:48.000+01:00</DateTimeDropShipper>
 <CustomerDetails>
   <ShipmentDetails>
     <SalutationCode>02</SalutationCode>
     <Firstname>Billie</Firstname>
     <Surname>Van der Bol.com</Surname>
     <Streetname>Dorpstraat</Streetname>
     <Housenumber>1</Housenumber>
     <HousenumberExtended>B</HousenumberExtended>
     <ZipCode>1111 ZZ</ZipCode>
     <City>Utrecht</City>
     <CountryCode>NL</CountryCode>
     <Email>2awq74td4z4mizmx6dcdbsdbdcna@verkopen.bol.com</Email>
     <Company>bol.com</Company>
   </ShipmentDetails>
   <BillingDetails>
     <SalutationCode>02</SalutationCode>
     <Firstname>Billie</Firstname>
     <Surname>van der Bol.com</Surname>
     <Streetname>Dorpstraat</Streetname>
     <Housenumber>1</Housenumber>
     <HousenumberExtended>B</HousenumberExtended>
     <ZipCode>1111 ZZ</ZipCode>
     <City>Utrecht</City>
     <CountryCode>NL</CountryCode>
     <Email>2awq74td4z4mizmx6dcdbsdbdcna@verkopen.bol.com</Email>
     <Company>bol.com</Company>
   </BillingDetails>
 </CustomerDetails>
 <OrderItems>
   <OrderItem>
     <OrderItemId>2012345678</OrderItemId>
     <EAN>5412810182312</EAN>
     <OfferReference>BOLCOM00123</OfferReference>
     <Title>Basicxl - Rijdende Wekker - Kunststof - 16x11cm - Zwart</Title>
     <Quantity>1</Quantity>
     <OfferPrice>27.95</OfferPrice>
     <TransactionFee>5.18</TransactionFee>
     <LatestDeliveryDate>2017-02-10+01:00</LatestDeliveryDate>
     <OfferCondition>NEW</OfferCondition>
     <CancelRequest>false</CancelRequest>
     <FulfilmentMethod>FBR</FulfilmentMethod>
   </OrderItem>
 </OrderItems>
 </Order>
</Orders>


Nu wil ik dat dus omgezet hebben naar een CSV bestand zodat ik verdere bewerkingen hiermee kan doen. Het liefste zou ik dit op een linux platform willen hebben zodat de rest van het script makkelijker te schrijven is voor mij.

Ik heb rond gezocht maar ik kan niet echt een converter vinden die dit omgezet krijgt behalve wat online tools. Nu heb ik op een gegeven moment een php script gevonden die wel werkt echter zet hij alle waardes in 2 kolommen (veldnaam ; waarde) ipv van meerdere rijen waarbij de veldnaam als eerste rij staat.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php

$filexml='orders.xml';
    if (file_exists($filexml))
                {
        $xml = simplexml_load_file($filexml);
        $f = fopen('test.csv', 'w');
        createCsv($xml, $f);
        fclose($f);
        }

        function createCsv($xml,$f)
        {

                foreach ($xml->children() as $item)
                {

                        $hasChild = (count($item->children()) > 0)?true:false;

                if( ! $hasChild)
                {
                        $put_arr = array($item->getName(),$item);
                        fputcsv($f, $put_arr ,',','"');

                }
                else
                {
                        createCsv($item, $f);
                }
        }

        }


Daar ik niet veel php kennis heb, heb ik geen idee hoe ik dit kan aanpassen. Kan iemand me op de weg helpen hiermee?

-Te huur

Beste antwoord (via Yagermeister op 12-02-2018 20:03)


  • breew
  • Registratie: April 2014
  • Laatst online: 07:43
Ik zou zeggen; verdiep je eens in R. Alle code kan in één regel, maar onderstaande is wat leesbaarder ;-)

Waarschijnlijk kan je in R ook alle verdere bewerkingen doen die je op de csv los zou willen laten. Je kunt een R-script verder ook vrij eenvoudig geautomatiseerd laten draaien (crontab), en/of geautomatiseerd data van internet af laten halen.

Gebaseerd op jouw voorbeeld-data:
S:
1
2
3
4
5
6
7
8
library(XML)
library(plyr)
#locatie van het bestand
file <- "orders.xml"
#inlezen en converteren naar data.frame
tmp <- ldply( xmlToList( file ), data.frame )
#data.frame wegschrijven als csv
write.csv( tmp, "orders.csv" )


levert de volgende output-csv

"",".id","OrderId","DateTimeCustomer","DateTimeDropShipper","CustomerDetails.ShipmentDetails.SalutationCode","CustomerDetails.ShipmentDetails.Firstname","CustomerDetails.ShipmentDetails.Surname","CustomerDetails.ShipmentDetails.Streetname","CustomerDetails.ShipmentDetails.Housenumber","CustomerDetails.ShipmentDetails.HousenumberExtended","CustomerDetails.ShipmentDetails.ZipCode","CustomerDetails.ShipmentDetails.City","CustomerDetails.ShipmentDetails.CountryCode","CustomerDetails.ShipmentDetails.Email","CustomerDetails.ShipmentDetails.Company","CustomerDetails.BillingDetails.SalutationCode","CustomerDetails.BillingDetails.Firstname","CustomerDetails.BillingDetails.Surname","CustomerDetails.BillingDetails.Streetname","CustomerDetails.BillingDetails.Housenumber","CustomerDetails.BillingDetails.HousenumberExtended","CustomerDetails.BillingDetails.ZipCode","CustomerDetails.BillingDetails.City","CustomerDetails.BillingDetails.CountryCode","CustomerDetails.BillingDetails.Email","CustomerDetails.BillingDetails.Company","OrderItems.OrderItem.OrderItemId","OrderItems.OrderItem.EAN","OrderItems.OrderItem.OfferReference","OrderItems.OrderItem.Title","OrderItems.OrderItem.Quantity","OrderItems.OrderItem.OfferPrice","OrderItems.OrderItem.TransactionFee","OrderItems.OrderItem.LatestDeliveryDate","OrderItems.OrderItem.OfferCondition","OrderItems.OrderItem.CancelRequest","OrderItems.OrderItem.FulfilmentMethod"
"1","Order","4123456789","2017-02-09T12:39:48.000+01:00","2017-02-09T12:39:48.000+01:00","02","Billie","Van der Bol.com","Dorpstraat","1","B","1111 ZZ","Utrecht","NL","2awq74td4z4mizmx6dcdbsdbdcna@verkopen.bol.com","bol.com","02","Billie","van der Bol.com","Dorpstraat","1","B","1111 ZZ","Utrecht","NL","2awq74td4z4mizmx6dcdbsdbdcna@verkopen.bol.com","bol.com","2012345678","5412810182312","BOLCOM00123","Basicxl - Rijdende Wekker - Kunststof - 16x11cm - Zwart","1","27.95","5.18","2017-02-10+01:00","NEW","false","FBR"

[ Voor 4% gewijzigd door breew op 12-02-2018 19:50 ]

Alle reacties


Acties:
  • Beste antwoord

  • breew
  • Registratie: April 2014
  • Laatst online: 07:43
Ik zou zeggen; verdiep je eens in R. Alle code kan in één regel, maar onderstaande is wat leesbaarder ;-)

Waarschijnlijk kan je in R ook alle verdere bewerkingen doen die je op de csv los zou willen laten. Je kunt een R-script verder ook vrij eenvoudig geautomatiseerd laten draaien (crontab), en/of geautomatiseerd data van internet af laten halen.

Gebaseerd op jouw voorbeeld-data:
S:
1
2
3
4
5
6
7
8
library(XML)
library(plyr)
#locatie van het bestand
file <- "orders.xml"
#inlezen en converteren naar data.frame
tmp <- ldply( xmlToList( file ), data.frame )
#data.frame wegschrijven als csv
write.csv( tmp, "orders.csv" )


levert de volgende output-csv

"",".id","OrderId","DateTimeCustomer","DateTimeDropShipper","CustomerDetails.ShipmentDetails.SalutationCode","CustomerDetails.ShipmentDetails.Firstname","CustomerDetails.ShipmentDetails.Surname","CustomerDetails.ShipmentDetails.Streetname","CustomerDetails.ShipmentDetails.Housenumber","CustomerDetails.ShipmentDetails.HousenumberExtended","CustomerDetails.ShipmentDetails.ZipCode","CustomerDetails.ShipmentDetails.City","CustomerDetails.ShipmentDetails.CountryCode","CustomerDetails.ShipmentDetails.Email","CustomerDetails.ShipmentDetails.Company","CustomerDetails.BillingDetails.SalutationCode","CustomerDetails.BillingDetails.Firstname","CustomerDetails.BillingDetails.Surname","CustomerDetails.BillingDetails.Streetname","CustomerDetails.BillingDetails.Housenumber","CustomerDetails.BillingDetails.HousenumberExtended","CustomerDetails.BillingDetails.ZipCode","CustomerDetails.BillingDetails.City","CustomerDetails.BillingDetails.CountryCode","CustomerDetails.BillingDetails.Email","CustomerDetails.BillingDetails.Company","OrderItems.OrderItem.OrderItemId","OrderItems.OrderItem.EAN","OrderItems.OrderItem.OfferReference","OrderItems.OrderItem.Title","OrderItems.OrderItem.Quantity","OrderItems.OrderItem.OfferPrice","OrderItems.OrderItem.TransactionFee","OrderItems.OrderItem.LatestDeliveryDate","OrderItems.OrderItem.OfferCondition","OrderItems.OrderItem.CancelRequest","OrderItems.OrderItem.FulfilmentMethod"
"1","Order","4123456789","2017-02-09T12:39:48.000+01:00","2017-02-09T12:39:48.000+01:00","02","Billie","Van der Bol.com","Dorpstraat","1","B","1111 ZZ","Utrecht","NL","2awq74td4z4mizmx6dcdbsdbdcna@verkopen.bol.com","bol.com","02","Billie","van der Bol.com","Dorpstraat","1","B","1111 ZZ","Utrecht","NL","2awq74td4z4mizmx6dcdbsdbdcna@verkopen.bol.com","bol.com","2012345678","5412810182312","BOLCOM00123","Basicxl - Rijdende Wekker - Kunststof - 16x11cm - Zwart","1","27.95","5.18","2017-02-10+01:00","NEW","false","FBR"

[ Voor 4% gewijzigd door breew op 12-02-2018 19:50 ]


  • Yagermeister
  • Registratie: December 2001
  • Laatst online: 08:17

Yagermeister

Bedrijfsprutser on call

Topicstarter
breew schreef op maandag 12 februari 2018 @ 18:22:
Ik zou zeggen; verdiep je eens in R. Alle code kan in één regel, maar onderstaande is wat leesbaarder ;-)

Waarschijnlijk kan je in R ook alle verdere bewerkingen doen die je op de csv los zou willen laten. Je kunt een R-script verder ook vrij eenvoudig geautomatiseerd laten draaien (crontab), en/of geautomatiseerd data van internet af laten halen.

Gebaseerd op jouw voorbeeld-data:
S:
1
2
3
4
5
6
7
8
library(XML)
library(plyr)
#locatie van het bestand
file <- "orders.xml"
#inlezen en converteren naar data.frame
tmp <- ldply( xmlToList( file ), data.frame )
#data.frame wegschrijven als csv
write.csv( tmp, "orders.csv" )


levert de volgende output-csv

"",".id","OrderId","DateTimeCustomer","DateTimeDropShipper","CustomerDetails.ShipmentDetails.SalutationCode","CustomerDetails.ShipmentDetails.Firstname","CustomerDetails.ShipmentDetails.Surname","CustomerDetails.ShipmentDetails.Streetname","CustomerDetails.ShipmentDetails.Housenumber","CustomerDetails.ShipmentDetails.HousenumberExtended","CustomerDetails.ShipmentDetails.ZipCode","CustomerDetails.ShipmentDetails.City","CustomerDetails.ShipmentDetails.CountryCode","CustomerDetails.ShipmentDetails.Email","CustomerDetails.ShipmentDetails.Company","CustomerDetails.BillingDetails.SalutationCode","CustomerDetails.BillingDetails.Firstname","CustomerDetails.BillingDetails.Surname","CustomerDetails.BillingDetails.Streetname","CustomerDetails.BillingDetails.Housenumber","CustomerDetails.BillingDetails.HousenumberExtended","CustomerDetails.BillingDetails.ZipCode","CustomerDetails.BillingDetails.City","CustomerDetails.BillingDetails.CountryCode","CustomerDetails.BillingDetails.Email","CustomerDetails.BillingDetails.Company","OrderItems.OrderItem.OrderItemId","OrderItems.OrderItem.EAN","OrderItems.OrderItem.OfferReference","OrderItems.OrderItem.Title","OrderItems.OrderItem.Quantity","OrderItems.OrderItem.OfferPrice","OrderItems.OrderItem.TransactionFee","OrderItems.OrderItem.LatestDeliveryDate","OrderItems.OrderItem.OfferCondition","OrderItems.OrderItem.CancelRequest","OrderItems.OrderItem.FulfilmentMethod"
"1","Order","4123456789","2017-02-09T12:39:48.000+01:00","2017-02-09T12:39:48.000+01:00","02","Billie","Van der Bol.com","Dorpstraat","1","B","1111 ZZ","Utrecht","NL","2awq74td4z4mizmx6dcdbsdbdcna@verkopen.bol.com","bol.com","02","Billie","van der Bol.com","Dorpstraat","1","B","1111 ZZ","Utrecht","NL","2awq74td4z4mizmx6dcdbsdbdcna@verkopen.bol.com","bol.com","2012345678","5412810182312","BOLCOM00123","Basicxl - Rijdende Wekker - Kunststof - 16x11cm - Zwart","1","27.95","5.18","2017-02-10+01:00","NEW","false","FBR"
Ik heb even hiermee gestoeid en ik krijg inderdaad een mooie csv. Alle extra data kan ik toch gewoon negeren dus dat maakt verder niets uit.

Wel apart dat ik dat ik hier geen hits op kreeg tijdens mijn zoektocht. ik heb specifiek nog gezocht op convert xml to csv.

-Te huur


  • breew
  • Registratie: April 2014
  • Laatst online: 07:43
Yagermeister schreef op maandag 12 februari 2018 @ 20:03:
[...]
Wel apart dat ik dat ik hier geen hits op kreeg tijdens mijn zoektocht. ik heb specifiek nog gezocht op convert xml to csv.
Er zijn vast tientallen manieren.. Maar R is mijn huidige weapon-of-choice bij zo ongeveer alle data-analyses en -conversies :)

Mocht je met R aan de slag gaan, dan kan je nog overwegen om de voorselectie van relevante data ook alvast in R te doen, en pas daarna de csv aan te maken. Je kunt vrij eenvoudig een paar kolommen uit de tabel droppen, of nieuwe toevoegen.

  • Yagermeister
  • Registratie: December 2001
  • Laatst online: 08:17

Yagermeister

Bedrijfsprutser on call

Topicstarter
breew schreef op maandag 12 februari 2018 @ 20:17:
[...]

Er zijn vast tientallen manieren.. Maar R is mijn huidige weapon-of-choice bij zo ongeveer alle data-analyses en -conversies :)

Mocht je met R aan de slag gaan, dan kan je nog overwegen om de voorselectie van relevante data ook alvast in R te doen, en pas daarna de csv aan te maken. Je kunt vrij eenvoudig een paar kolommen uit de tabel droppen, of nieuwe toevoegen.
Dat klinkt zeer interessant maar ik twijfel even om hier nog meer tijd aan te besteden. In principe heb ik de meeste toch al nodig op de datums na. De hoeveelheid data is ook geen belemmering om dit te gaan doen dus het is vooral een tijdsfactor die ik op dit moment toch al bijna niet heb.

Ik zal in de toekomst zeker hier nogmaals heen kijken. Net merkte ik al op dat er diverse tutorials op lynda.com staan dus daar ga ik eens tussen snuffelen.

-Te huur