通过PHP将产品从XML导入CSV

通过PHP将产品从XML导入CSV,php,xml,Php,Xml,我需要将XML文件中的第一行放在CSV文档中。我每次都会得到包含数据的文件,但我没有第一行。如果你有任何错误的想法,请发到这里。非常感谢大家 PHP文件 <?php // How to Generate CSV File from Array in PHP Script $url = 'https://samplewebsitegoesherewithdata.xml'; $xml = file_get

我需要将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);   
          }  

您的代码有很多问题-您的
$productr
数组被创建为一个多维数组,它是无意义的,并且输出在循环中-尽管
只有一个子元素,因此无论如何只能执行一次

要根据
值提取
元素之一,此代码还使用XPath首先在
中查找元素并返回
。这是通过
'//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);

有几个问题-但是如果你修复了你的缩进,你会看到一个明显的问题。您正在为从xml中读取的每个产品执行底部的代码。请不要使用大写字母吗?一旦您解决了这个问题$productr[]=['name'=>$product->CODE,'man'=>$product->MANUFACTURER]在您的xml读取循环中会更有意义,因为这样您就拥有了一系列产品,而不仅仅是一个不断被覆盖的产品。非常感谢您,它工作得非常好。你救了我的命。我还有另一个问题。它可以使csv文件之间的分隔;不,如果你看的话,你可以指定分隔符。当然可以,你能帮我做另一件事吗?在XML中,ATRIBUTE中有许多ATRIBUTE,我需要搜索其中一个,例如“Životnost”,并将该ATRIBUTE的CSV值放入其中。XML中的每个项都有相同的ATRIBUTES名称,但顺序不同。所以这就是为什么我需要循环所有心房的元素,找到“Životnost”,然后得到他的值。我不确定它是否清楚我需要什么,但如果不清楚,我将尝试以另一种方式解释它。谢谢。我已经更新了它-行
$attr=$product->xpath('//ATT..
)。
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);