从RSS提要计算项目标签(不知道标签名称)

时间:2014-09-09 09:59:06

标签: php xml rss simplexml

我希望在不知道实际标记名称的情况下从rss Feed中获取所有使用过的标记(在$ feed-> channel->项目中)。是的,也许这听起来很奇怪,让我解释一下。

示例

<item>
    <title>Inademen van bloem kan astma veroorzaken</title>
    <link>http://www.nu.nl/gezondheid/3872032/inademen-van-bloem-kan-astma-veroorzaken.html</link>
    <description>Het keer op keer inademen van het fijne stof dat afkomstig is van het bakmeel bloem, kan astma veroorzaken. </description>
</item>
<item>
    <title>Inademen van bloem kan astma veroorzaken</title>
    <link>http://www.nu.nl/gezondheid/3872032/inademen-van-bloem-kan-astma-veroorzaken.html</link>
    <description>Het keer op keer inademen van het fijne stof dat afkomstig is van het bakmeel bloem, kan astma veroorzaken. </description>
    <test>Testing!</pubDate>
</item>

我想要实现的目标(上述XML的示例脚本输出):

  • 标记<title>使用了2次
  • 标记<link>使用了2次
  • 标记<description>使用了2次
  • 标记<test>使用了1次

我该怎么做?当我已经知道标签名称时,我可以轻松地确定所有标签,但是如何计算它们而不知道<item>中使用了哪些标签?

目前我的脚本只是加载Feed并循环显示项目:

<?php
getFeed('http://www.nu.nl/feeds/rss/gezondheid.rss');

function getFeed($feedUrl) {

    $feedUrl = file_get_contents($feedUrl);
    $feedXml = new SimpleXmlElement($feedUrl);
    $itemTags = array();

    echo "<ul>";
    foreach($feedXml->channel->item as $item) {
        echo "<li><a href='$item->link'>" . $item->title . "</a></li>";
    }
    echo "</ul>";
}

1 个答案:

答案 0 :(得分:1)

您可以使用->getName方法获取节点的名称。将它们全部推入数组,然后使用array_count_values()

示例:

$url = 'http://www.nu.nl/feeds/rss/gezondheid.rss';
$xml = simplexml_load_file($url);
$tags = array();
foreach($xml->channel->item as $item) {
    $children = $item->children(); // get all children of each item tag
    foreach ($children as $node) {
        $tags[] = $node->getName(); // get the node name of each children
    }
}

$count = array_count_values($tags); // count the values
echo '<pre>';
print_r($count);

应输出如下内容:

Array
(
    [title] => 10
    [link] => 10
    [guid] => 10
    [description] => 10
    [pubDate] => 10
    [category] => 10
    [enclosure] => 10
    [copyrightPhoto] => 10
    [related] => 6
)