【问题标题】:How to write XML to CSV format如何将 XML 写入 CSV 格式
【发布时间】:2019-08-12 19:52:26
【问题描述】:

我正在开发一个将 RSS 解析为 .csv 格式的简单控制台程序,但我被困在 foreach 循环中。我需要将每个标签写入用逗号分隔的文件,但它只会找到第一个标签并将其存储为对象,因此它会阻止我将其写入文件。

在这个 foreach 循环之前一切正常。程序从命令行获取一个 RSS 链接并创建一个包含全部内容的数组。我可以访问它并在控制台上打印,但是foreach循环只能输出第一次迭代。

$xml = simplexml_load_string($content) or die("Error: Cannot create object");

foreach ($xml->children() as $item) {
    echo $item->item->title, ",";
    echo $item->item->description, ",";
    echo $item->item->link, ",";
    echo $item->item->pubDate, ",";
    echo $item->item->author, ",";    
}

XML 文件如下所示:

<item>
  <title></title>
  <description></description>
  <author></author>
  <link></link>
  <pubDate></pubDate>
</item>

$item 在使用 return_r 时的输出是:

[0] => SimpleXMLElement Object
            (
                [title] => 
                [description] => 
                [author] => 
                [link] =>  
                [pubDate] => 
            )

但是当我尝试回显 $item->item->title 时,它​​只会给我一次迭代的内容。

【问题讨论】:

  • 您应该添加一个您正在解析的 XML 示例及其实际给出的结果,这可能会让人们更容易帮助您。此外,您应该在 foreach 的结束标记之前回显一个“\n”,否则您的结果将全部在一行上(这甚至可能是您当前的问题吗?)。
  • 我已经添加了控制台中的xml和输出的样子。
  • “XML 文件看起来像这样:” - item 是根元素?然后,您首先不会有多个项目要循环。假设您实际上是指多个此类项目作为不同根元素的子元素,那么您想要访问的路径中只有一个 item 太多。你想要$item-&gt;title等等。
  • 不建议“手动”编写 CSV。您应该为数组中的一行收集数据,并使用fputcsv
  • 感谢您的回复,误会您是对的,我需要将其放入数组并使用 fputcsv。感谢您的帮助。

标签: php php-7.1


【解决方案1】:

我自己找到了解决方案。工作代码:

$xml = simplexml_load_string($content) or die("Error: Cannot create object");
foreach ($xml->channel->item as $item) {

    $title = $item->title;
    $desc = $item->description;
    $link = $item->link;
    $pub = $item->pubDate;
    $author = $item->author;

    $fields = array($title, $desc, $link, $pub, $author);

    fputcsv($file, $fields);
}

【讨论】:

    猜你喜欢
    • 2022-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2015-04-28
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多