验证RSS源

时间:2009-01-16 17:44:22

标签: php xml rss feeds validation

我正在开发一个应用程序,允许用户将自己的RSS源添加到各种简单的阅读器中。

目前,我正在使用xml_domit_rss作为解析器,但我不确定它是否在解析之前实际验证了URL。

从我在线收集的内容来看,通过使用服务https://www.feedvalidator.org或其他方法(如parse_url()),验证与解析是分开的。

任何人都可以了解xml_domit_rss如何验证,或者在将URL发送到解析器之前我可以验证的方法?

5 个答案:

答案 0 :(得分:1)

您可以使用RelaxNG架构验证RSS。所有不同饲料格式的模式都应在线提供......

答案 1 :(得分:0)

在XML文件的上下文中进行验证(以及因此使用XML对值进行编码的RSS / Atom提要)意味着使用描述XML文件的预期结构的文档模式(哪些元素可以具有哪些子元素,什么属性可以存在等。)

现在,一些XML解析器需要一个架构和bork(这是一个技术术语:-) - 拒绝解析)不符合架构的XML文件。现在看看你是如何解析任意RSS的,最好是跳过验证并尽最大努力解析RSS提要。此外,您可以向用户显示解析结果(类似于Google阅读器在添加新Feed时的操作方式)并让她判断结果是否正常。

不幸的是,此代码使用的the XML parser似乎不幸死了,我找不到任何详细信息在解析中有多严格或不严格...

答案 2 :(得分:0)

很简单,你可以使用 SyndicationFeed 来做到这一点。 它支持Atom 1.0RSS 2.0版本。

try 
{
    SyndicationFeed fetchedItems = SyndicationFeed.Load(XmlReader.Create(feedUrl));
    // Validation successful.
} 
catch { // Validation failed. };

答案 3 :(得分:0)

这是我在类似情况下为我工作的快速而肮脏的解决方案

foreach($sources as $source) {
    if(!$source["url"]) {
        continue;
    }

    $rss = curl_request($source["url"]);
    $rss = str_replace('&', '&', $rss);

    $parser = xml_parser_create();
    if(xml_parse($parser, $rss)) {
        $xmle = new SimpleXMLElement($rss);
    }
    else {
        $xmle = null;
        continue;
    }

    //other stuff here
}

我确保将&符号替换为&,因为这样做不会导致SimpleXMLElement解析器和•—

等实体出现问题

xml_parse成功后返回1,因此您可以使用直接if语句进行检查。然后使用SimpleXMLElement遍历RSS提要使事情变得简单明了。

答案 4 :(得分:0)

试试这段代码     

function validateFeed( $sFeedURL )
{

    $sValidator = 'http://feedvalidator.org/check.cgi?url=';

    if( $sValidationResponse = @file_get_contents($sValidator . urlencode($sFeedURL)) )
    {
        if( stristr( $sValidationResponse , 'This is a valid RSS feed' ) !== false )
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return false;
    }
}

?>