我正在尝试利用simplexml将iTunes RSS Feed转换为JSON,以便更好地解析它。我遇到的问题是它没有以正确格式的JSON返回。
$feed_url = 'https://podcasts.subsplash.com/c2yjpyh/podcast.rss';
$feed_contents = file_get_contents($feed_url);
$xml = simplexml_load_string($feed_contents);
$podcasts = json_decode(json_encode($xml));
print_r($podcasts);
是否有更好的方法来尝试此操作以获得正确的结果?
答案 0 :(得分:1)
感谢IMSoP向我指出正确的方向!这花费了一些时间,但解决方案最终变得非常简单!无需尝试转换为JSON格式,只需使用SimpleXML。但是,由于命名空间的原因,它确实需要额外的一行来映射itunes:前缀。
因此,在我的iTunes feed rss中,存在以下行:xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd
因此,我们仅引用此内容即可使访问值变得非常容易。这是一个简单的示例:
$rss = simplexml_load_file('https://podcasts.subsplash.com/c2yjpyh/podcast.rss');
foreach ($rss->channel->item as $item){
// Now we define the map for the itunes: namespace
$itunes = $item->children('http://www.itunes.com/dtds/podcast-1.0.dtd');
// This is a value WITHOUT the itunes: namespace
$title = $item->title;
// This is a value WITH the itunes: namespace
$author = $itunes->author;
echo $title . '<br>';
echo $author . '<br>';
}
我遇到的另一个小问题是获取属性,例如图像和音频链接的url。这是通过使用attributes()
函数来实现的:
// Access attributes WITH itunes: namespace
$image = $itunes->image->attributes();
// Access attributes WITHOUT itunes: namespace
$audio = $item->enclosure->attributes();
// To echo these we simple add the desired attribute in `[]`:
echo $image['href'] . '<br>';
echo $audio['url'] . '<br>';