如何使用SimpleXML替换命名空间?

时间:2016-12-16 09:51:50

标签: php xml rss simplexml

我多年没有使用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个参数而我只能想到两个。我要替换的词和我想用它替换它。我还需要什么?我还认为在运行新的名称空间免费提要的循环之前,我可能必须为字符串替换运行一个循环。

1 个答案:

答案 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>";
}