Skip to content
Advertisement

How to add values from an XML file to a csv file in php?

I have a link to an online XML file that contains different values. I have written a code that allows me to retrieve the contents of two specific tags in this file and put them in a csv file.

The first tag is the :

<g:id>...</g:id>

And the second one is a url with :

<g:link>...</g:link>

My problem is that in the output csv file I do get the urls but they are put in columns and the id does not get put in my csv file :

enter image description here

How can I do please to have the output file like this?

enter image description here

<?php

  //Function for split string
  function multiSplit($string)
  {
      $output = array();
      $cols = explode("<g:image_link>", $string);

        foreach ($cols as $col)
        {
            $dashcols = explode("</g:image_link>", $col);
            $output[] = $dashcols[0];
        }
  
    return $output;
}


 //Function for split string
 function multiSplit2($string)
 {
     $output = array();
     $cols = explode("<g:id>", $string);

     foreach ($cols as $col)
        {
            $dashcols = explode("</g:id>", $col);
            $output[] = $dashcols[0];
        }
        
     return $output;
}


$html = file_get_contents('https://www.ripcurl.eu/assets/fb_product_feed_eur.xml');


$url = multiSplit($html);
$id = multiSplit2($html);

$idfinal = $id[1].'-RC';

print_r($idfinal); //BDGTP6-RC
echo '<br>';
print_r($url[1]); //https://dwk1ydkfsczz3.cloudfront.net/images/2020/06/15/BDGTP6-0070-1jpg-051717be-657e-4f08-9d75-914926540fd4.jpg


$name = "BI4_".date('Ymd_His').".csv";
$cheminfile = "C:/wamp64/www/retail_BI/".$name;

$fp = fopen("$cheminfile", "w");

$delimiter = ';';

    fputcsv($fp, array('stylecode', 'images'), $delimiter);
    
    foreach ( $url as $ur ) {
            
            fputcsv($fp, $url, $delimiter);
            
        }
        
fclose($fp);

?>

Advertisement

Answer

you could use SimpleXML to parse the XML and find data, instead of trying to search in XML string.

Note that fputcvs() takes an array as second argument.

$delimiter = ';';
$fp = fopen($cheminfile, "w");
$xml = simplexml_load_file('https://www.ripcurl.eu/assets/fb_product_feed_eur.xml');
fputcsv($fp, array('stylecode', 'images'), $delimiter);

// loop over items in "channel"
foreach ($xml->channel->item as $item) 
{
    // get values for `g:` namespace
    $children = $item->children("http://base.google.com/ns/1.0");
          
    // get id and link
    $id = (string) $children->id;
    $link = (string) $children->image_link;

    // add values to CSV
    fputcsv($fp, [$id, $link], $delimiter);
}
fclose($fp);

Will generate a CSV file like this :

stylecode;images
BDGTP6;https://dwk1ydkfsczz3.cloudfront.net/images/2020/06/15/BDGTP6-0070-1jpg-051717be-657e-4f08-9d75-914926540fd4.jpg
CFEBL9;https://dwk1ydkfsczz3.cloudfront.net/images/2020/08/03/CFEBL9-0090-1jpg-a9bd9dda-a775-4b4f-af00-3dcbf261bc2d.jpg
User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement