使用php将复杂的xml feed转换为csv

时间:2013-03-21 17:52:51

标签: php xml

我有一个需要使用curl访问的xml数据源。我试图获取curl输出并使用XMLReader读取每个节点,但它没有工作。因为当我使用curl加载Feed时,它需要大约1-2分钟,因为它非常大。

所以我认为将源下载到我的服务器并将其转换为csv并将其上传到我的数据库。所以我可以用它与cron一起保持我的数据库更新。

我发现这段代码似乎在普通的xml Feed中运行良好,但它似乎不适用于我的Feed。

在此Feed中

<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>

当我使用下面的代码时,它可以工作。

$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);
}

但是当涉及到以下Feed时,如何更改上面的代码以将模型,图片,图像,类型....添加到csv?

 <cars>
<car>
 <color>blue</color>
 <price>2000</price>
 <model />
  <pictures>
    <image>1.jpg</image>
    <image>2.jpg</image>
  </pictures>
  <type>
   <bodykit>yes</bodykit>
   <turbo>no</turbo>
   <sound>surround</sound>
 </type>
</car>
<car>
 <color>red</color>
 <price>10000</price>
<model>GTX</model>
  <pictures>
    <image>5.jpg</image>
  </pictures>
  <type>
   <bodykit>yes</bodykit>
   <turbo>no</turbo>
   <sound>no</sound>
 </type>
 </car> 
 <car>
 <color>black</color>
 <price>5000</price>
 <model>GTX</model>
  <pictures>
    <image>5.jpg</image>
    <image>8.jpg</image>
  </pictures>
  <type>
   <bodykit>yes</bodykit>
   <turbo>no</turbo>
   <sound>surround</sound>
 </type>
</car>
</cars>

任何帮助或想法将不胜感激......

1 个答案:

答案 0 :(得分:0)

这是你可以尝试的东西

$filexml='cars.xml';

    if (file_exists($filexml)) 
           {
       $xml = simplexml_load_file($filexml);
       $f = fopen('cars.csv', 'w');
       createCsv($xml, $f);
       fclose($f);
    }

    function createCsv($xml,$f)
    {

        foreach ($xml->children() as $car) 
        {

           $hasChild = (count($car->children()) > 0)?true:false;

        if( ! $hasChild)
        {
           $put_arr = array($car->getName(),$car); 
           fputcsv($f, $put_arr ,',','"');

        }
        else
        {
         createCsv($car, $f);
        }
     }

    }