在C#中过滤/简化rss提要(下载到字符串格式)

时间:2016-03-10 23:26:09

标签: c# regex xpath rss

我目前正在使用以下方法读取RSS Feed:

var objectsArray = [Objects]()

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {

    //send a reply
    replyHandler(["Value": [objectsArray]])

}

这段代码将处理几个不同的新闻源,并且在SyndicationFeed.Load过程中可能会出现各种不同类型的错误,我希望在加载之前简化rss feed。一个SyndicationFeed(这是一种字符串格式,在代码中名为rawxml),这样rss feed中的项目只包含这些子元素:

 if (!String.IsNullOrEmpty(rawxml) && rawxml.Contains("<rss"))//RSS Feeds
 {
      using (StringReader sr = new StringReader(rawxml)) 
      { 
          XmlReader xmlReader = XmlReader.Create(sr);
          SyndicationFeed rssfeed = SyndicationFeed.Load(xmlReader);
          xmlReader.Close();
           //do stuff with the SyndicationFeed rssfeed
       }
  }

我目前正在考虑使用正则表达式模式去除<item>     <title>*</title> <link>*</link> <description>*</description> <pubDate>*</pubDate> </item> 元素下的所有子元素,这些元素不是标题,链接,描述或pubDates。我会使用以下附加代码执行此操作:

<item>

问题是我不知道如何编写一个模式来删除那些不必要的元素而不破坏我想要保留的子元素。有没有办法选择那些嵌套元素?我一直在研究的第二个策略是使用XPath来选择那些节点,但我不确定如何从XMLReader中删除子节点。

更新:

我决定暂时退出REGEX,并且我正在考虑使用 XDocument XPath 来选择我不喜欢的所有节点。想要并从Feed中删除它们。以下是我到目前为止:

  string pattern =  @"some pattern here";
  Regex rgx = new Regex(pattern);
  string result = rgx.Replace(rawxml, "");

2 个答案:

答案 0 :(得分:0)

RegEx不适合修改XML文档。您要做的是转换,并且有一种用于转换XML文档的标准化技术:XSLT。所有必需的类型都在System.Xml.Xsl命名空间中,还有一个guide描述了如何在.NET中进行XSL转换。

答案 1 :(得分:0)

LINQ和XDocument更直接地使用并解决了解决方案。以下是我使用的解决方案对于那些试图限制他们在阅读RSS源时获得的错误数量的人的看法。我最终只是没有使用SyndicationFeed,但对于仍然使用它的人,他们可以在XNodes上使用.RemoveAll()操作。

        if (!String.IsNullOrEmpty(rawxml) && rawxml.Contains("<rss"))
        {
            //Create XML
            XDocument xdoc = XDocument.Parse(rawxml);
            foreach (var item in xdoc.Descendants("item")) {
                //set temporary variables
                foreach(var child in item.Descendants().Where(x => 
                x.Name.ToString().ToLower() == "description" ||
                x.Name.ToString().ToLower() == "link" ||
                x.Name.ToString().ToLower() == "title" ||
                x.Name.ToString().ToLower() == "pubdate"
                )){
                      //grab elements with a switch statement
                      //do your operations
                }
          }