我正在开发一个应用程序,允许用户将自己的RSS源添加到各种简单的阅读器中。
目前,我正在使用xml_domit_rss
作为解析器,但我不确定它是否在解析之前实际验证了URL。
从我在线收集的内容来看,通过使用服务https://www.feedvalidator.org或其他方法(如parse_url()
),验证与解析是分开的。
任何人都可以了解xml_domit_rss
如何验证,或者在将URL发送到解析器之前我可以验证的方法?
答案 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.0和RSS 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;
}
}
?>