通过PHP将产品从XML导入到CSV

时间:2019-12-19 21:23:28

标签: php xml

我需要将第一行放在XML文件的CSV文档中。我每次都获得包含数据的文件,但没有第一行。如果您有任何疑问,请在此处发布。非常感谢。

PHP文件

    <?php       
          // How to Generate CSV File from Array in PHP Script   
          $url = 'https://samplewebsitegoesherewithdata.xml';
          $xml = file_get_contents($url);
          $xmls= simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOEMPTYTAG) or die("Error: Cannot create object");

          foreach($xmls->children() as $product) {
              $productr = array(
                    "produkt"  => array(
                      "name"  => $product->CODE,  
                      "man" => $product->MANUFACTURER
                    ),
              );   

              $filename = 'export.csv';       
              header("Content-type: text/csv");       
              header("Content-Disposition: attachment; filename=$filename");       
              $output = fopen("php://output", "w");       
              $header = array_keys($productr[0]);       
              fputcsv($output, $header);       
              foreach($productr as $row)       
              {  
                  fputcsv($output, $row);  
              }       
              fclose($output);   
          }  

XML文件

<PRODUCTS>
    <PRODUCT>
        <CODE>3006.01.32.9000</CODE>
        <EAN>40034742</EAN>
        <MANUFACTURER>SAMPLE</MANUFACTURER>
        <NAME>NAME OF PRODUCT</NAME>
        <URL>
            https://sampleweb.cz/
        </URL>
        <IMGURL>https://sampleweb.cz/tmp_o/11928/img0.jpg</IMGURL>
        <IMGURL_WATERMARK>https://sampleweb.cz/tmp/11928/img0.jpg
        </IMGURL_WATERMARK>
        <ACTUAL_PRICE>2847.15</ACTUAL_PRICE>
        <ACTUAL_PRICE_VAT>3445</ACTUAL_PRICE_VAT>
        <PRICE>2847.15</PRICE>
        <PRICE_VAT>3445</PRICE_VAT>
        <CATEGORY>Stojací lampy</CATEGORY>
        <ALL_CATEGORIES />
        <CATEGORY_DESCRIPTION />
        <AVAILABILITY>0</AVAILABILITY>
        <CONTENT>http://sampleweb.cz.cz/</CONTENT>
        <ATTRIBUTES>
            <ATTRIBUTE>
                <NAME>Stínítko</NAME>
                <VALUE>Ø130</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Životnost</NAME>
                <VALUE>20000h</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Index podání barev</NAME>
                <VALUE>Ra 80</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Vypínač</NAME>
                <VALUE>ne</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Záruční doba</NAME>
                <VALUE>5 let</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Hmotnost g</NAME>
                <VALUE>4,676kg</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Třída ochrany</NAME>
                <VALUE>II</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Termín dodání</NAME>
                <VALUE>1-2 týdny</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Kolekce</NAME>
                <VALUE>TWIN</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Patice</NAME>
                <VALUE>LED</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Ochrana IP</NAME>
                <VALUE>IP20</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Max. příkon světelného zdroje</NAME>
                <VALUE>4,6W</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Barva</NAME>
                <VALUE>matná mosaz</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Světelný tok</NAME>
                <VALUE>400lm</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Počet světelných zdrojů</NAME>
                <VALUE>1</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Výška v mm</NAME>
                <VALUE>1570</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Včetně světelného zdroje</NAME>
                <VALUE>ano</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Napájecí napětí</NAME>
                <VALUE>230V</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Energetická účinnost</NAME>
                <VALUE>A+</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Teplota barvy světla</NAME>
                <VALUE>3000K</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Výkon</NAME>
                <VALUE>4,6W</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Hloubka v mm</NAME>
                <VALUE>470</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Výrobce</NAME>
                <VALUE>WOFI</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
            <ATTRIBUTE>
                <NAME>Barva hlavní</NAME>
                <VALUE>matná mosaz</VALUE>
                <PRICE>0</PRICE>
                <PRICE_VAT>0</PRICE_VAT>
                <AVAILABILITY>0</AVAILABILITY>
            </ATTRIBUTE>
        </ATTRIBUTES>
        <ADDITIONAL_IMAGES>
            <IMAGE>
                <IMGURL>https://sampleweb.cz.cz/tmp_o/11928/img1.jpg</IMGURL>
                <IMGURL_WATERMARK>https://sampleweb.cz/tmp/11928/img1.jpg
                </IMGURL_WATERMARK>
            </IMAGE>
        </ADDITIONAL_IMAGES>
    </PRODUCT>
</PRODUCTS>

1 个答案:

答案 0 :(得分:0)

您的代码有很多问题-$productr数组被创建为无意义的多维数组,并且输出处于循环中-尽管<products>仅有1个子元素所以无论如何它只会做一次。

要基于<ATTRIBUTE>值提取<NAME>元素之一,此代码还使用XPath首先在<PRODUCT>中找到元素,然后返回<VALUE>。这是通过'//ATTRIBUTE[NAME="Životnost"]/VALUE'完成的,可以轻松地用所需的相应名称进行更改。在xpath()返回匹配节点的列表,使用[0]提取第一个元素。

此代码在开始时设置输出,仅在第一次写入标头...

header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=$filename");
$output = fopen("php://output", "w");
$headerOutput = true;
foreach($xmls->PRODUCT as $product) {
    $attr = $product->xpath('//ATTRIBUTE[NAME="Životnost"]/VALUE')[0];

    $productr = array("name"  => $product->CODE,
        "man" => $product->MANUFACTURER,
        "value" => $attr
     );

    if ( $headerOutput )    {
        $header = array_keys($productr);
        fputcsv($output, $header);
        $headerOutput = false;
    }
    fputcsv($output, $productr);
}  
fclose($output);
相关问题