在PHP中将大型XML文件转换为CSV

时间:2010-01-24 21:42:49

标签: php xml csv

我有一个50MB的XML文件。我想将其转换为CSV文件,但我发现大多数方法耗尽了服务器内存。是否有一种使用流方法(如XMLreader)执行此操作的好方法。

7 个答案:

答案 0 :(得分:4)

SAX风格的基于expat的解析器是最节省空间的选项:

http://php.net/xml_parse

只要打开或关闭元素标记,它就会执行$ start_element_handler和$ end_element_handler回调,而不是将整个文档保存在内存中。

但是,50 MB不是很多,也许你的提供商可以达到极限。

php_value memory_limit 100M

在.htaccess / httpd.conf中,或在php.ini中设置。

答案 1 :(得分:4)

您希望使用XmlReader来解析XML,因为它可以作为基于事件的解析器 - 例如。它不会将所有内容加载到内存中,而是在输入文件前进时读取。

答案 2 :(得分:2)

我前段时间写过这个算法。请随意给它一个镜头。

http://sites.google.com/site/soichih/q-a/xml-to-csv-converter

答案 3 :(得分:1)

晚会......

表示<domains><domain><name>myname.com</name></domain></domains>

的xml结构
$url = "http://mysite.com/my.xml";
  $returnData = file_get_contents($url);
  $xml = simplexml_load_file($url);

     $csv = 'my.csv';
     $path = '/var/www/html/';

  $domain = $xml->domains->domain;

      $fullpath = $path.$csv;
      $fp = fopen($fullpath, 'w');

    foreach ($xml->domains->domain as $domain) {

        fputcsv($fp, get_object_vars($domain),',','"');

    }

    fclose($fp);

       header('Content-Description: File Transfer');
           header('Content-Type: application/csv');
       header('Content-Disposition: attachment; filename='.basename($csv));
       header('Content-Transfer-Encoding: binary');
       header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
       header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
       header('Pragma: public');
       header('Content-Length: ' . filesize($fullpath));
       readfile($fullpath);

    exit;
    }
}

答案 4 :(得分:0)

您是否尝试过增加内存限制? ini_set('memory_limit', '256M')

(这是一个非常糟糕的解决方案)

答案 5 :(得分:0)

我对PHP API了解不多,但是这个类似乎可以帮助你:XML Parser

基本上你正在寻找一个基于事件的解析器,比如旧的SAX。此解析器类型将触发事件或类似的事件。它将节省内存,因为它不需要将整个文档加载到内存中。

答案 6 :(得分:0)

如果XML文件相当简单并且可以避免通过完整的XML解析器,而是可以通过PHP逐行读取并导出每一行,那将节省整个文件记忆一下子。什么是XML结构?