使用PHP将XML转换为CSV

时间:2015-09-23 14:44:17

标签: php xml csv

我需要将XML文件转换为CSV格式。

我有一个脚本,但我不确定如何根据我的需要使用它。

这是脚本

$filexml='141.xml';
if (file_exists($filexml)) {
$xml = simplexml_load_file($filexml);
$f = fopen('141.csv', 'w');
foreach ($xml->item as $item) {
fputcsv($f, get_object_vars($item),',','"');
}
fclose($f);
}

该文件名为141.xml,这里是我需要转换的XML中的一些代码。

<?xml version="1.0" encoding="UTF-8" ?>
<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0">



<channel>
<item>
<title><![CDATA[//title name]]></title>
<link><![CDATA[https://www.someurl.co.uk]]></link>
<description><![CDATA[<p><span>Demo Description</span></p>]]></description>
<g:id><![CDATA[4796]]></g:id>
<g:condition><![CDATA[new]]></g:condition>
<g:price><![CDATA[0.89 GBP]]></g:price>
<g:availability><![CDATA[in stock]]></g:availability>
<g:image_link><![CDATA[https://image-location.png]]></g:image_link>
<g:service><![CDATA[Free Shipping]]></g:service>
<g:price><![CDATA[0 GBP]]></g:price>
</item>

我使用以下命令从SSH运行脚本:

php /var/www/vhosts/mywebsite.co.uk/httpdocs/xml/convert.php

如果你能帮助我,我们将非常感激:)

由于

2 个答案:

答案 0 :(得分:0)

试试以下代码。并且XML文件存在语法错误,rss和channel的结束标记丢失。

$filexml='141.xml';
if (file_exists($filexml)) 
 {
       $xml = simplexml_load_file($filexml);
       $f = fopen('141.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);
           }
        }
 }

答案 1 :(得分:0)

考虑将XML数据传递到数组$values并逐行导出到csv。

具体来说,使用xpath()函数进行XML提取,遍历每个<item>并提取其所有子项的值(/*)。顺便说一下,我在CSV文件中添加标题。

$filexml='141.xml';
if (file_exists($filexml))  {

   $xml = simplexml_load_file($filexml);
   $i = 1;           // Position counter
   $values = [];     // PHP array

   // Writing column headers
   $columns = array('title', 'link', 'description', 'id', 'condition',
                    'price', 'availability', 'image_link', 'service', 'price');

   $fs = fopen('141.csv', 'w');
   fputcsv($fs, $columns);      
   fclose($fs);

   // Iterate through each <item> node
   $node = $xml->xpath('//item');

   foreach ($node as $n) {           

       // Iterate through each child of <item> node
       $child = $xml->xpath('//item['.$i.']/*');      

       foreach ($child as $value) {
          $values[] = $value;         
       }

       // Write to CSV files (appending to column headers)
       $fs = fopen('141.csv', 'a');
       fputcsv($fs, $values);      
       fclose($fs);  

       $values = [];    // Clean out array for next <item> (i.e., row)
       $i++;            // Move to next <item> (i.e., node position)
   }
}