Avatar billede dennisml Nybegynder
04. februar 2011 - 14:36 Der er 17 kommentarer og
1 løsning

XML til CSV

Hej. jeg søger et script hvor man kan uploade en XML fil.
og så kommer der en CSV fil i output.

gør ikke noget hvis det er noget man skal købe.

bare man kan rette i det.


for output SKAL se sådan her ud:
Supplier;124;12346;søren jensen;dk;jernbanegade Shopid;SalesId;Your cust account;Customer Name;Language;Streetline_1;Streetline_2;City;Zipcode;Country;Cust E-mail;Your cust account 2;Customer Name 2;Streetline2_1;Streetline2_2;City 2;Zipcode 2;Country 2;ItemId;ItemName;SalesQty;SalesPrice;Currency

Håber nogen kan hjælpe. haster lidt.

Dennis
Avatar billede jakobdo Ekspert
04. februar 2011 - 14:55 #1
Prøv at vis dit xml først.
Så tror jeg "nemt" det kan laves.
Avatar billede olsensweb.dk Ekspert
04. februar 2011 - 15:10 #2
uden at kende din xml fil, er her et grundlæggende eks
http://codestips.com/php-xml-to-csv/

btw: kig lige på http://www.eksperten.dk/list/aabnespoergsmaal/dennisml
Avatar billede dennisml Nybegynder
04. februar 2011 - 16:07 #3
<?xml version="1.0" encoding="iso-8859-1"?>
<ORDER_EXPORT type="ORDERS">
  <ELEMENTS>
    <ORDER>
      <GENERAL>
        <ORDER_ID>10028</ORDER_ID>
      </GENERAL>
      <CUSTOMER>
        <CUST_NUM>3</CUST_NUM>
        <CUST_NAME>Dennis larsen</CUST_NAME>
        <CUST_ADDRESS>Gillesager 123,3,4</CUST_ADDRESS>
        <CUST_ZIP_CODE>2605</CUST_ZIP_CODE>
        <CUST_CITY>Glostrup</CUST_CITY>
        <CUST_COUNTRY>Danmark</CUST_COUNTRY>
        <CUST_COUNTRY_ISO>DK</CUST_COUNTRY_ISO>
        <CUST_EMAIL>test@hotmail.com</CUST_EMAIL>
      </CUSTOMER>
      <ORDERLINES>
        <ORDERLINE>
          <PROD_NUM>0008</PROD_NUM>
          <PROD_NAME>Beskyttelsestaske til 7"</PROD_NAME>
          <AMOUNT>1</AMOUNT>
          <LINE_TOTAL_PRICE>52,00</LINE_TOTAL_PRICE>
        </ORDERLINE>
        <ORDERLINE>
          <PROD_NUM>0005</PROD_NUM>
          <PROD_NAME>32 GB micro SD hukommelses kort</PROD_NAME>
          <AMOUNT>1</AMOUNT>
          <LINE_TOTAL_PRICE>364,00</LINE_TOTAL_PRICE>
        </ORDERLINE>
      </ORDERLINES>
    </ORDER>
  </ELEMENTS>
</ORDER_EXPORT>


bare vigtigt den kommer i rigtig output format, og rækkefølge.
Avatar billede jakobdo Ekspert
04. februar 2011 - 18:29 #4
jeg er måske lidt dum, men jeg synes ikke jeg kan se sammenhæng i din XML og din csv. kunne du vise hvordan ovenstående XML ville se ud som csv?
Avatar billede tjens Nybegynder
04. februar 2011 - 21:00 #5
Du kan skrive en XSLT fil som omformatterer XML.

Klik på knappen øverst i denne demo: http://tjens.dk/eksperten/927135/
Avatar billede dennisml Nybegynder
07. februar 2011 - 11:45 #6
min CSV fil vil se sådan her ud:
FIRMANAVN;10028;3;Dennis larsen;DK;Gillesager 123,3,4;;Brøndby;2605;Danmark;test@hotmail.com;;;;;;;;0008;Beskyttelsestaske til 7;1;52,00;DK;

og sådan en linje pr ordre så ud fra den XML jeg har sat ind her. ville der være to linjer.

Tjens. kan man lave den du har sendt lidt om, så den laver det til en linje med ; opdeling?
Avatar billede tjens Nybegynder
07. februar 2011 - 16:35 #7
#6 Jeg tror ikke jeg forstår spørgsmålet?
Demoen i #5 laver en linie pr. <pris> i XMLen, og med ; tegn mellem felterne.

Du ønsker en linie pr. <ORDERLINE>, går jeg ud fra?
så demoen ligner din problemstilling en del, synes jeg.

Dog er værdierne i demoen, lidt usædvanligt, hentet fra attributter, men det er jo bare at studere lidt XSL.
Her er en tutorial: http://www.w3schools.com/xsl/
Avatar billede tjens Nybegynder
07. februar 2011 - 17:05 #8
Lille demo med nogle få felter fra din XML: http://tjens.dk/eksperten/930762/
Avatar billede dennisml Nybegynder
07. februar 2011 - 17:54 #9
tjens: ja præcis sån der :D

nu mangler jeg bare lidt mere på den linje.

din linje
10028;Dennis larsen;0005;32 GB micro SD hukommelses kort

Min skulle gerne se sådan her ud.
FIRMANAVN;10028;3;Dennis larsen;DK;Gillesager 123,3,4;;Brøndby;2605;Danmark;test@hotmail.com;;;;;;;;0008;Beskyttelsestaske til 7;1;52,00;DK;

kan du få fyldt de dataer ind??

Firmanavn skal jeg bare lige vide hvor jeg ændre, da der selvfølgelig skal være mit eget firmananvn.
Avatar billede tjens Nybegynder
07. februar 2011 - 19:27 #10
#9 Du højreklikker på min demo og klikker "Vis Kildetekst", og så gemmer du siden på din egen PC som en .html-fil

Så redigerer du den, og kopierer eksisterende linier i XSLT delen, og retter navne til, indtil du har det output du ønsker.

---

Husk at denne kategori er hjælp til at finde ud af hvordan et problem skal løses.

Hvis andre skal programmere hele din opgave, hører det nok mere ind under http://www.eksperten.dk/spm/Job-opgaver/
Avatar billede dennisml Nybegynder
07. februar 2011 - 19:29 #11
Okay.

Takker mange gange. jeg går i gang med det. har fundet ud af det via din side :D

Smid et svar.
Avatar billede tjens Nybegynder
07. februar 2011 - 20:33 #12
Min demo er mest beregnet til at eksperimentere med  XSLT-delen.

Hvis du har mange XML-filer, kan det være smart at indbygge demoens funktion i et nyt script, der f.eks. kan gennemløbe en folder, og udføre transformeringen på alle filer.
Avatar billede dennisml Nybegynder
08. februar 2011 - 10:04 #13
Okay, lyder godt.

Ser ud til jeg har den på plads nu. og det hele virker fint. Siger mange tak for hjælpen. :D
Avatar billede dennisml Nybegynder
08. februar 2011 - 11:48 #14
En sidste ting.

Hvis nu at der er en alternativ levering adresse på.

DELIV_NAME som er tom.
Og CUST_NAME indholder data.

Kan man så få den til at smide CUST_NAME ind i csv filen der for DELIV_NAME skulle have været??

Men KUN hvis DELIV_NAME er tomt??
og evt. hvordan?? mit ser sådan herud nu :

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text"/>

<xsl:template match="/ORDER_EXPORT">
  <xsl:for-each select="ELEMENTS/ORDER">
    <xsl:variable name="firma" select="GENERAL/FIRMA"/>
    <xsl:variable name="order_id" select="GENERAL/ORDER_ID"/>
    <xsl:variable name="cust_num" select="CUSTOMER/CUST_NUM"/>
    <xsl:variable name="deliv_name" select="DELIVERY_INFO/DELIV_NAME"/>
    <xsl:variable name="deliv_country_iso" select="DELIVERY_INFO/DELIV_COUNTRY_ISO"/>

    <xsl:variable name="deliv_address" select="DELIVERY_INFO/DELIV_ADDRESS"/>
    <xsl:variable name="deliv_city" select="DELIVERY_INFO/DELIV_CITY"/>

    <xsl:variable name="deliv_zip_code" select="DELIVERY_INFO/DELIV_ZIP_CODE"/>

    <xsl:variable name="deliv_country" select="DELIVERY_INFO/DELIV_COUNTRY"/>

    <xsl:variable name="cust_email" select="CUSTOMER/CUST_EMAIL"/>


    <xsl:for-each select="ORDERLINES/ORDERLINE">
      <xsl:value-of select="$firma" />  <xsl:text>FIRMANAVN;</xsl:text>
      <xsl:value-of select="$order_id" />  <xsl:text>;</xsl:text>
      <xsl:value-of select="$cust_num" />  <xsl:text>;</xsl:text>
      <xsl:value-of select="$deliv_name" />  <xsl:text>;</xsl:text>
      <xsl:value-of select="$deliv_country_iso" />  <xsl:text>;</xsl:text>
      <xsl:value-of select="$deliv_address" />  <xsl:text>;;</xsl:text>
      <xsl:value-of select="$deliv_city" />  <xsl:text>;</xsl:text>
      <xsl:value-of select="$deliv_zip_code" />  <xsl:text>;</xsl:text>
      <xsl:value-of select="$deliv_country" />  <xsl:text>;</xsl:text>
      <xsl:value-of select="$cust_email" />  <xsl:text>;;;;;;;;</xsl:text>
      <xsl:value-of select="PROD_NUM" />    <xsl:text>;</xsl:text>
      <xsl:value-of select="PROD_NAME" />    <xsl:text>;</xsl:text>
      <xsl:value-of select="AMOUNT" />      <xsl:text>;</xsl:text>
      <xsl:value-of select="LINE_TOTAL_PRICE" />  <xsl:text>;</xsl:text>
      <xsl:value-of select="$deliv_country_iso" />  <xsl:text>;</xsl:text>
      <xsl:text><![CDATA[
]]></xsl:text>

    </xsl:for-each>
  </xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Avatar billede tjens Nybegynder
08. februar 2011 - 13:33 #15
Du kan trække både kunde-navn og leveringsadresse-navn ud i variable, og derefter sætte en ny variabel, som sættes til kundenavn hvis leveringsnavn mangler, og ellers til leveringsnavn:

...
    <xsl:variable name="cust_name" select="CUSTOMER/CUST_NAME"/>
    <xsl:variable name="deliv_name" select="DELIVERY_INFO/DELIV_NAME"/>

    <xsl:variable name="out_name">
      <xsl:choose>
        <xsl:when test="string-length($deliv_name) = 0">
            <xsl:value-of select="$cust_name" /> 
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$deliv_name" />
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>

    <xsl:for-each select="ORDERLINES/ORDERLINE">
      <xsl:value-of select="$order_id" />  <xsl:text>;</xsl:text>
      <xsl:value-of select="$out_name" />  <xsl:text>;</xsl:text>
...
Bemærk at der står $out_name nederst, så $cust_name og $deliv_name skal ikke bruges efter den nye variable/choose/when sektion.
Avatar billede dennisml Nybegynder
08. februar 2011 - 13:59 #16
Tka for det. nu er jeg sku ikke god til det her.

Så kunne måske prøve sætte det op som det skal være.

kan ikke lige få det til at virke.. :S

Takke mange gang
Avatar billede tjens Nybegynder
08. februar 2011 - 20:09 #17
Avatar billede dennisml Nybegynder
08. februar 2011 - 21:41 #18
Takker. Du er en helt ;)

skriver til dig hvis jeg skal have noget lavet en anden gang. takker endnu en gang.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester