الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

قراءة ال Rss واستخلاص البيانات منها !

بدأه ريم111 في 13 يناير 2010 · 7 رد · 984 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدي استفسار فيما يخص الRSS

كيف هي الطريقه لبرمجه ملف يقوم بقراءة ملفات RSS ومن ثم استخلاص البيانات منها بعد ذلك نقوم ببرمجه لملف آخر يقوم بإظهار تلك البيانات بعدة لغات ؟؟!!

أتمنى منكم مساعدتي ... فأنا ألتمس الخبره منكم !!

#2

الأخت ريم111

السلام عليكم ورحمة الله وبركاته

بالنسبة لقراءة RSS Feed من موقع معين (والتي أيضا تسمى بالـ RSS Consumption) فهي عملية بسيط جدا. صدقي أو لا تصدقي أنه يمكنك أن تقومي بإستهلاك RSS Feed بسطر واحد فقط: وإليك المثال التالي:

XmlTextReader rssReader = new XmlTextReader(rss_url); // rss_url is a string

ولكن قبل أن تقومي بذلك أولا دعينا نتفق على أن الـ RSS Feed هي عبارة عن ملف XML، ولكي تستفيدي من ذلك يتحتم عليكي أن تعرفي ما هو تركيب هذا الملف. ولنفرض أننا نريد قراء ملف XML من RSS Feed معينة في موقع معين ونريد عرضها على GridView ولنفرض أننا سنقوم ببناء DataSet من ملف XML عن طريق الدالة DataSet.ReadXml الذي لديها عدة Overloading وأحدها يستقبل XmlTextReader كـ Parameter. أولا دعينا نفرض أننا نريد قراءة الملف التالي:

<rss version="1.0">
	<catalog>
        	 <product>
	             <price>5.95</price>
        	     <description>Custom printed stainless steel coffee mug</description>
	         </product>
        	 <product>
	             <price>119.95</price>
        	     <description>Natural maple bedside table</description>
	         </product>
		<product>
			<price>80.99</price>
			<description>Professional XML</description>
		</product>
	</catalog>
</rss>

عندما نقوم بقراءة ملف XML كالذي ذكر أعلاه داخل DataSet ستقوم الـ DataSet بإضافة DataTable لكل مستوى موجود في ملف الـ XML كما هو الحال في وضعنا هذا لو أفترضنا أن اسم الـ DataSet هو ds هذا سيؤول إلى أن

ds.Tables[0]

سيحوي فقط سطر واحد وهو عنصر الـ rss و

ds.Tables[1]

سيحوي فقط سطر واحد وهو عنصر الـ catalog وبالمثل

ds.Tables[2]

سيحوي عدد سطور عن كل عنصر product وهو في حالتنا هذه 3 سطور وهذا الذي نريده أن يظهر في الـ DataGrid.

والآن كل ما تبقى لدينا هو بناء GridView وربطها بملف الـ XML المتولد من الـ RSS Feed كالتالي :

<asp:GridView id="rssGridView" runat="server">
	<Columns>
                <asp:TemplateField HeaderText="Description">
                    <%# Eval("description") %>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Price">
                    <%# Eval("price") %>
                </asp:TemplateField>
	</Columns>
</asp:GridView>

ولتعبئة الـ GridView نقوم بكتابة الكود التالي في Page_Load

protected void Page_Load(object source, EventArgs e) 
{
	string rssFeedUrl = "Target RSS feed URL";
	DataSet rssDs = new DataSet();
	rssDs.ReadXml(new XmlTextReader(rssFeedUrl));

	rssGridView.DataSource = rssDs.Tables[2];
	rssGridView.DataBind();
}

تنويه :

إذا كنت تريدين عرض RSS Feed في صفحتك يجب مراعاة أنه في كل مرة سيتم عرض الصفحة سيتم طلب الـ RSS Feed وهذا تأثيرة لا يقتصر فقط على زوار الصفحة الخاصة بك، أيضاء يأثر على الـ Bandwidth لمالك الـ RSS Feed وأيضا لا ننسى أنه قد تكون الـ RSS Feed قديمة ولم يتم تحديثها بعد. لحل هذه المشكلة يمكننا عمل Caching للـ DataTable المراد عرضه في الـ GridView لكل 40 دقيقه، وهذه العملية بسيطة جدا ولكي نقوم بها سنعدل الكود المذكور أعلاه إلى

protected void Page_Load(object sender, EventArgs e)
    {
        DataTable rssDt = (DataTable)Cache["RSS_Feed"];
        if (rssDt == null)
        {
            rssDt = GetRSS("Target RSS feed URL");
            Cache.Insert("RSS_Feed", rssDt, null, DateTime.Now.AddMinutes(40), TimeSpan.Zero);
        }

        rssGeidView.DataSource = rssDt;
        rssGridView.DataBind();
    }

    protected DataTable GetRSS(string url)
    {
        DataSet rssDs = new DataSet();
        rssDs.ReadXml(new XmlTextReader(url));
        return rssDs.Tables[2];
    }

ولمزيد من المعلومات عن الـ Caching ارجوا إتباع الرابط التالي:

http://www.google.com/#hl=en&q=asp.net+caching&aq=f&aqi=g10&oq=&fp=df82d86320cf60e9

أرجوا أن يكون الشرح وافي وواضح وأتمنى لكي التوفيق

#3

الله يعطيك العافيه ماقصرت أخوي ...جعلها الله في ميزان حسناتك ...

ربما أعود بعد محاولات التطبيق :)

كل الشكر لك !!

#4

\طيب اخوي اسمح لي بسؤال ... مع التطبيق ماعرفت كيف اظهر ال image من ملفات rss

كيف اظهرها في موقعي بطريقه مرتبه .. !!

وهل فيه امكانيه لعرض البيانات مره باللغه العربيه ومره باللغه الانجليزيه مع العلم انها في الrss بالأنجلش

؟؟

#5

الأخت الكريمة / ريم

السلام عليكم ورحمة الله وبركاته

بالنسبة لقراءة صورة من ملف XML دعينا أولا نرا كيف يتم تخزين صورة داخل ملف XML، قد تكون مخزنه كشكل عنوان (Path) وهذا ما أعتقد أنه يجب أن يكون، وفي هذه الحالة كل ما عليكي فعله هو أخذ هذا الرابط ووضحه في الـ SRC Attribute للـ Image Tag كما في المثال التالي

<Columns>
	<asp:TemplateField HeaderText="What Ever">
		<ItemTemplate>
			<img border="0" src='<%# Eval("image_field_name") %>' />
		</ItemTemplate>
	</asp:TemplateField>

	.....
</Columns>

وقد يتم تخزين الصورة داخل ملف الـ XML كـ Base64String ولكن انا لا أعتقد أن هذه الطريقه تكون مجدية وذلك لسبب بسيط جدا وهو أن حجم ملف الـ XML سيكون كبيرا فعلا ولقد تأكد من ذلك بنفسي حيث أنني خزنت صورة واحده فقط بحجم 9 KB داخل ملف XML وأصبح حجم الملف 22 KB. عموما لأخذ صورة من ملف XML مخزنه على صيغة Base64String، ينبغي علينا تحويلها من Base64String إلى byte[] ومن ثم وضعها في Stream ومن ثم ننشيء الصورة بمساعدة Image.From كما هو موجود في المثال التالي

public Image ImageFromBase64String(string base64String)
{
	byte[] buffer = Convert.FromBase64String(base64String);
	MemoryStream ms = new MemoryStream(buffer);
	return Image
}

ولكن هناك مشكلة وهي أن الـ HTML Image و System.Web.UI.WebControls.Image لا يمكنهم عرض صورة من Stream أو byte[]. أفضل رهان لكي هنا هو أن تقومي بإستخدام Response.BinaryWrite في صفحة أخرى بحيث أن عنون أو Image SRC Attribute أو System.Web.UI.WebControls.Image.ImageUrl يدلون إلى هذه الصفحة، ولنفرض أن هذه الصفحة اسمها showImage.aspx، ولكن يجب تضمين ID في الـ Query String بحيث يمكننا تحديد ماهي الصورة التي نود عرضها يحث يكون الكود في صفحة showImage.aspx في حدث Page_Load كالتالي :

protected void Page_Load(object sender, EventArgs e)
    {
        if (Request["ID"] != null)
        {
            string id = Request["ID"];
            string base64String = null;

            /*
             * Here you should write some code to snap the Base64String of the required image
             * let us assume that we already did it and we have stored it in base64String variable
             */


            byte[] buffer = Convert.FromBase64String(base64String);

            Response.ContentType = "iamge/jpeg";
            Response.BinaryWrite(buffer);
        }
    }

وسيكون الكود في الصفحة التي يتم فيها عرض الصور كالتالي

<Columns>
	<asp:TemplateField HeaderText="What Ever">
		<ItemTemplate>
			<img border="0" src='showImage.aspx?ID=<%#  Eval("Item_ID_or_ID") %>' />
		</ItemTemplate>
	</asp:TemplateField>

	.....
</Columns>

اما بالنسبة لعرض البيانات بلغتين مختلفتين فهذا يسمى بالـ Localization ويمكنك رؤية هذا المثال

http://www.codeproject.com/KB/aspnet/localization_websites.aspx

ولكن لو كانت البيانات المراد عرضها بلغتين مختلفة عبارة عن عملات أو تاريخ فربما ينبغي عليكي رؤية هذا الموضوع

/index.php?showtopic=211758

أتمنى أن أكون قد أصبت الوتر المطلوب وأتمنى لك التوفيق

#6

اخوي الله يجزاك خير ... ماقصرت !! تعبتك معي

جربت الطريقه الأولى بس ما اعرف ليش ماضبطت ...؟؟!!! هذا كود ال xml فيه ال CDATA أسفل ال <description>

هذا أبغى اظهره على شكل image وهو يظهر على شكل كود ... ؟!!

<item>
  <title>Conditions for Riyadh, SA at 5:00 pm AST</title> 
  <geo:lat>24.65</geo:lat> 
  <geo:long>46.71</geo:long> 
  <link>http://us.rd.yahoo.com/dailynews/rss/weather/Riyadh__SA/*http://weather.yahoo.com/forecast/SAXX0018_c.html</link> 
  <pubDate>Sat, 16 Jan 2010 5:00 pm AST</pubDate> 
  <yweather:condition text="Fair" code="34" temp="23" date="Sat, 16 Jan 2010 5:00 pm AST" /> 
- <description>


[*] <![CDATA[ 
[*]<img src="http://l.yimg.com/a/i/us/we/52/34.gif"/><br />
[*]<b>Current Conditions:</b><br />
[*]Fair, 23 C<BR />
[*]<BR /><b>Forecast:</b><BR />
[*]Sat - Mostly Clear. High: 24 Low: 9<br />
[*]Sun - Mostly Sunny. High: 26 Low: 9<br />
[*]<br />
[*]<a href="http://us.rd.yahoo.com/dailynews/rss/weather/Riyadh__SA/*http://weather.yahoo.com/forecast/SAXX0018_c.html">Full Forecast at Yahoo! Weather</a><BR/><BR/>
[*](provided by <a href="http://www.weather.com" >The Weather Channel</a>)<br/>

  </description>
  <yweather:forecast day="Sat" date="16 Jan 2010" low="9" high="24" text="Mostly Clear" code="33" /> 
  <yweather:forecast day="Sun" date="17 Jan 2010" low="9" high="26" text="Mostly Sunny" code="34" /> 
  <guid isPermaLink="false">SAXX0018_2010_01_16_17_00_AST</guid> 
     </item>

هذا الكود اللي كتبته ... أنا غير ملمه باللغه وهذا ثاني برنامج لي فيها !! فمعليش اذا كان فيه خطأ تافه هو سبب للمشكله :blush:

    Dim NewsItem As System.Xml.XmlNodeList = NewsDoc.SelectNodes("rss/channel/item")

        Dim title As String = ""
        Dim link As String = ""
        Dim description As String = ""
        Dim pubDate As String = ""
        Dim yweather As String = ""



        Dim CurrentNews As System.Xml.XmlNode
        For Each CurrentNews In NewsItem

            Dim rssdetail As System.Xml.XmlNode

'عنوان الطقس

            rssdetail = CurrentNews.SelectSingleNode("title")
            If Not IsNothing(rssdetail) Then
                title = rssdetail.InnerText

            Else
                title = ""
            End If

            rssdetail = CurrentNews.SelectSingleNode("yweather")
            If Not IsNothing(rssdetail) Then
                yweather = rssdetail.InnerText

            Else
                yweather = ""
            End If



            rssdetail = CurrentNews.SelectSingleNode("link")
            If Not IsNothing(rssdetail) Then
                link = rssdetail.InnerText
            Else
                link = ""
            End If

            'ملخص الطقس
            rssdetail = CurrentNews.SelectSingleNode("description")
            If Not IsNothing(rssdetail) Then
                description = rssdetail.InnerText
            Else
                description = ""
            End If

            rssdetail = CurrentNews.SelectSingleNode("pubDate")
            If Not IsNothing(rssdetail) Then
                pubDate = rssdetail.InnerText

            Else
                pubDate = ""
            End If



            RichTextBox1.Text += "  " & title & vbCrLf & vbCrLf
            RichTextBox1.Text += "  " & pubDate & vbCrLf & vbCrLf
            RichTextBox1.Text += "  " & link & vbCrLf & vbCrLf
            RichTextBox1.Text += "  " & description & vbCrLf & vbCrLf
            RichTextBox1.Text += "  " & yweather & vbCrLf & vbCrLf
            '     PictureBox1.Image =
#7

الأخت الكريمة / ريم

السلام عليكم ورحمة الله وبركاته

عندما تواجهين CDATA في ملف XML فأعرفي فورا أن هذا هو تمثيل الـ XML لـ Code معين، بمعنى آخر تخيلي أنكي تريدين أن تنشئي ملف XML يحوي على أكواد مختلفة بلغات برمجية مختلفة فكيف ستقومين بذلك ؟؟ ماذا لو كنت تريدين إستخدام رمز أكبر من "<" ؟

لهذا السبب وجد الـ CDATA وأعتقد أنها إختصار لـ Code DATA. فلو تلاحظي في الـ XML الذي وضعتيه في ردك الأخير

<description> 
[*] <![CDATA[ 
[*]<img src="http://l.yimg.com/a/i/us/we/52/34.gif"/><br />
[*]<b>Current Conditions:</b><br />
[*]Fair, 23 C<BR />
[*]<BR /><b>Forecast:</b><BR />
[*]Sat - Mostly Clear. High: 24 Low: 9<br />
[*]Sun - Mostly Sunny. High: 26 Low: 9<br />
[*]<br />
[*]<a href="http://us.rd.yahoo.com/dailynews/rss/weather/Riyadh__SA/*http://weather.yahoo.com/forecast/SAXX0018_c.html">Full Forecast at Yahoo! Weather</a><BR/><BR/>
[*](provided by <a href="http://www.weather.com" >The Weather Channel</a>)<br/>

  </description>

لاحظي أن الـ description هو عبارة عن كود HTML وفيه الصورة وعنوانها وكل المعلومات المطلوبه (ما قصر صاحب الـ RSS Feed) ، فكل ما عليك فعله لإظهار الصورة هو كتابتها كما هي بدون إستخدام صورة أو أي شيء آخر. في الواقع لو قمتي بنسخ محتوى الـ description ومن ثم ألصقتيه ف notepad ومن ثم خزنتيه بإمتداد html سيظهر لكي ما هو موجود في المرفقات. كل ما عليكي فعله بعد أن تقومي بربط ملف الـ XML بـ GridView هو التالي :

<columns>
	...

	<asp:TemplateField HeaderText="Description">
		<ItemTemplate>
			<%# Eval("description") %> // Just write it as it is, it's already an HTML code, no need for Image nor IMG
		</ItemTemplate>
	</asp:TemplateField>
</columns>

أتمنى لكي التوفيق

post-91978-12637097250665_thumb.jpg

1
#8

شكراً جزيلا اخي الكريم ...جعلها الله في ميزان حسناتك يارب

مواضيع مشابهة