Я хочу преобразовать XML в CSV. Это нормально, но в некоторых случаях у меня есть дополнительные поля или меньше полей, чем другие.
Пример моего фида:
EDIT: вершина XML:
<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0"> <channel> <item>
Элемент с меньшим количеством полей:
<item> <title> <![CDATA[ Resident Evil Revelations 2: Raid Mode: Throwback Map Pack ]]> </title> <link> https://www.nuuvem.com/item/resident-evil-revelations-2-raid-mode-throwback-map-pack </link> <description> <![CDATA[ Novas missões do modo raide! 4 mapas nostálgicos de locais icônicos, como o Queen Zenobia, do Resident Evil Revelations. 3 níveis de dificuldade oferecem um total de 12 novas missões. ]]> </description> <g:availability>out of stock</g:availability> <g:price currency="BRL">9.99</g:price> <g:image_link> http://img.ruphp.com/php/j6qaxbrhowfkijd5zdg8.jpg </g:image_link> <g:product_type> <![CDATA[ Action ]]> </g:product_type> <g:google_product_category>Software > Video Game Software > Computer Games</g:google_product_category> <g:condition>new</g:condition> <g:identifier_exists>FALSE</g:identifier_exists> <g:id>11985</g:id> </item>
Элемент с наиболее распространенными полями:
<item> <title> <![CDATA[ Tom Clancys Rainbow Six - SIEGE: Gemstone Bundle ]]> </title> <link> https://www.nuuvem.com/bundle/tom-clancy-s-rainbow-six-siege-gemstone-bundle </link> <description> <![CDATA[ ]]> </description> <g:availability>in stock</g:availability> <g:price currency="BRL">38.99</g:price> <g:image_link> http://img.ruphp.com/php/l8ypqwhq48jzbxogypeh.jpg </g:image_link> <g:product_type> <![CDATA[ Bundle ]]> </g:product_type> <g:google_product_category>Software > Video Game Software > Computer Games</g:google_product_category> <g:condition>new</g:condition> <g:identifier_exists>FALSE</g:identifier_exists> <g:id>12705</g:id> </item>
Элемент с большим количеством полей:
<item> <title> <![CDATA[ Far Cry 4 - Gold Edition ]]> </title> <link>https://www.nuuvem.com/item/far-cry-4-gold-edition</link> <description> <![CDATA[ You are a gun for hire, trapped in a war-torn African state, stricken with malaria and forced to make deals with corrupt warlords on both sides of the conflict in order to make this country your home. You must identify and exploit your enemies' weaknesses, neutralizing their superior numbers and firepower. ]]> </description> <g:availability>in stock</g:availability> <g:price currency="BRL">129.99</g:price> <g:sale_price currency="BRL">64.99</g:sale_price> <g:sale_price_effective_date> 2017-01-26T02:00:00+00:00/2017-01-31T01:59:00+00:00 </g:sale_price_effective_date> <g:image_link> http://img.ruphp.com/php/ld6c69odlluoerzmwyga.jpg </g:image_link> <g:product_type> <![CDATA[ Action ]]> </g:product_type> <g:google_product_category>Software > Video Game Software > Computer Games</g:google_product_category> <g:condition>new</g:condition> <g:identifier_exists>FALSE</g:identifier_exists> <g:id>2246</g:id> </item>
Я использую скрипт для преобразования, он работает, но он ошибается, когда элемент имеет больше или меньше полей, чем наиболее распространенный тип элемента.
$filexml='file.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', 'availability', 'price', 'image_link', 'product_type', 'google_product_category', 'condition', 'identifier_exists', 'id'); $fs = fopen('nuuvem-merchant.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('nuuvem-merchant.csv', 'a'); fputcsv($fs, $values); fclose($fs); $values = []; // Clean out array for next <item> (ie, row) $i++; // Move to next <item> (ie, node position) } }
С помощью этого скрипта я получаю всегда последовательный порядок полей каждого элемента. Из-за этого данные не совпадают с заголовком столбца много раз, а некоторые элементы с большим количеством полей не имеют заголовка из-за него.
К сожалению, я не разработчик PHP, и мне сложно решить эту проблему. Я пытался искать здесь, но не нашел проблемы, как моя.
благодаря