2016-07-04 5 views
0

Я, чтение RSS, используя следующий код:Использование Syndicationfeed для загрузки XML с закодированными ссылками

var reader = XmlReader.Create(url); 
SyndicationFeed.Load(reader); 

RSS-выглядит это, и SyndicationFeed.Load сгенерирует исключение, когда link тег содержит закодированную символы (в этот случай å кодируется как %C3%A5)

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> 
    <channel> 
    <atom:link rel="self" type="application/rss+xml" href="http://example.com/rss" /> 
    <title>My RSS</title> 
    <description>My RSS</description> 
    <pubDate>Mon, 04 Jul 2016 08:19:50 +0200</pubDate> 
    <generator>RSS Generator 1.1</generator> 
    <link>http://example.com/rss</link> 
    <item> 
     <title>A title</title> 
     <description>A description</description> 
     <link>http://bl%C3%A5ljus.se</link> 
    </item> 
    </channel> 
</rss> 

исключением является следующее:

System.Xml.XmlException: Error in line x position x. An error was encountered when parsing the item's XML. Refer to the inner exception for more details. ---> 
System.UriFormatException: Invalid URI: The hostname could not be parsed. 

    at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind) 
    at System.Uri..ctor(String uriString, UriKind uriKind) 
    at System.ServiceModel.Syndication.Rss20FeedFormatter.ReadAlternateLink(XmlReader reader, Uri baseUri) 
    at System.ServiceModel.Syndication.Rss20FeedFormatter.ReadItemFrom(XmlReader reader, SyndicationItem result, Uri feedBaseUri) 
    --- End of inner exception stack trace --- 
    at System.ServiceModel.Syndication.Rss20FeedFormatter.ReadItemFrom(XmlReader reader, SyndicationItem result, Uri feedBaseUri) 
    at System.ServiceModel.Syndication.Rss20FeedFormatter.ReadItem(XmlReader reader, SyndicationFeed feed) 
    at System.ServiceModel.Syndication.Rss20FeedFormatter.ReadItems(XmlReader reader, SyndicationFeed feed, Boolean& areAllItemsRead) 
    at System.ServiceModel.Syndication.Rss20FeedFormatter.ReadXml(XmlReader reader, SyndicationFeed result) 
    at System.ServiceModel.Syndication.Rss20FeedFormatter.ReadFeed(XmlReader reader) 
    at System.ServiceModel.Syndication.Rss20FeedFormatter.ReadFrom(XmlReader reader) 
    at System.ServiceModel.Syndication.SyndicationFeed.Load[TSyndicationFeed](XmlReader reader) 
System.UriFormatException: Invalid URI: The hostname could not be parsed. 
    at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind) 
    at System.Uri..ctor(String uriString, UriKind uriKind) 
    at System.ServiceModel.Syndication.Rss20FeedFormatter.ReadAlternateLink(XmlReader reader, Uri baseUri) 
    at System.ServiceModel.Syndication.Rss20FeedFormatter.ReadItemFrom(XmlReader reader, SyndicationItem result, Uri feedBaseUri) 

Есть ли какие-либо настройки, которые я могу передать при загрузке XML, чтобы сообщить SyndicationFeed, чтобы игнорировать ошибки синтаксического анализа? Или какое-то другое решение?

+1

Хм прекрасно, а XmlReader в порядке. Я думаю, что проблема заключается в коде SyndicationFeed, который является основной причиной проблемы. – jdweng

ответ

1

Проблема, как представляется, создание Uri - вы можете воспроизводить только с этим кодом:

var uri = new Uri("http://bl%C3%A5jus.se"); 

Возможным решением для предварительной обработки XML, чтобы декодировать ссылку проиндексированных загрузок как SyndicationFeed ,

var doc = XDocument.Load(url); 

foreach (var link in doc.Descendants("link") 
{ 
    link.Value = WebUtility.UrlDecode(link.Value); 
} 

using (var reader = doc.CreateReader()) 
{ 
    SyndicationFeed.Load(reader); 
} 
+0

Это работает, спасибо. Хотел бы, чтобы «SyndicationFeed» смог его решить, но я поеду с этим сейчас :) – Joel