2016-12-16 143 views
0

我很多年没有使用过PHP,我试图以一种需要高音单元名称的方式来操纵tweet的RSS源。我目前正在从TwitRSS提取RSS提要,并且除了高音单元的名称使用名称空间,所以元素都声称高音单元名称以外,它都工作正常。我在这个网站上看到了很多关于如何使用命名空间的主题,并且我尝试了所有这些都没有成功。如何用SimpleXML替换名称空间?

现在我的代码如下所示:

$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",""); 

我在循环之前加入,因为我会假设,item元素的数组将有循环和echo'ing前的SimpleXML数组中被改变。我知道我所做的一个问题是php str_replace需要3个参数,我只能想到两个。我想要替换的词以及我想要替换的词。我还需要什么?我还认为,在运行新命名空间免费提要的循环之前,我可能必须运行循环来替换字符串。

+0

哎呀,“高音单元名称”应与命名空间中的标签包围,但它得到了剥离出来 – XCon065

+0

'str_replace'是一个全球性的功能。 ' - > str_replace'正在使用类方法。你反对做错了。 –

+0

oops,作者被留在那里从以前的字符串替换尝试 – XCon065

回答

0

您的代码有很多其他的例子复制破解这些都使得您的生活困难,不容易:

  • 你不需要LIBXML_NO_CDATA;无论如何,当你将对象转换回XML时它只会有所不同(它也会对print_r的结果产生影响,但不应该依赖于像SimpleXMLElement这样的“魔术”对象)
  • $newsoutput = json_decode(json_encode($newsoutput), TRUE);基本上说“扔掉SimpleXML API的所有有用的位,并试图给我一个阵列,不保证其格式”
  • 添加字符串操作,只是添加hacks黑客。

相反,你应该学习如何使用命名空间使用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>"; 
} 
+0

是的,这有效。事实上,在发布之后不久,我就明白了这一点。 – XCon065

+0

现在我已经有了一个全新的问题,将它作为自己的RSS提要进行回显。我的解决方案只会在浏览器中生成提要的最后一行,即使您点击查看源代码所有内容都在那里。源代码也只显示为一行代码。 – XCon065

+0

应该在浏览器中说明饲料的最后一项。 – XCon065