XML 到 PHP 中的 CSV

XML to CSV in PHP

我正在尝试使用下面的代码将 XML 转换为 CSV,但它仅在只有一行的情况下才有效。多个条目将仅显示 headers/column 个名称。

这是我的 XML 的样子:

<Cars>
  <Type>B</Type>
  <Car>
    <Brand>Car1</Brand>
    <Model>M1</Model>
    <Year>2010</Year>
    <Age>9</Age>
    <Desciption>test</Desciption>
  </Car>
</Cars>


<Cars>
  <Type>B</Type>
  <Car>
    <Brand>Car2</Brand>
    <Model>M2</Model>
    <Year>2015</Year>
    <Age>4</Age>
    <Desciption>test</Desciption>
  </Car>
</Cars>

我的代码:

 $filexml='cars.xml';

  $cname=array();

  $cname[] = 'Brand';
  $cname[] = 'Model';
  $cname[] = 'Year';
  $cname[] = 'Age';
  $cname[] = 'Desciption';


  if (file_exists($filexml)) {
      $xml = simplexml_load_file($filexml); 
      $f = fopen('cars.csv', 'w') or die('Can\'t create .csv file, try again later.');
      fputcsv($f, $cname);

      foreach ($xml->Car as $Car) {
        fputcsv($f, get_object_vars($Car),',','"');
      } 

      fclose($f);

  }

对于每个 child node/tag 你必须使用 __toString() 方法。

像那样:

foreach ($xml->Car as $Car) {
    $row = [];
    foreach ($cname as $node) {
        // Here we address to the Car's child node with name from your array above
        $row[$node] = $Car->{$node}->__toString();
    }

    fputcsv($f, $row, ',' ,'"');
} 

fclose($f);

假设您的 XML 实际上是有效的(只有一个根元素),那么结构的简化视图是这样的:

<document>
    <Cars>
       <Car>
          <Brand>Car1</Brand>
       </Car>
    </Cars>
    <Cars>
       <Car>
          <Brand>Car2</Brand>
       </Car>
    </Cars>
</document>

请注意,同一级别有多个Cars节点,但每个节点只有一个Car

当您加载 XML 时,您的初始 PHP 变量将代表 <document> 元素。

因此您可以像这样手动访问前两个品牌((string) 从 XML 元素获取文本内容):

  • (string)$xml->Cars[0]->Car->Brand
  • (string)$xml->Cars[1]->Car->Brand

要获取所有品牌,您需要遍历 $xml->Cars:

foreach ( $xml->Cars as $CarsNode ) {
   $CarNode = $CarsNode->Car;
   $brand = (string)$CarNode->Brand;
}

从那里,您可以使用现有代码将一行写入 CSV 文件。