1

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

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

从我可以在线收集的信息来看,验证似乎与解析是分开的,无论是通过使用服务https://www.feedvalidator.org还是其他一些方法,例如parse_url().

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

4

5 回答 5

1

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

于 2009-01-16T17:51:12.243 回答
0

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

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

不幸的是,这段代码使用的 XML 解析器似乎不幸死了,我找不到任何细节,它在解析中是多么严格或松懈......

于 2009-02-04T07:54:20.107 回答
0

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

try 
{
    SyndicationFeed fetchedItems = SyndicationFeed.Load(XmlReader.Create(feedUrl));
    // Validation successful.
} 
catch { // Validation failed. };
于 2009-05-21T08:17:31.727 回答
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 解析器和实体出现问题,&例如•—

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

于 2009-12-30T04:12:56.337 回答
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;
    }
}

?>
于 2011-05-31T09:56:46.233 回答