2016-09-20 64 views
0

即时通讯SyndicationFeed存在一些问题,抛出一个我找不到的异常,一直在寻找答案。已经尝试了其他用户建议的大部分解决方案,但没有运气。这里是代码。SyndicationFeed - 无法读取网址,错误的行和位置

// the feed that will throw Exception. 
var stream = "http://www.gamespot.com/feeds/news/"; 

    try 
       { 
        var settings = new XmlReaderSettings() 
        { 
         ProhibitDtd = false, 
         IgnoreComments = true 
        }; 

        using (XmlReader xmlReader = XmlReader.Create(stream, settings)) 
        { 
         xmlReader.Read(); 

         var t = 0; 

         var rss = new Rss20FeedFormatter(); 
         var atom = new Atom10FeedFormatter(); 
         _feed = new SyndicationFeed(); 
         // the problem is here when i try to load to 
         // the feed with xmlReader, for some reason the 
         //feed can't read the xmlReader. getting row and 
         //position error. 
         if (atom.CanRead(xmlReader)) 
         { 
          _feed = SyndicationFeed.Load(xmlReader); 
         } 
         else if (rss.CanRead(xmlReader)) 
         { 
          _feed = SyndicationFeed.Load(xmlReader); 
         } 
         xmlReader.Close(); 
        } 
       } 
       catch (Exception ex) 
       { 
        var message = ex.Message; 
       } 

similar problem 我真的需要某种形式的打击。

非常感谢提前。

回答

0

问题出在缓存节点上,在解析之前将其删除。

var stream = "http://www.gamespot.com/feeds/news/"; 

      try 
      { 
       var settings = new XmlReaderSettings() 
       { 
        ProhibitDtd = false, 
        IgnoreComments = true, 
        IgnoreWhitespace=true 
       }; 

       string xml = new WebClient().DownloadString(stream); 

       XDocument doc = XDocument.Parse(xml); 
       doc.Descendants().Where(e => e.Name == "cache").Remove(); 

       using (Stream memoryStream = new MemoryStream()) // Create a stream 
       { 
        doc.Save(memoryStream);  // Save XDocument into the stream 
        memoryStream.Position = 0; // Rewind the stream ready to read from it elsewhere 

        using (XmlReader xmlReader = XmlReader.Create(memoryStream, settings)) 
        { 
         xmlReader.Read(); 

         var rss = new Rss20FeedFormatter(); 
         var atom = new Atom10FeedFormatter(); 
         var _feed = new SyndicationFeed(); 
         // the problem is here when i try to load to 
         // the feed with xmlReader, for some reason the 
         //feed can't read the xmlReader. getting row and 
         //position error. 
         if (atom.CanRead(xmlReader)) 
         { 
          _feed = SyndicationFeed.Load(xmlReader); 
         } 
         else if (rss.CanRead(xmlReader)) 
         { 
          _feed = SyndicationFeed.Load(xmlReader); 
         } 
         xmlReader.Close(); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       var message = ex.Message; 
      } 
+0

“doc.Save(memoryStream); //将XDocument保存到流” 即时获得这部分错误。做了一些转换,所以它会返回一个字符串,但它是空的。 –

+0

在我的控制台应用程序中不会有任何异常。什么是XML变量? – Alexandr

0

在这个解决方案中工作的答案,对我来说。

public XmlReader CleanXdocument(XmlReader xmlReader) 
     { 
      var xdoc = new XDocument(); 
      xdoc = XDocument.Load(xmlReader); 
      if (xdoc.Descendants("cache").Any()) 
      { 
       xdoc.Descendants().FirstOrDefault(e => e.Name == "cache").Remove(); 
      } 
      var str = xdoc.ToString(); 
      TextReader tr = new StringReader(str); 
      xmlReader =XmlReader.Create(tr); 

      return xmlReader; 
     } 

也许不是最好的办法,但它的工作原理。非常感谢Alexandr提出并解决我的问题。