Solved

PHP Script to read XML & Write CSV file

Posted on 2014-09-03
10
749 Views
Last Modified: 2014-10-22
Does anyone have a PHP script that will read an XML file on a server located elsewhere, and write out the file in CSV format ?
Or know where I can find one (Bootcamp, HotScripts.com, etc) ?
0
Comment
Question by:bleggee
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 4
10 Comments
 
LVL 1

Expert Comment

by:rwniceing
ID: 40302573
You can use php curl  describes at php.net site at  http://php.net/manual/en/book.curl.php  to get xml file at remote server and  follow instructions for using fputcsv() and  simplexml_load_file() convert xml to csv file which
describes at this link http://twiwoo.com/php/php-xml-to-csv/
0
 
LVL 110

Expert Comment

by:Ray Paseur
ID: 40303424
Please post a link to the XML file in question.  

XML : CSV may or may not be a 1 : 1 correspondent relationship, so we would need to see the XML document and know exactly what part(s) of it you want rendered into the CSV strings.  Once we know that part, it's only a few lines of code and we can probably give you a tested and working example.
0
 
LVL 1

Author Comment

by:bleggee
ID: 40311122
Hi Ray - Here's a small 4-item copy of the actual XML file (attached).
A tested & working PHP example would be awesome !!
The vendor gives me FTP Access, then there's this XML file in a folder on the vendor's remote server.
products-ee.xml
0
Guide to Performance: Optimization & Monitoring

Nowadays, monitoring is a mixture of tools, systems, and codes—making it a very complex process. And with this complexity, comes variables for failure. Get DZone’s new Guide to Performance to learn how to proactively find these variables and solve them before a disruption occurs.

 
LVL 110

Expert Comment

by:Ray Paseur
ID: 40311570
This seems to test out OK.
http://iconoun.com/demo/temp_bleggee.php

<?php // demp/temp_blegee.php
error_reporting(E_ALL);

// SEE: http://www.experts-exchange.com/Programming/Languages/Scripting/PHP/Q_28511220.html
// REF: http://www.php.net/manual/en/function.simplexml-load-string.php
// REF: http://www.php.net/manual/en/function.fputcsv.php

// WHERE IS THE TEST DATA?
$url = 'http://filedb.experts-exchange.com/incoming/2014/09_w37/871127/products-ee.xml';
$xml = file_get_contents($url);
$obj = SimpleXML_Load_String($xml);

// WHERE IS THE OUTPUT FILE PATH?
$csv = 'storage/bleggee.csv';
$fpw = fopen($csv, 'w');
if (!$fpw) trigger_error("UNABLE TO OPEN $csv", E_USER_ERROR);

// GET AN ARRAY WITH THE NAMES OF THE PROPERTIES OF THE OBJECT
$arr = array_flip( (array)$obj->{'EXPORT-RECORDS'}->PRODUCT[0] );
fputcsv($fpw, $arr);

// USE AN ITERATOR TO ACCESS THE DATA IN THE PROPERTIES OF THE OBJECT
foreach ($obj->{'EXPORT-RECORDS'}->PRODUCT as $dat)
{
    // CONVERT OBJECT TO ARRAY FOR FPUTCSV()
    $dat = (array)$dat;
    fputcsv($fpw, $dat);
}

// ALL DONE
fclose($fpw);

// SHOW A LINK TO THE FILE
echo PHP_EOL
. 'See: '
. '<a target="_blank" href="'
. $csv
. '">'
. $csv
. '</a>'
;

Open in new window

0
 
LVL 1

Author Comment

by:bleggee
ID: 40313598
Great Ray ! I ran your script on my server as well, worked flawlessly! A few questions:
#1 The "real" XML file exists on a Server where I have ftp server name, login, & password (Not http access). I presume that I have to change line 9 to something else?
#2 What is used these days for debugging PHP scripts, other than adding lines to put out messages like "You've arrived at Line 9" and displaying variable contents ?  Like running the script step-by-step with an immediate window?  I use Coda2 to do my PHP code hacking but no idea what debugging tools are decent these days.
0
 
LVL 110

Expert Comment

by:Ray Paseur
ID: 40314657
Well, those are very different questions but I'll try to help.  You may want to post follow-up questions here at E-E.

1. PHP has FTP support.
http://www.php.net/manual/en/book.ftp.php

2. Komodo and Eclipse are two popular Integrated Development Environments ("IDE").  PHPUnit is one of the popular tools used for testing.
http://komodoide.com/
http://www.eclipse.org/pdt/
https://phpunit.de/

Understanding the problem well enough to write your own test cases may be all you need (sometimes).  Example here:
http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/PHP/A_7830-A-Quick-Tour-of-Test-Driven-Development.html
0
 
LVL 1

Author Comment

by:bleggee
ID: 40316140
Thx Ray, you're absolutely right, I'll post the debug questions separately.
As for the FTP input, I am taking your info & trying to code it up myself.  Best way to learn of course :)
I'll post back here if I get stuck.
- Brian
0
 
LVL 110

Accepted Solution

by:
Ray Paseur earned 500 total points
ID: 40322978
This seems to work mostly OK.  Put in your server name and credentials (lines 8-12) and give it a try.  I say mostly because I'm getting a blank line at the end of the CSV file.  Not sure why that happens.
<?php // demo/temp_bleggee.php
error_reporting(E_ALL);

// For FTP access see http://php.net/manual/en/book.ftp.php
// SEE: http://www.experts-exchange.com/Programming/Languages/Scripting/PHP/Q_28511220.html
// REF: http://www.php.net/manual/en/function.simplexml-load-string.php

// WHERE IS THE FTP DATA?
$ftp_server    = "???.net";
$ftp_user_name = "???";
$ftp_user_pass = "???";
$ftp_file_name = '???.xml';

// WHERE IS THE OUTPUT FILE PATH?
$xml = 'storage/bleggee.xml';

// WHERE DOES THE CSV GO?
$csv = 'storage/bleggee.csv';

// REF: http://www.php.net/manual/en/function.ftp-connect.php
$ftp_stream = ftp_connect($ftp_server);
if (!$ftp_stream) trigger_error("UNABLE TO CONNECT TO $ftp_server", E_USER_ERROR);

// REF: http://www.php.net/manual/en/function.ftp-login.php
$login_result = ftp_login($ftp_stream, $ftp_user_name, $ftp_user_pass);
if (!$login_result) trigger_error("UNABLE TO LOGIN TO $ftp_server USING $ftp_user_name + $ftp_user_pass", E_USER_ERROR);

// REF: http://www.php.net/manual/en/function.ftp-get.php
ftp_pasv($ftp_stream, TRUE);

// COPY THE FILE
$xfer_result = ftp_get($ftp_stream, $xml, $ftp_file_name, FTP_BINARY);
if (!$xfer_result) trigger_error("UNABLE TO GET $ftp_file_name", E_USER_ERROR);
ftp_close($ftp_stream);

// OPEN THE CSV FILE
$fpw = fopen($csv, 'w');
if (!$fpw) trigger_error("UNABLE TO OPEN $csv FOR WRITE", E_USER_ERROR);

// GET AN OBJECT FROM THE XML
$obj = SimpleXML_Load_File($xml);

// GET AN ARRAY WITH THE NAMES OF THE PROPERTIES OF THE OBJECT
$arr = array_flip( (array)$obj->{'EXPORT-RECORDS'}->PRODUCT[0] );
fputcsv($fpw, $arr);

// USE AN ITERATOR TO ACCESS THE DATA IN THE PROPERTIES OF THE OBJECT
foreach ($obj->{'EXPORT-RECORDS'}->PRODUCT as $dat)
{
    // CONVERT OBJECT TO ARRAY FOR FPUTCSV()
    $dat = (array)$dat;
    fputcsv($fpw, $dat);
}

// ALL DONE
fclose($fpw);

// SHOW A LINK TO THE FILE
echo PHP_EOL
. 'See: '
. '<a target="_blank" href="'
. $csv
. '">'
. $csv
. '</a>'
;

Open in new window

0
 
LVL 1

Author Closing Comment

by:bleggee
ID: 40397904
Absolutely awesome as usual for Ray !
Thank you
0
 
LVL 110

Expert Comment

by:Ray Paseur
ID: 40398023
Thanks for the points and thanks for using E-E, ~Ray
0

Featured Post

Revamp Your Training Process

Drastically shorten your training time with WalkMe's advanced online training solution that Guides your trainees to action.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I was working on a PowerPoint add-in the other day and a client asked me "can you implement a feature which processes a chart when it's pasted into a slide from another deck?". It got me wondering how to hook into built-in ribbon events in Office.
This article discusses how to create an extensible mechanism for linked drop downs.
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
The viewer will learn how to create a basic form using some HTML5 and PHP for later processing. Set up your basic HTML file. Open your form tag and set the method and action attributes.: (CODE) Set up your first few inputs one for the name and …

752 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question