【发布时间】:2017-07-13 18:51:24
【问题描述】:
我创建了 C# 控制台应用程序,它读取多个 RSS Feed url,然后取值并放入数据库。
现在我在使用 wordpress rss feed 生成器时遇到问题,其中文章图像带有标签 enclosure。
如果在源代码中存在附件,如何获取和解析文章图像 url,我使用我的代码读取 description 标签中的所有图像 url。
这是我在数据库中读写的代码:
using (var xmlReader = XmlReader.Create(izvorURLX))
{
var rssFormatter = new Rss20FeedFormatter();
rssFormatter.ReadFrom(xmlReader);
foreach (SyndicationItem syndicationItem in rssFormatter.Feed.Items)
{
Console.OutputEncoding = Encoding.UTF8;
string link = syndicationItem.Links[0].Uri.ToString();
var statCat1 = Convert.ToString((""));
foreach (var kategorija in syndicationItem.Categories.Take(1))
{
statCat1 = (kategorija.Name);
}
var rr = syndicationItem.AttributeExtensions.Values;
var LastIZV1 = rssFormatter.Feed.LastUpdatedTime.DateTime;
var SiteTitle = rssFormatter.Feed.Title.Text;
var itemFD = Convert.ToString(syndicationItem.Summary.Text);
string clitemFD = Regex.Replace(itemFD, @"<[^>]*>", String.Empty, RegexOptions.IgnoreCase).Trim();
var ItemItem = Convert.ToString(rssFormatter.Feed.Items);
var ff = rssFormatter.Feed.Items.ToString();
var datumIZV0 = syndicationItem.PublishDate.DateTime;
var nula = Convert.ToDateTime("01.01.0001 00:00:00");
var datumIZVX = Convert.ToDateTime(DateTime.Now);
if (datumIZV0 == nula)
{
datumIZVX = Convert.ToDateTime(DateTime.Now);
}
else
{
datumIZVX = Convert.ToDateTime(datumIZV0);
}
XmlDocument doc = new XmlDocument();
doc.Load(izvorURLX);
var imgSRC = Convert.ToString("");
var reg1 = new Regex("src=(?:\"|\')?(?<imgSrc>[^>]*[^/].?:bmp|jpg|jpeg|gif|png))(?:\"|\')?");
var match1 = reg1.Match(itemFD);
if (match1.Success)
{
Uri UrlImage = new Uri(match1.Groups["imgSrc"].Value, UriKind.Absolute);
imgSRC = UrlImage.ToString();
}
var feedXML = Convert.ToString(izvorURLX);
int KatX = Convert.ToInt32(KatIzv);
var statTitle = Convert.ToString(syndicationItem.Title.Text);
var statLink = Convert.ToString(syndicationItem.Links[0].Uri);
SqlConnection conn = new SqlConnection("Server=localhost\\SQLEXPRESS;Database=RSSFeedAgregator;Integrated Security=true");
conn.Open();
var FeedID = Convert.ToInt32(0);
var LastinDB = Convert.ToDateTime("01.01.0001 00:00:00");
string FeedInDB = Convert.ToString("a");
using (SqlCommand cmdX2 = new SqlCommand("SELECT Feed_ID, Izvor, LastUpd, feed, Kategorija, iID, izvTitle, statCat FROM [dbo].[tbl_feeds]", conn))
{
SqlDataReader readerX = cmdX2.ExecuteReader();
while (readerX.Read())
{
Console.OutputEncoding = Encoding.UTF8;
var feedTxt = Convert.ToString(readerX["feed"]);
FeedID = Convert.ToInt32(readerX["Feed_ID"]);
LastinDB = Convert.ToDateTime(readerX["LastUpd"]);
FeedInDB = Convert.ToString(readerX["feed"]);
}
readerX.Close();
}
bool inList = DB.Contains(clitemFD);
var statIMG = Convert.ToString("");
if (inList == false)
{
Console.WriteLine("false: Ne postoi");
using (SqlCommand cmd1 = new SqlCommand("INSERT INTO tbl_feeds VALUES (" + "@Izvor, @LastUpd, @feed, @Kategorija, @iID, @izvTitle, @statCat, @statTitle, @statLink, @statImage)", conn))
{
cmd1.Parameters.AddWithValue("@Izvor", feedXML);
cmd1.Parameters.AddWithValue("@LastUpd", datumIZVX);
cmd1.Parameters.AddWithValue("@feed", clitemFD);
cmd1.Parameters.AddWithValue("@Kategorija", KatX);
cmd1.Parameters.AddWithValue("@iID", IzvID);
cmd1.Parameters.AddWithValue("@izvTitle", SiteTitle);
cmd1.Parameters.AddWithValue("@statCat", statCat1);
cmd1.Parameters.AddWithValue("@statTitle", statTitle);
cmd1.Parameters.AddWithValue("@statLink", statLink);
cmd1.Parameters.AddWithValue("@statImage", imgSRC);
int rows = cmd1.ExecuteNonQuery();
Console.WriteLine("Uspesno dodadeno nov zapis !");
}
conn.Close();
}
else
{
Console.WriteLine("true: Postoi");
}
}
}
对不起,我的长代码,但我更容易理解,我希望任何人都可以帮助我。
更新
我也找到了这段代码,这段代码读取附件 URL,但只是重复阅读,如果源有 10 篇文章,这段代码读取 10 次所有 10 个 img url,并在数据库中保存最后一个。
XmlNodeList items = doc.SelectNodes("//item") ;
for (int i = 0; i < items.Count; i++)
{
var encImg = (items[i].SelectSingleNode("enclosure").Attributes["url"].Value);
}
任何人都可以修改此代码以工作属性?
【问题讨论】:
-
不要那样做。您需要使用 HTML 解析器。
-
另外,您的
Convert.ToString电话毫无意义。 -
使用
First()而不是你奇怪的循环。 -
我不是专家,你能写代码如何调用附件标签吗?因为我的代码从来没有定义外壳阅读。谢谢
-
Convert.ToString 是因为我将所有值作为字符串放入数据库中,然后我也将其读取为字符串,而不是 XML 文件。
标签: c# .net xpath console xelement