C# 用C过滤/简化rss提要(下载为字符串格式)
我目前正在使用以下方法阅读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
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
}
}