2015-09-23 145 views
0

我需要將XML文件轉換爲CSV。使用PHP將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

如果你能幫助我,這將是非常讚賞:)

感謝

+0

你有什麼錯誤嗎?執行sctipt後,141.csv文件是否爲空?我不確定你的問題是什麼,好像你已經做對了,除非你有錯誤。 – andre3wap

+0

幫你做什麼? –

+0

*我有一個腳本,但我不確定如何使用它以滿足我的需求。*請不要誤會我的意思,但是不是最好的時間用google搜索你不瞭解的部分腳本和**然後**,面對錯誤和意外的行爲,你把它帶到了SO?因爲如果你甚至不能理解'你的'腳本是如何工作的,如果我們給你任何你可能遇到的問題的答案,那就毫無意義。 –

回答

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) 
    } 
} 
+0

你有我的尊重,這正是我想要的輸出文件。非常感謝你:)現在我有一個小問題,但是當它創建文件時,它會引發500內部錯誤,並且輸出文件的大小每次都不相同。我已經將內存限制增加到512,但這沒有幫助? –

+0

請檢查您的PHP錯誤日誌文件的具體內容,因爲500是一個通用的服務器錯誤消息。至於每次更改文件大小,看看XML文件是否也會定期更改。 – Parfait

+0

該網站是共享主機,但我已經嘗試過我們的服務器之一,並有同樣的問題,它給了錯誤:mod_fcgid:讀數據超時45秒 –

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); 
      } 
     } 
} 
+0

嘿,嘗試了代碼,但沒有發生任何事情。我對所有文件和文件夾擁有read.write權限,並且關於XML文件,我只是沒有包含文件的底部部分,但結束標籤在那裏。 –

+0

你正在得到什麼錯誤..?如果你沒有csv文件,那麼代碼將會創建一個輸出。爲了得到實際的錯誤,請嘗試在文件的開頭添加這個ini_set('display_errors',1); – Ranjana

+0

由於一些奇怪的原因,它不能通過SSH工作,但是當我在瀏覽器上嘗試它時,它創建了它,所以非常感謝。唯一的問題是內容在一個單元而不是單獨的單元中。你知道我該如何解決這個問題嗎? –