使用PHP将RSS转换为CSV

使用PHP将RSS转换为CSV,php,csv,simplexml,Php,Csv,Simplexml,我正在将RSS源从旧购物车转换为新购物车。新购物车将CSV作为输入。我想,通常情况下,我可以对它进行修补,也许可以找到答案——但在将提要放入CSV之前,还需要完成一些额外的任务 首先,这是原料 实际上,我并不需要从RSS中获取太多数据,但我确实需要(从每个RSS中,这些是我的“字段”): 头衔 描述* 价格 销售价格 *描述是我需要做一些工作的地方。它有一堆html特殊字符,以及我想删除的html(包括任何图像引用)。简单地说,纯文本就是我想要的 通常,是否在生成CSV文件后添加字段?我不介

我正在将RSS源从旧购物车转换为新购物车。新购物车将CSV作为输入。我想,通常情况下,我可以对它进行修补,也许可以找到答案——但在将提要放入CSV之前,还需要完成一些额外的任务

首先,这是原料

实际上,我并不需要从RSS中获取太多数据,但我确实需要(从每个RSS中,这些是我的“字段”):

  • 头衔
  • 描述*
  • 价格
  • 销售价格
*描述是我需要做一些工作的地方。它有一堆html特殊字符,以及我想删除的html(包括任何图像引用)。简单地说,纯文本就是我想要的

通常,是否在生成CSV文件后添加字段?我不介意以后再加上。我将在Excel中的CSV上线之前使用它,添加额外的字段和信息

下面是我为解析XML/RSS编写的一些代码:

$ch = curl_init('http://bellyscarf.com/rsscategoryproducts.sc?categoryId=6');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
curl_close($ch);

$doc = new SimpleXmlElement($data, LIBXML_NOCDATA);

if(isset($doc->channel))
{
    parseRSS($doc);
} else {
    echo "Not RSS";
}

function parseRSS($xml)
{
    echo "<strong>".$xml->channel->title."</strong>";
    $cnt = count($xml->channel->item);
    for($i=0; $i<$cnt; $i++)
    {
        $url = $xml->channel->item[$i]->link;
        $title = $xml->channel->item[$i]->title;
        $desc = html_entity_decode($xml->channel->item[$i]->description);

        echo '<a href="'.$url.'">'.$title.'</a>'.$desc.'';
    }
}
$ch=curl\u init('http://bellyscarf.com/rsscategoryproducts.sc?categoryId=6');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_头,0);
$data=curl\u exec($ch);
卷曲关闭($ch);
$doc=新的simplexmlement($data,LIBXML_NOCDATA);
如果(isset($doc->channel))
{
(doc美元);
}否则{
回声“不是RSS”;
}
函数parsers($xml)
{
echo“”$xml->channel->title.“”;
$cnt=count($xml->channel->item);
对于($i=0;$ichannel->item[$i]->link;
$title=$xml->channel->item[$i]->title;
$desc=html\u entity\u decode($xml->channel->item[$i]->description);
回显“.$desc.””;
}
}
您可以在此处看到其结果(不确定是否有帮助):


那么如何使用这些数据生成CSV文件呢?

您可以使用
fputcsv
函数来编写CSV文件。 按如下方式替换
parsers
函数:

function parseRSS($xml)
{
        $fp = fopen('file.csv', 'w');
        $header = array('URL','Title','Description');
        fputcsv($fp,$header);
        $cnt = count($xml->channel->item);
        for($i=0; $i<$cnt; $i++)
        {
            $url = $xml->channel->item[$i]->link;
            $title = $xml->channel->item[$i]->title;
            $desc = html_entity_decode($xml->channel->item[$i]->description);
            $fields = array($url, $title, $desc);
            fputcsv($fp, fields);
        }

        fclose($fp);
}
函数parsers($xml)
{
$fp=fopen('file.csv','w');
$header=array('URL','Title','Description');
fputcsv($fp,$header);
$cnt=count($xml->channel->item);
对于($i=0;$ichannel->item[$i]->link;
$title=$xml->channel->item[$i]->title;
$desc=html\u entity\u decode($xml->channel->item[$i]->description);
$fields=array($url、$title、$desc);
fputcsv($fp,字段);
}
fclose($fp);
}

Alex已经展示了如何使用
fputcsv
创建CSV文件,但是从提要读取时仍然存在问题

首先,您可以更直接地迭代通道项,因此编写脚本更容易:

$doc = new SimpleXmlElement($data, LIBXML_NOCDATA);

foreach($doc->channel->item as $item)
{
    $link = $item->link;
    $title = $item->title;
}
要获取价格标签,您需要访问另一个命名空间的子命名空间。该命名空间在RSS文件中定义,您需要知道它的URI。对于
gd:
,这是:

http://app.fastshoppingcart.com/rss/featuredProduct/1.0
然后,您可以访问价格,如以下扩展示例所示:

$doc = new SimpleXmlElement($data, LIBXML_NOCDATA);

foreach($doc->channel->item as $item)
{
    $link = $item->link;
    $title = $item->title;

    $gd = $item->children('http://app.fastshoppingcart.com/rss/featuredProduct/1.0');
    $price = $gd->price;
}
现在,您编写了要从“描述”字段中删除标记的代码。这不是很好的代码,但这很快就能完成任务:

$description = strip_tags(html_entity_decode($item->description));
$description = str_replace(array("\xA0", "\r", "\n", "\t", "\l", "\f"), ' ', $description);
$description = preg_replace('/\s{2,}/', ' ', $description);
它使用
strip_标记
删除所有标记,然后使用
str_替换
preg_替换
规范化空白


我希望这会有所帮助。

那么问题是什么?我如何从RSS提要中获取上面列出的字段(标题、描述、价格、销售价格),并将其转换为CSV文件。关于从RSS获取价格和销售价格,有什么想法吗?不确定它们是否是键/值对,或者如何访问它们?它们位于描述块()这有点棘手,因为节点包含一个列字符。您可以像这样访问销售价格:
$xml->channel->item[$i]->{gd:salePrice}
似乎不喜欢{gd:salePrice}中的冒号…可能是非法字符?