我多年没有使用PHP了,我试图以一种需要高音扬声器名称的方式操纵推文的RSS提要。我正在从TwitRSS中提取RSS源,除了高音扬声器的名称使用命名空间以外,它的工作正常,因此该元素称为tweeter name。我在这个网站上看到很多关于如何使用命名空间的线程,我已经尝试了所有这些线程没有成功。
现在我的代码看起来像这样:
$newsoutput = new SimpleXMLElement('http://twitrss.me/twitter_search_to_rss/?term=php', LIBXML_NOCDATA, true);
$newsoutput = json_decode(json_encode($newsoutput), TRUE);
foreach ($newsoutput['channel']['item'] as $item) {
echo $item['title']."<br>".$item['description']."<br>".$item['link']."<br>".$item['guid']."<br>".$item['pubDate']."<br>";
echo $item['author']."br";}
当然,对于所有正常元素都可以正常回显,但每当我尝试获取命名空间标记时,我尝试的每个解决方案都会导致循环中的错误消息。通常它与子元素为空有关。
现在我想尝试不同的解决方案。我想做一个字符串替换,它将使用非命名空间元素更改每个命名空间元素。理想情况下,生成的RSS提要将替换为每个元素,然后正常回显。
我尝试过添加以下内容:
$newsoutput->str_replace("dc:creator","author","");
我在循环之前添加了它,因为我假设在循环和回显之前必须在SimpleXML数组中更改项元素数组。我知道我正在做的一个问题是php str_replace需要3个参数而我只能想到两个。我要替换的词和我想用它替换它。我还需要什么?我还认为在运行新的名称空间免费提要的循环之前,我可能必须为字符串替换运行一个循环。
答案 0 :(得分:0)
你的代码中有很多黑客从其他例子中复制过来,这会让你的生活变得更加困难,而不是更容易:
LIBXML_NO_CDATA
;只有当你将对象重新转换为XML时,它才会产生影响(它也会对print_r
的结果产生影响,但你不应该依赖于它。魔术&#34;像SimpleXMLElement这样的对象)$newsoutput = json_decode(json_encode($newsoutput), TRUE);
基本上说&#34;抛弃SimpleXML API的所有有用位,并试图给我一个阵列,不保证其格式&#34; 相反,您应该学习如何使用SimpleXML使用名称空间,即使用the ->children()
method(也可能the ->attributes()
method,它的工作方式相同)。
所以你可以使用这样的东西:
$newsoutput = new SimpleXMLElement('http://twitrss.me/twitter_search_to_rss/?term=php', 0, true);
foreach ($newsoutput->channel->item as $item) {
echo $item['title']."<br>".$item['description']."<br>".$item['link']."<br>".$item['guid']."<br>".$item['pubDate']."<br>";
echo $item->children('http://purl.org/dc/elements/1.1/')->creator."<br>";
}