我正在开发一个允许用户将自己的 RSS 提要添加到各种简单阅读器的应用程序。
目前,我正在xml_domit_rss
用作解析器,但我不确定它是否真的在解析之前验证了 URL。
从我可以在线收集的信息来看,验证似乎与解析是分开的,无论是通过使用服务https://www.feedvalidator.org还是其他一些方法,例如parse_url()
.
任何人都对如何xml_domit_rss
验证或在将 URL 发送到解析器之前可以验证的方法有所了解?
我正在开发一个允许用户将自己的 RSS 提要添加到各种简单阅读器的应用程序。
目前,我正在xml_domit_rss
用作解析器,但我不确定它是否真的在解析之前验证了 URL。
从我可以在线收集的信息来看,验证似乎与解析是分开的,无论是通过使用服务https://www.feedvalidator.org还是其他一些方法,例如parse_url()
.
任何人都对如何xml_domit_rss
验证或在将 URL 发送到解析器之前可以验证的方法有所了解?
您可以使用 RelaxNG 模式验证 RSS。所有不同提要格式的模式都应该在线提供...
在 XML 文件的上下文中验证(以及因此使用 XML 对值进行编码的 RSS/Atom 提要)意味着使用描述 XML 文件的预期结构的文档模式(哪些元素可以有哪些子元素,哪些属性可以是目前等)。
现在一些 XML 解析器需要一个模式和 bork(这是一个技术术语 :-) - 拒绝解析)对不符合模式的 XML 文件。现在看看您是如何解析任意 RSS 的,可能最好跳过验证并尽最大努力解析 RSS 提要。此外,您可以向用户显示解析结果(类似于 Google Reader 在添加新提要时的做法)并让她判断结果是否正常。
不幸的是,这段代码使用的 XML 解析器似乎不幸死了,我找不到任何细节,它在解析中是多么严格或松懈......
很简单,您可以使用SyndicationFeed来做到这一点。它支持Atom 1.0和RSS 2.0版本。
try
{
SyndicationFeed fetchedItems = SyndicationFeed.Load(XmlReader.Create(feedUrl));
// Validation successful.
}
catch { // Validation failed. };
这是我在类似情况下对我有用的快速而肮脏的解决方案
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 提要使事情变得简单而轻松。
试试这个代码
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;
}
}
?>