PDA

View Full Version : سوال: مشکل در ایجاد Rss برای اخبار



omid_kimia
چهارشنبه 25 اسفند 1389, 13:57 عصر
سلام

برا اخبارم Rss گذاشتم میخوام تو صفحه Rss اخبار جدید مثلا 10 خبر آخر بیان یعنی هر خبر جدیدی که اضافه میشه عنوان و متن خبر تو صفحه Rss هم نشون داده بشه . حالا قسمت id از چه کدی باید استفاده کنم؟؟از این صفحه (http://barnamenevis.org/showthread.php?101923-BehooRssGenerator-%DA%A9%D8%AA%D8%A7%D8%A8%D8%AE%D8%A7%D9%86%D9%87-%D8%A7%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AA%D9%88%D9%84%DB%8C%D8%AF-%D8%A2%D8%B3%D8%A7%D9%86-RSS) استفاده کردم .



using BehooRssGenerator.RssElements;

----------------------------------------------

protected void Page_Load(object sender, EventArgs e)
{

RssChannel OBJ_CHANNEL = new RssChannel("Behrouz News Headlines!", new Uri("http://www.site.com/"), "ASP.NET - Daily News");
OBJ_CHANNEL.Categories.Add(new RssCategory("Programming"));
OBJ_CHANNEL.Categories.Add(new RssCategory("Updates", "http://www.site.com/updates"));
OBJ_CHANNEL.CompressionMode = RssChannel.CompressType.High;
OBJ_CHANNEL.Copyright = "(c) 2008, Behrouz News Agency.";
OBJ_CHANNEL.Language = RssLanguages.Persian;
OBJ_CHANNEL.LastBuildDate = DateTime.Now;
OBJ_CHANNEL.ManagingEditor = new System.Net.Mail.MailAddress("my1@domain.com", "Ali Ahmadi");
OBJ_CHANNEL.WebMaster = new System.Net.Mail.MailAddress("my2@domain.com", "Behrouz Rad");

OBJ_CHANNEL.Items.Add(new RssItem("اولین خبر", new Uri("http://www.site.com/news.aspx?id=1"), "متن خلاصه اولین خبر"));

RssItem OBJ_ITEM = null;
OBJ_ITEM = new RssItem("دومین خبر", new Uri("http://www.site.com/news.aspx?id=2"), "متن خلاصه دومین خبر");
OBJ_ITEM.Author = new System.Net.Mail.MailAddress("my2@domain.com", "Behrouz Rad");
OBJ_ITEM.Categories.Add(new RssCategory("Programming"));
OBJ_ITEM.Comments = new Uri("http://www.site.com/news.aspx?id=2/comments");
OBJ_ITEM.Guid = new RssGuid(Guid.NewGuid().ToString());
OBJ_ITEM.PubDate = DateTime.Now.AddHours(-3);

OBJ_CHANNEL.Items.Add(OBJ_ITEM);

OBJ_CHANNEL.GenerateRss(this.Context);

}

Mostafa_Dindar
چهارشنبه 25 اسفند 1389, 22:06 عصر
سلام ،

لطفا اینطور امتحان کنید :

protected void Page_Load(object sender, EventArgs e)
{
Response.ContentType = "application/rss+xml";
Response.ContentEncoding = Encoding.UTF8;

XmlTextWriter rsswriter = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);

WriteRssOpening(rsswriter);

DataTable ArticlesRssTable = GetDateSet();
WriteRssBody(rsswriter, ArticlesRssTable);

WriteRssEnding(rsswriter);

rsswriter.Flush();
Response.End();
}

private void WriteRssOpening(XmlTextWriter rsswriter)
{
rsswriter.WriteStartElement("rss");
rsswriter.WriteAttributeString("version", "2.0");
rsswriter.WriteStartElement("channel");
rsswriter.WriteElementString("title", "عنوان سایت ");
rsswriter.WriteElementString("link", Request.Url.Host);
rsswriter.WriteElementString("description", "کمی توضیحات");
}

private void WriteRssBody(XmlTextWriter rsswriter, DataTable data)
{
foreach (DataRow rssitem in data.Rows)
{
rsswriter.WriteStartElement("item");
rsswriter.WriteElementString("title", rssitem[1].ToString());
rsswriter.WriteElementString("author", rssitem[2].ToString());
rsswriter.WriteElementString("link", rssitem[3].ToString());
rsswriter.WriteElementString("description", rssitem[4].ToString());
rsswriter.WriteElementString("pubDate", rssitem[5].ToString());
rsswriter.WriteEndElement();
}
}

private void WriteRssEnding(XmlTextWriter rsswriter)
{
rsswriter.WriteEndElement();
rsswriter.WriteEndElement();
}

private DataTable GetDateSet()
{
DataTable ArticlesRssTable = new DataTable();

string strconn = ConfigurationManager.ConnectionStrings["YourConnectionStringName"].ConnectionString;
SqlConnection conn = new SqlConnection(strconn);
string strsqlquery = "SELECT * FROM [Articles]";

SqlDataAdapter da = new SqlDataAdapter(strsqlquery, conn);
da.Fill(ArticlesRssTable);

return ArticlesRssTable;
}

موفق باشید

omid_kimia
پنج شنبه 26 اسفند 1389, 10:31 صبح
سلام ،

لطفا اینطور امتحان کنید :

protected void Page_Load(object sender, EventArgs e)
{
Response.ContentType = "application/rss+xml";
Response.ContentEncoding = Encoding.UTF8;

XmlTextWriter rsswriter = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);

WriteRssOpening(rsswriter);

DataTable ArticlesRssTable = GetDateSet();
WriteRssBody(rsswriter, ArticlesRssTable);

WriteRssEnding(rsswriter);

rsswriter.Flush();
Response.End();
}

}


سلام
یه سوال.اگه از کد بالا یعنی page load استفاده نکنم مشکلی پیش میاد؟؟
اگه استفاده کنم باید فایل xml در برنامم اضافه کنم؟؟

ممنون میشم اگه توضیح مختصری بدین.

jaykob
پنج شنبه 26 اسفند 1389, 18:35 عصر
سلام ،

لطفا اینطور امتحان کنید :

protected void Page_Load(object sender, EventArgs e)
{
Response.ContentType = "application/rss+xml";
Response.ContentEncoding = Encoding.UTF8;

XmlTextWriter rsswriter = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);

WriteRssOpening(rsswriter);

DataTable ArticlesRssTable = GetDateSet();
WriteRssBody(rsswriter, ArticlesRssTable);

WriteRssEnding(rsswriter);

rsswriter.Flush();
Response.End();
}

private void WriteRssOpening(XmlTextWriter rsswriter)
{
rsswriter.WriteStartElement("rss");
rsswriter.WriteAttributeString("version", "2.0");
rsswriter.WriteStartElement("channel");
rsswriter.WriteElementString("title", "عنوان سایت ");
rsswriter.WriteElementString("link", Request.Url.Host);
rsswriter.WriteElementString("description", "کمی توضیحات");
}

private void WriteRssBody(XmlTextWriter rsswriter, DataTable data)
{
foreach (DataRow rssitem in data.Rows)
{
rsswriter.WriteStartElement("item");
rsswriter.WriteElementString("title", rssitem[1].ToString());
rsswriter.WriteElementString("author", rssitem[2].ToString());
rsswriter.WriteElementString("link", rssitem[3].ToString());
rsswriter.WriteElementString("description", rssitem[4].ToString());
rsswriter.WriteElementString("pubDate", rssitem[5].ToString());
rsswriter.WriteEndElement();
}
}

private void WriteRssEnding(XmlTextWriter rsswriter)
{
rsswriter.WriteEndElement();
rsswriter.WriteEndElement();
}

private DataTable GetDateSet()
{
DataTable ArticlesRssTable = new DataTable();

string strconn = ConfigurationManager.ConnectionStrings["YourConnectionStringName"].ConnectionString;
SqlConnection conn = new SqlConnection(strconn);
string strsqlquery = "SELECT * FROM [Articles]";

SqlDataAdapter da = new SqlDataAdapter(strsqlquery, conn);
da.Fill(ArticlesRssTable);

return ArticlesRssTable;
}

موفق باشید

سلام

من کد شما را استفاده کردم اما به دو خط زیر error می ده :



rsswriter.WriteElementString("description", rssitem[4].ToString());
rsswriter.WriteElementString("pubDate", rssitem[5].ToString());


ارور هم cannot find column 4 هست .

زمانی که این دو خط را پاک می کنم درست می شود و تنها عناوین خبر نشان داده می شه نه لینک هستند و نه متن خبر هست . کوئری هم به شکل زیر هست :



string strsqlquery = "SELECT * FROM [tbl_news]";


ممنون می شم راهنمایی کنید که عناوین لینک بشن و توضیحات هم داشته باشند خانه های دیتابیسم هم id , subject ,body , date هستند .

با تشکر

Mostafa_Dindar
پنج شنبه 26 اسفند 1389, 20:50 عصر
سلام
یه سوال.اگه از کد بالا یعنی page load استفاده نکنم مشکلی پیش میاد؟؟
اگه استفاده کنم باید فایل xml در برنامم اضافه کنم؟؟

ممنون میشم اگه توضیح مختصری بدین.

سلام ،

ما در کل 3 متد اصلی داریم ، Opening , Body و Ending که بیشتر کار در Body صورت میگیرید . باید در رویداد لود اون سند XML رو ایجاد و Response کنید . ولی میتونید Refactor کنید همه رو داخل یک متد دیگر قرار دهید و اون متد رو در رویداد لود فراخوانی کنید

WriteRssOpening(rsswriter);

WriteRssBody(rsswriter, ArticlesRssTable);

WriteRssEnding(rsswriter);


سلام

من کد شما را استفاده کردم اما به دو خط زیر error می ده :



rsswriter.WriteElementString("description", rssitem[4].ToString());
rsswriter.WriteElementString("pubDate", rssitem[5].ToString());


ارور هم cannot find column 4 هست .


زمانی که این دو خط را پاک می کنم درست می شود و تنها عناوین خبر نشان داده می شه نه لینک هستند و نه متن خبر هست . کوئری هم به شکل زیر هست :



string strsqlquery = "SELECT * FROM [tbl_news]";


ممنون می شم راهنمایی کنید که عناوین لینک بشن و توضیحات هم داشته باشند خانه های دیتابیسم هم id , subject ,body , date هستند .

با تشکر






دوست من ، شما باید مقادیر عنوان ، نویسنده ، آدرس ، توضیحات و تاریخ انتشار رو بدید ، حال من در کوئری

SELECT * FROM [Articles]

فرض کردم که اینها در جدول شما موجود است . در صورتی تعدادی از اون فیلدها در جدول شما وجود ندارد میتونید یه صورت ثابت مقدار دهی کنید و لازم نباشد که از دیتابیس بخوند . مثلا تصور کنید که فیلد نویسنده ندارید در اینصورت :

به جای
rsswriter.WriteElementString("author", rssitem[2].ToString());
بنویسید :
rsswriter.WriteElementString("author","جیکوب");

jaykob
جمعه 27 اسفند 1389, 20:05 عصر
سلام ،

ما در کل 3 متد اصلی داریم ، Opening , Body و Ending که بیشتر کار در Body صورت میگیرید . باید در رویداد لود اون سند XML رو ایجاد و Response کنید . ولی میتونید Refactor کنید همه رو داخل یک متد دیگر قرار دهید و اون متد رو در رویداد لود فراخوانی کنید

WriteRssOpening(rsswriter);

WriteRssBody(rsswriter, ArticlesRssTable);

WriteRssEnding(rsswriter);



دوست من ، شما باید مقادیر عنوان ، نویسنده ، آدرس ، توضیحات و تاریخ انتشار رو بدید ، حال من در کوئری

SELECT * FROM [Articles]

فرض کردم که اینها در جدول شما موجود است . در صورتی تعدادی از اون فیلدها در جدول شما وجود ندارد میتونید یه صورت ثابت مقدار دهی کنید و لازم نباشد که از دیتابیس بخوند . مثلا تصور کنید که فیلد نویسنده ندارید در اینصورت :

به جای
rsswriter.WriteElementString("author", rssitem[2].ToString());
بنویسید :
rsswriter.WriteElementString("author","جیکوب");

سلام با تشکر از راهنمایی شما

آقای دیندار متوجه مطلب شدم اما امکانش هست در رابطه با اینکه لینک و توضیحات هر خبر که در زیرش قرار می گیره راهنمایی کنید خیلی دستکاریش کردم اما نشد . فیلد های دیتابیسم هم بالا خدمتتون گفتم

با تشکر

Mostafa_Dindar
شنبه 28 اسفند 1389, 00:11 صبح
سلام با تشکر از راهنمایی شما

آقای دیندار متوجه مطلب شدم اما امکانش هست در رابطه با اینکه لینک و توضیحات هر خبر که در زیرش قرار می گیره راهنمایی کنید خیلی دستکاریش کردم اما نشد . فیلد های دیتابیسم هم بالا خدمتتون گفتم

با تشکر

کد خیلی واضح و Self Document هست . من تعجب میکنم ...

اگر با RSS آشنا باشید باید استاندارهای اون رو رعایت کنید . یک سند استاندارد RSS باید یکسری فیلدها رو داشته باشد که من در کد آوردم ، برای آشنایی با RSS لطفا این مقاله رو مطالعه بفرمائید (http://www.mnot.net/rss/tutorial/).

من در رشته کوئری میتونستم به جای :

SELECT * FROM Articles

اینطور بنویسم که واضحتر باشد :

SELECT CreatedByUser, CreatedDate, Title, Description FROM Articles

من فرض کردم که شما همه اونها رو در کوئری خودتون دارید ، حال اگر ندارید ، مشکلی نیست ، به جای اینکه از دیتابیس بخونید ، ثابت مقدار دهی کنید .

در رابطه با
rsswriter.WriteElementString("author", rssitem[2].ToString());

من از اندیس 2 RssItem برای Author یا نویسنده استفاده کردم ، چون ستون سوم من ( اندیس از صفر شروع میشود ) در کوئری برای نویسنده بود .

jaykob
شنبه 28 اسفند 1389, 09:49 صبح
کد خیلی واضح و Self Document هست . من تعجب میکنم ...

اگر با RSS آشنا باشید باید استاندارهای اون رو رعایت کنید . یک سند استاندارد RSS باید یکسری فیلدها رو داشته باشد که من در کد آوردم ، برای آشنایی با RSS لطفا این مقاله رو مطالعه بفرمائید (http://www.mnot.net/rss/tutorial/).

من در رشته کوئری میتونستم به جای :

SELECT * FROM Articles

اینطور بنویسم که واضحتر باشد :

SELECT CreatedByUser, CreatedDate, Title, Description FROM Articles

من فرض کردم که شما همه اونها رو در کوئری خودتون دارید ، حال اگر ندارید ، مشکلی نیست ، به جای اینکه از دیتابیس بخونید ، ثابت مقدار دهی کنید .

در رابطه با
rsswriter.WriteElementString("author", rssitem[2].ToString());

من از اندیس 2 RssItem برای Author یا نویسنده استفاده کردم ، چون ستون سوم من ( اندیس از صفر شروع میشود ) در کوئری برای نویسنده بود .

ممنون از راهنماییتون مشکل توضیحات و لینک و ... حل شد فقط تاریخ و نام نویسنده را نمی آره من کدم به این شکل هست :


rsswriter.WriteStartElement("item");
rsswriter.WriteElementString("title", rssitem[1].ToString());
rsswriter.WriteElementString("author", علی ");
rsswriter.WriteElementString("link","http://www.mysite.com/viewitem.aspx?Item=" + rssitem[0].ToString());
rsswriter.WriteElementString("description", rssitem[2].ToString());
rsswriter.WriteElementString("pubDate", rssitem[3].ToString());
rsswriter.WriteEndElement();


در این کد عنوان به همراه توضیحات نشان داده می شود که عنوان هم به درستی لینک شده . فقط نام نویسنده و تاریخ را نشان نمی دهد . دیتابیس من هم به ترتیب به شکل زیر است :


id >> int
subject >>ntext
body >> ntext
date >> date


خیلی ممنون از راهنماییتون