Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C过滤/简化rss提要(下载为字符串格式)_C#_Regex_Xpath_Rss - Fatal编程技术网

C# 用C过滤/简化rss提要(下载为字符串格式)

C# 用C过滤/简化rss提要(下载为字符串格式),c#,regex,xpath,rss,C#,Regex,Xpath,Rss,我目前正在使用以下方法阅读rss提要: if (!String.IsNullOrEmpty(rawxml) && rawxml.Contains("<rss"))//RSS Feeds { using (StringReader sr = new StringReader(rawxml)) { XmlReader xmlReader = XmlReader.Create(sr); Syndication

我目前正在使用以下方法阅读rss提要:

 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
       }
  }
问题是我不知道如何编写一个模式,在不破坏我想要保留的子元素的情况下删除那些不必要的元素。有没有办法选择这些嵌套元素?我一直在研究的第二种策略是使用XPath选择这些节点,但我不确定如何从XMLReader中删除子节点

更新:

我已经决定暂时退出REGEX,我正在考虑使用XDocument和XPath来选择所有我不想要的节点,并将它们从提要中删除。以下是我目前掌握的情况:

if (!String.IsNullOrEmpty(rawxml) && rawxml.Contains("<rss"))//RSS Feeds
{
    //Create XML and remove unneeded xml nodes
    var xdoc = XDocument.Parse(rawxml);
    foreach (var item in xdoc.XPathSelectElements("//item/??some/xpath/here/to/get/unwanted/children"))
    {
        item.RemoveNodes();
        item.RemoveAll();
    }
        //Feed in the cleaned up xml into SyndicationFeed
        using (XmlReader r = xdoc.CreateReader())
        {
            SyndicationFeed rssfeed = SyndicationFeed.Load(r);
            //Do stuff
        }
    }
 }

RegEx不是修改XML文档的合适工具。您试图做的是转换,并且有一种转换XML文档的标准化技术:XSLT。所有必需的类型都在名称空间中,还有一个描述如何在.NET中进行XSL转换的示例。

LINQ和XDocument更直接地使用并解决了该解决方案。下面是我使用的解决方案,对于任何来这里试图限制阅读RSS提要时出错数量的人来说都是这样的。我最终没有使用SyndicationFeed,但是对于那些仍然使用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
                }
          }

谢谢,所以我在看C部分,但现在我在读XSLT的样子,因为我以前从未写过XSLT。
if (!String.IsNullOrEmpty(rawxml) && rawxml.Contains("<rss"))//RSS Feeds
{
    //Create XML and remove unneeded xml nodes
    var xdoc = XDocument.Parse(rawxml);
    foreach (var item in xdoc.XPathSelectElements("//item/??some/xpath/here/to/get/unwanted/children"))
    {
        item.RemoveNodes();
        item.RemoveAll();
    }
        //Feed in the cleaned up xml into SyndicationFeed
        using (XmlReader r = xdoc.CreateReader())
        {
            SyndicationFeed rssfeed = SyndicationFeed.Load(r);
            //Do stuff
        }
    }
 }
        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
                }
          }