2010-01-24 9 views
3

Existe-t-il un moyen de convertir un fichier XML en un fichier CSV en utilisant PHP?Convertir XML en CSV en PHP

+2

pouvez-vous également poster votre échantillon xml? – YOU

+3

XML peut contenir des données hiérarchiques, alors que CSV ne contient que des données tabulaires. Cela dépend donc vraiment de votre XML. –

Répondre

13

Utilisez les moteurs de recherche pour localiser des exemples de code tels que http://codestips.com/php-xml-to-csv/

Pour créer un fichier csv à partir d'un xml en PHP 5.0, il est très simple, nous suffit d'écrire quelques lignes.

Nous allons utiliser l'extension SimpleXML qui vient de PHP 5.0.

SimpleXML lit un xml entier dans un objet que nous pouvons parcourir dans ses propriétés. Pour écrire dans le fichier de sortie csv, nous utiliserons fputcsv. Fputcsv formate une ligne en tant que csv et l'écrit dans le fichier

Supposons que nous avons ce xml nommé cars.xml:

<?xml version='1.0'?> 
<cars> 
<car> 
<color>blue</color> 
<price>2000</price> 
</car> 
<car> 
<color>red</color> 
<price>10000</price> 
</car> 
<car> 
<color>black</color> 
<price>5000</price> 
</car> 
</cars> 

D'abord nous devrions lire notre xml en utilisant simplexml_load_file passer le nom du fichier et retourne un objet avec toutes les propriétés et les valeurs du csv:

$xml = simplexml_load_file($filexml); 

Après avoir lu ce que nous devons parcourir tous les nœuds enfants de voitures et d'écrire dans le fichier de sortie en utilisant fputcsv spécifiant l'objet, le séparateur et enceinte. Nous devons tout d'abord convertir l'objet en un tableau pour écrire à la csv:

foreach ($xml->car as $car) 
fputcsv($f, get_object_vars($car),',','"'); 

Voici le code source complet qui convertit XML csv en php 5.0:

<?php 
$filexml='cars.xml'; 
if (file_exists($filexml)) { 
    $xml = simplexml_load_file($filexml); 
$f = fopen('cars.csv', 'w'); 
foreach ($xml->car as $car) { 
    fputcsv($f, get_object_vars($car),',','"'); 
} 
fclose($f); 
} 
?> 
+1

J'étais sur le point de voter ... jusqu'à ce que je vous vois utiliser 'short_open_tag':] * (Les balises courtes sont ebil!) * – Atli

+0

merci, j'ai modifié. – Pentium10

-2

Voici une très bon exemple de code. fonctionne bien avec ma demande.

<?php 
$headers = array(); 
foreach ($xml->ROW->children() as $field) { 
    $headers[] = $field->getName(); 
} 
$filename = ; 
$csv_filename = str_replace('xml', 'csv', $filename); 
$file = $this->getCsvDirectory() . '/' . $csv_filename; 
if (file_exists($file)) { 
    unlink($file); 
} 
$csv = fopen($file, 'w'); 
fputcsv($csv, $headers, ',', '"'); 
foreach ($xml as $entry) { 
    $data = get_object_vars($entry); 
    $sanitized_data = array(); 
    foreach ($data as $key => $datum) { 
     $sanitized_data[$key] = html_entity_decode($datum, ENT_COMPAT, 'UTF-8'); 
    } 
    fputcsv($csv, $sanitized_data, ',', '"'); 
} 
fclose($csv); 
?>