【问题标题】:Parsing RSS with PHP用 PHP 解析 RSS
【发布时间】:2014-09-25 19:09:27
【问题描述】:

我正在尝试解析 RSS:http://www.mlssoccer.com/rss/en.xml

$feed = new DOMDocument();
$feed->load($url)
$items = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('item');

foreach($items as $key => $item) 
{
    $title = $item->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
    $pubDate = $item->getElementsByTagName('pubDate')->item(0)->firstChild->nodeValue;
    $description = $item->getElementsByTagName('description')->item(0)->firstChild->nodeValue;
    // do some stuff
}

问题是:我得到“$title”和“$pubDate”没有问题,但由于某种原因“$description”总是空的,里面什么都没有。这种行为的原因可能是什么以及如何解决?

【问题讨论】:

    标签: php xml rss


    【解决方案1】:

    问题在于 CDATA 你需要使用 textContent 而不是 nodeValue 来检索 beetween 的值

    <?php
    
    $feed = new DOMDocument();
    $feed->load('http://www.mlssoccer.com/rss/en.xml');
    $items = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('item');
    
    foreach($items as $key => $item) 
    {
        $title = $item->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
        $pubDate = $item->getElementsByTagName('pubDate')->item(0)->firstChild->nodeValue;
        $description = $item->getElementsByTagName('description')->item(0)->textContent; // textContent
    
    }
    

    【讨论】:

    • 谢谢,它成功了:-)。虽然这对我来说有点神秘 - “标题”字段也是一个 CDATA 并与“->firstChild->nodeValue”一起使用......
    【解决方案2】:

    这里可以是开头&lt;description&gt; 标记和开头&lt;![CDATA[ 之间的空格。这是一个文本节点。

    因此,如果您访问 description 的 firstChild,您可能会获取该空白文本节点。

    您可以通过通用方式将 DOM 文档设置为忽略空白节点:

    $feed = new DOMDocument();
    $feed->preserveWhiteSpace  = FALSE;
    $feed->load($url);
    

    此外,您应该检查一下 XPath,它使读取 DOM 变得更加容易:

    $xpath = new DOMXpath($feed);
    
    foreach ($xpath->evaluate('//channel/item') as $item) {
        $title = $xpath->evaluate('string(title)', $item);
        $pubDate = $xpath->evaluate('string(pubDate)', $item);
        $description = $xpath->evaluate('string(description)', $item);
        // do some stuff
        var_dump([$title, $pubData, $description]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多