PDA

View Full Version : حرفه ای: استفاده از Xml سایت Weather.Ir برای نمایش آب و هوا در سایت؟!



hamid1988
چهارشنبه 11 آذر 1388, 18:31 عصر
دوستان عزیز، میخام آب و هوای شهرهای مختلف رو در سایتم نشان بدم (مثل تصویر زیر)، اما با نحوه ی کار با Xml وبسایت Weather.Ir آشنا نیستم، لطفاَ راهنمایی کنید...
http://www.barnamenevis.org/forum/attachment.php?attachmentid=39643&d=1257872664
مرسی

mehdi.mousavi
چهارشنبه 11 آذر 1388, 19:27 عصر
دوستان عزیز، میخام آب و هوای شهرهای مختلف رو در سایتم نشان بدم (مثل تصویر زیر)، اما با نحوه ی کار با Xml وبسایت Weather.Ir آشنا نیستم، لطفاَ راهنمایی کنید... مرسی

سلام.
این سایت Web Service ای برای اینکار در اختیارتون قرار میده، یا میخواهید اطلاعات رو از روی صفحات وب این سایت، (یواشکی) بردارید؟

hamid1988
چهارشنبه 11 آذر 1388, 19:50 عصر
این سایت Web Service ای برای اینکار در اختیارتون قرار میده، یا میخواهید اطلاعات رو از روی صفحات وب این سایت، (یواشکی) بردارید؟
خود سایت Rss در اختیار وبمسترها قرار میده (این لینک (http://www.weather.ir/farsi/RSS/xml.asp))، مشکل من نحوه ی استفاده از این Rss در سایتمه!

mehdi.mousavi
چهارشنبه 11 آذر 1388, 23:40 عصر
خود سایت Rss در اختیار وبمسترها قرار میده (این لینک (http://www.weather.ir/farsi/RSS/xml.asp))، مشکل من نحوه ی استفاده از این Rss در سایتمه!

سلام.
میتونید بدین روش عمل کنید:


XmlDocument doc = new XmlDocument();
doc.Load("http://www.weather.ir/farsi/RSS/xml.asp");

foreach (XmlNode node in doc.SelectNodes("//row"))
{
string stationNr = node["StationNo"].InnerText;
string city = node["fcity"].InnerText;
int? temperature = string.IsNullOrEmpty(node["Tmp"].InnerText) ? null : (int?)Convert.ToInt32(node["Tmp"].InnerText);

//Your code goes here...
}


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

موفق باشید.

hamid1988
پنج شنبه 12 آذر 1388, 00:09 صبح
دوست عزیز دستتون درد نکنه، ولی من میخام عین تصویری که گذاشتم آب و هوا را نشون بدم!

mehdi.mousavi
پنج شنبه 12 آذر 1388, 00:25 صبح
دوست عزیز دستتون درد نکنه، ولی من میخام عین تصویری که گذاشتم آب و هوا را نشون بدم!

متوجه نمیشم! کدوم تصویر؟؟؟ من تصویری نمی بینم!

شما باید از RSS دما و دیگر اطلاعات رو استخراج کنید، بعد دیگه هر طوری مایل بودید میتونید به کاربر نشون بدید.

hamid1988
پنج شنبه 12 آذر 1388, 00:38 صبح
کدوم تصویر؟؟؟ من تصویری نمی بینم!

تصویر رو گذاشتم، اگه دیده نمیشه دوباره ضمیمه کردم!

mehdi.mousavi
پنج شنبه 12 آذر 1388, 11:06 صبح
تصویر رو گذاشتم، اگه دیده نمیشه دوباره ضمیمه کردم!
ای داد بیداد! اینکه دیگه کاری نداره. شما چند تا عکس (مثلا 32x32) واسه خودتون پیدا (یا طراحی) کنید. سپس، یه کنترل بسازید و درونش یک DropDownList قرار بدید. وقتی SelectedIndexChanged فراخوانی شد (سمت سرور)، میتونید از RSS ای که یکبار اول صبح گرفتید و سمت سرور خودتون Cache کردید، شهر مورد نظر رو پیدا کنید و بسته به Curr_weather که "ابری"، "آفتابی" و ... می تونه باشه، عکسی رو که ساختید (بهمراه دمایی که باز از RSS گرفته شده) به Client برگردونید. Cache خودتون رو هم در زمان مشخصی از روز، Update می کنید...

موفق باشید.

hamid1988
پنج شنبه 12 آذر 1388, 12:00 عصر
من از کد زیر برای برای پر کردن DropdownList استفاده می کنم، حالا چطوری وقتی SelectedIndexChanged اتفاق افتاد، دمای شهر مورد نظر و Curr_weather رو پیدا کنم؟!

if (city != string.Empty) { ddlCity.Items.Add(city);}

mehdi.mousavi
پنج شنبه 12 آذر 1388, 12:35 عصر
من از کد زیر برای برای پر کردن DropdownList استفاده می کنم، حالا چطوری وقتی SelectedIndexChanged اتفاق افتاد، دمای شهر مورد نظر و Curr_weather رو پیدا کنم؟!

سلام.
یا کدی رو که نوشتم متوجه نشدید، یا دارید سر به سرم میذارید! اگر RSS ای که لینکش رو دادید رو بدقت نگاه کنید، المنتی بنام fcity داره که نام شهر در اون ذکر شده. شما می تونید با نوشتن یک XPATH ساده اون Element رو براحتی بدست آورده و اطلاعات مورد نظر رو از اون نود استخراج کنید. تازه، وقتی که یکبار RSS رو خوندید، میتونید اونو در یک Data Structure مناسبتر نگهداری کنید تا بشه با اسم شهر عناصرش رو Index کرد و براحتی به جواب رسید...

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

موفق باشید.

hamid1988
پنج شنبه 12 آذر 1388, 12:50 عصر
یا کدی رو که نوشتم متوجه نشدید، یا دارید سر به سرم میذارید!
نه دوست عزیز! همچین جسارتی نمی کنم!


دقیقا بگید مشکلتون با این چیزهایی که گفتم چیه
واقعیتش اینه که من قبلاَ با Xml کار نکردم، و این چیزایی که شما میگید برام تازگی داره!:ناراحت:


شما می تونید با نوشتن یک XPATH ساده اون Element رو براحتی بدست آورده و اطلاعات مورد نظر رو از اون نود استخراج کنید. تازه، وقتی که یکبار RSS رو خوندید، میتونید اونو در یک Data Structure مناسبتر نگهداری کنید تا بشه با اسم شهر عناصرش رو Index کرد و براحتی به جواب رسید...

اگه لطف کنید، کدش رو بزارید ممنون میشم:قلب:
بازم ممنون!

mehdi.mousavi
جمعه 20 آذر 1388, 00:03 صبح
اگه لطف کنید، کدش رو بزارید ممنون میشم بازم ممنون!

سلام.
چون قول داده بودم که این کد رو براتون بنویسم، اینکارو کردم. شما ابتدا فایل cs ای تحت نام WeatherService در پروژه ایجاد کرده و کد زیر رو در اون قرار بدید:


using System;
using System.Collections.Generic;
using System.Web;
using System.Xml;

/// <summary>
/// Represents the wind direction.
/// </summary>
public enum WindDirectionEnum
{
/// <summary>
/// Indicates the south-west direction.
/// </summary>
SouthWest = 0,

/// <summary>
/// Indicates the south direction.
/// </summary>
South,

/// <summary>
/// Indicates the south-east direction.
/// </summary>
SouthEast,

/// <summary>
/// Indicates the north-west direction.
/// </summary>
NorthWest,

/// <summary>
/// Indicates the north direction.
/// </summary>
North,

/// <summary>
/// Indicates the north-east direction.
/// </summary>
NorthEast,

/// <summary>
/// Indicates a steady direction.
/// </summary>
Normal,

/// <summary>
/// Indicates the east direction.
/// </summary>
East,

/// <summary>
/// Indicates the west direction.
/// </summary>
West
}

/// <summary>
/// Represents the wind status.
/// </summary>
public enum WindStatusEnum
{
/// <summary>
/// Indicates the MehAlood status.
/// </summary>
MehAlood = 0,

/// <summary>
/// Indicates the RagbarBarf status.
/// </summary>
RagbarBarf,

/// <summary>
/// Indicates the GhesmatiAbri status.
/// </summary>
GhesmatiAbri,

/// <summary>
/// Indicates the MeheRaghigh status.
/// </summary>
MeheRaghigh,

/// <summary>
/// Indicates the KamiAbri status.
/// </summary>
KamiAbri,

/// <summary>
/// Indicates the ToofanVaGardoKhak status.
/// </summary>
ToofanVaGardoKhak,

/// <summary>
/// Indicates the GhobarAlood status.
/// </summary>
GhobarAlood,

/// <summary>
/// Indicates the GhobareMahalli status.
/// </summary>
GhobareMahalli,

/// <summary>
/// Indicates the AfzayesheAbr status.
/// </summary>
AfzayesheAbr,

/// <summary>
/// Indicates the RagbareBaran status.
/// </summary>
RagbareBaran,

/// <summary>
/// Indicates the BaresheBaran status.
/// </summary>
BaresheBaran,

/// <summary>
/// Indicates the BaresheBarfVaBaran status.
/// </summary>
BaresheBarfVaBaran,

/// <summary>
/// Indicates the Abri status.
/// </summary>
Abri,

/// <summary>
/// Indicates the NimeAbri status.
/// </summary>
NimeAbri,

/// <summary>
/// Indicates the Saf status.
/// </summary>
Saf,

/// <summary>
/// Indicates the BaresheBarf status.
/// </summary>
BaresheBarf
}

/// <summary>
/// Represents a class that holds the weather information associated with a given station .
/// </summary>
public class WeatherStation
{
/// <summary>
/// Initializes a new instance of the WeatherStation class.
/// </summary>
public WeatherStation()
{
}

/// <summary>
/// Gets or sets the Id field of the Weather Station.
/// </summary>
public int Id { get; set; }

/// <summary>
/// Gets or sets the City associated with the station.
/// </summary>
public string City { get; set; }

/// <summary>
/// Gets or sets the DateTime that the sample is taken.
/// </summary>
public DateTime DateTime { get; set; }

/// <summary>
/// Gets or sets the Temperature measure in the station.
/// </summary>
public int? Temperature { get; set; }

/// <summary>
/// Gets or sets the Wind Speed.
/// </summary>
public int? WindSpeed { get; set; }

/// <summary>
/// Gets or sets one of the predefined <see cref="WindDirectionEnum"/> values.
/// </summary>
public WindDirectionEnum? WindDirection { get; set; }

/// <summary>
/// Gets or sets the current wind status of the station.
/// </summary>
public WindStatusEnum? WindStatus { get; set; }
}

/// <summary>
/// Provides a utility class that handles weather-oriented services.
/// </summary>
public class WeatherService
{
/// <summary>
/// The cache slot's name used to cache the weather info.
/// </summary>
private const string WeatherStationCache = "WeatherStationCache";

/// <summary>
/// A synchronization object used to control the concurrent access to the object.
/// </summary>
private static object syncRoot = new object();

/// <summary>
/// The currently created instance of the class, if any.
/// </summary>
private static volatile WeatherService instance = null;

/// <summary>
/// A string array representing the different wind directions.
/// </summary>
private static string[] directions = new string[] { "جنوب غربي", "جنوبي", "جنوب شرقي", "شمال غربي", "شمالي", "شمال شرقي", "آرام", "شرقي", "غربي" };

/// <summary>
/// A string array representing the different wind status.
/// </summary>
private static string[] status = new string[] { "مه آلود", "رگبار برف", "قسمتي ابري", "مه رقيق", "كمي ابري", "توفان وگردوخاك", "غبارآلود", "غبارمحلي", "افزايش ابر", "رگبار باران", "بارش باران", "بارش باران وبرف", "ابري", "نيمه ابري", "صاف", "بارش برف" };

/// <summary>
/// Gets the current instance of the <see cref="WeatherService"/>.
/// </summary>
public static WeatherService Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
{
instance = new WeatherService();
}
}
}

return instance;
}
}

/// <summary>
/// Gets a strongly-typed collection of <see cref="WeatherStation"/> objects.
/// </summary>
/// <returns>A strongly-typed collection of <see cref="WeatherStation"/> objects.</returns>
public List<WeatherStation> GetWeatherStationsInfo()
{
List<WeatherStation> list = HttpContext.Current.Cache[WeatherStationCache] as List<WeatherStation>;
if (list == null)
{
XmlDocument doc = new XmlDocument();
doc.Load("http://www.weather.ir/farsi/RSS/xml.asp");

list = new List<WeatherStation>();
foreach (XmlNode node in doc.SelectNodes("//row"))
{
WeatherStation station = new WeatherStation();
station.Id = int.Parse(node["StationNo"].InnerText);
station.City = node["fcity"].InnerText;
station.DateTime = DateTime.Parse(node["DateTime1"].InnerText);
station.Temperature = string.IsNullOrEmpty(node["Tmp"].InnerText) ? null : (int?)int.Parse(node["Tmp"].InnerText);
station.WindSpeed = string.IsNullOrEmpty(node["WindSpeed"].InnerText) ? null : (int?)int.Parse(node["WindSpeed"].InnerText);
station.WindDirection = string.IsNullOrEmpty(node["windir"].InnerText) ? null : (WindDirectionEnum?)FindIndex(directions, node["windir"].InnerText);
station.WindStatus = string.IsNullOrEmpty(node["Curr_weather"].InnerText) ? null : (WindStatusEnum?)FindIndex(status, node["Curr_weather"].InnerText);

list.Add(station);
}

HttpContext.Current.Cache.Insert(WeatherStationCac he, list, null, DateTime.Now.AddMinutes(10), TimeSpan.Zero);
}

return list;
}

/// <summary>
/// Gets the zero-based index of an element in a given string array.
/// </summary>
/// <param name="array">The string array to search.</param>
/// <param name="searchString">The string to find.</param>
/// <returns>A zero-based index of an element in a given array.</returns>
private int FindIndex(string[] array, string searchString)
{
for (int i = 0; i < array.Length; i++)
{
if (array[i] == searchString)
return i;
}

throw new InvalidOperationException();
}
}

سپس، در صفحه ای که DropDownList خودتون رو گذاشتید، کد زیر رو بنویسید:

/// <summary>
/// Occurs when the selection from the list control changes between posts to the server.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The event data.</param>
protected void ddlCity_SelectedIndexChanged(object sender, EventArgs e)
{
string selectedCity = this.ddlCity.SelectedValue;
if (string.IsNullOrEmpty(selectedCity))
return;

List<WeatherStation> stations = WeatherService.Instance.GetWeatherStationsInfo();
Debug.Assert(stations != null && stations.Count > 0);

WeatherStation ws = stations.Find(delegate(WeatherStation station) { return station.City == selectedCity; });
if (ws != null)
{
if (ws.WindStatus != null)
{
string imagePath = string.Format("/images/{0}.png", ws.WindStatus.Value);
//Now let's show the picture.
}
}
}


بعد، کافیه تا فایلهای PNG ای در شاخه images با اسامی زیر ایجاد کنید:

MehAlood.png، RagbarBarf.png و ... (این اسامی رو می تونید از enum موجود در کد بردارید)و بعد همانطوریکه می بینید، در Handler فوق، یک string بنام imagePath درست کردم که مسیر به فایل .png رو در اون قرار میدم. از اینجا به بعدش هم که معلومه. اسم فایل رو که دارید و میتونید براحتی تصویر مورد نظر رو load کنید. (البته روش درست استفاده از css sprites هاست. شما می تونید یک png تشکیل بدید و در css هر یک رو تعریف کنید. اگر پروژه رو من قرار بود انجام بدم، حتما اینکارو میکردم).

موفق باشید.

پاورقی:


کد مزبور با توجه به StyleCop مایکروسافت نوشته شده تا دیگران نیز با روش صحیح نوشتن کد آشنا بشن.
خودتون باید error-handling کد رو به کد من اضافه کنید.
کد فوق اطلاعات رو برای دفعه اول از URL ای که دادید میگیره. سپس اطلاعات رو برای 10 دقیقه Cache میکنه. تو این 10 دقیقه دیگه سراغ سرور نمیره و از Cache موجود استفاده می کنه. شما باید این 10 دقیقه رو تغییر بدید و بعنوان مثال هر 24 ساعت یکبار بسراغ سرور برید. (چون شرایط آب و هوایی روزانه تغییر میکنه، نه 10 دقیقه یکبار).
جای XmlDocument میشد از DataSet و دیگر روشها استفاده کرد، اما من XmlDocument رو ترجیح میدم.

hamid1988
جمعه 20 آذر 1388, 11:23 صبح
دوست عزیز دستتون درد نکنه، خیلی ممنون!
کدها رو نوشتم و تصاویر Png رو هم آماده کردم و در پوشه ی images قرار دادم، حالا در Page_Load چی باید بنویسم تا DropDownList پر بشه؟

mehdi.mousavi
جمعه 20 آذر 1388, 12:10 عصر
دوست عزیز دستتون درد نکنه، خیلی ممنون! کدها رو نوشتم و تصاویر Png رو هم آماده کردم و در پوشه ی images قرار دادم، حالا در Page_Load چی باید بنویسم تا DropDownList پر بشه؟

پس شما با XML (بر خلاف گفته اتون) مشکل ندارید، با "برنامه نویسی" مشکل دارید:


List<WeatherStation> stations = WeatherService.Instance.GetWeatherStationsInfo();
Debug.Assert(stations != null && stations.Count > 0);

this.ddlCity.DataSource = stations;
this.ddlCity.DataValueField = "City";
this.ddlCity.DataBind();


فقط حواستون باشه که City ممکنه از سمت سرور empty ارسال بشه. این سرویس واقعا بدرد نخوره، چون حتی Schema ی XML رو هم بهتون نداده! ضمن اینکه باید "کاهش ابر" رو به enum و status array من اضافه کنید...

موفق باشید.

پاورقی: شما با خوندن کتاب و تمرین کردن برنامه نویس میشید، نه با ارسال درخواستهای پی در پی به انجمنها

hamid1988
جمعه 20 آذر 1388, 12:23 عصر
دوست عزیز خطا میده!
تصویر خطا رو براتون میزارم.

mehdi.mousavi
جمعه 20 آذر 1388, 12:51 عصر
دوست عزیز خطا میده! تصویر خطا رو براتون میزارم.

من راهنماییتون کردم، اما متاسفانه فقط شما حرف خودتون رو میزنید. در پست قبلی نوشتم:
ضمن اینکه باید "کاهش ابر" رو به enum و status array من اضافه کنید...

اینکارو کنید، اون ایراد پیش نمیاد!
موفق باشید.

hamid1988
جمعه 20 آذر 1388, 12:59 عصر
پاورقی: شما با خوندن کتاب و تمرین کردن برنامه نویس میشید، نه با ارسال درخواستهای پی در پی به انجمنها
چشم دوست عزیز، توصیتون رو حتماَ گوش میدم!:قلب:

hamid1988
جمعه 20 آذر 1388, 16:29 عصر
پروژه نمایش وضعیت آب و هوا را از لینک زیر می تونید دانلود کنید!
با تشکر از mehdi6755 (http://barnamenevis.org/forum/member.php?u=41233)که کدها رو نوشتند...

parsaman
پنج شنبه 24 دی 1388, 10:29 صبح
سلام دوست عزیز کد php (http://www.harajkar.ir) اگر بخواهیم کسی داره بذاره؟
یا لینک منبع بده؟

mehdi.mousavi
دوشنبه 05 بهمن 1388, 12:12 عصر
با سلام باز داستان تکراری این عجیب السایت برنامه نویس. نمی دونم چرا هنوز آمار بازدیدش بالا است؟ اینجا هیچکس جواب درست درمون نمیده یه کد میزارم امیدوارم بدرد بخوره :

سلام.
بستگی داره منظورتون از "درست درمون" چی باشه. بله. عموما اینجا کسی حوصله و وقت کد نوشتن برای دیگران رو نداره و دلیلی هم برای این کار وجود نداره! راستش رو بخواهید من تو Google Group یا Usenet های N سال پیش هم همچین چیزی رو ندیده بودم که کسی بخواد وقت بذاره و وجب وجب کد Submit کنه، بصرف اینکه مشکل کسی رو بخواد بر طرف کنه. اگر جایی رو سراغ دارید که اینکارو انجام میدن، خوب به اونجا برید و مشکلتون رو اونجا حل کنید.

پاورقی: شما حتی متوجه این مساله نشده اید که اینجا تالار ASP.NET هستش، نه PHP که این کد رو توش Submit کرده اید! وقتی آداب حضور در مجمعی رو رعایت نمی کنید، طبیعتا پاسخهایی از اون اجتماع خواهید گرفت که به مزاجتون سازگار نیست!

alibabaei2
سه شنبه 15 شهریور 1390, 19:08 عصر
با سلام
من با توجه به این کد ها می سازم اما وقتی صفحه رو باز می کنم این ارور رو میده
Operation is not valid due to the current state of the object

kadir_4
دوشنبه 04 مهر 1390, 19:29 عصر
با سلام من این پروژه رو با اجازه کمی اصلاح کردم و مشکل فوق رو حل کردم.براتون آپلود میکنم .

با معرفت
دوشنبه 28 اسفند 1391, 08:17 صبح
با عرض و تشکر از شما دوستان عزیز
ببخشید من وقتی برنامه اجرا می کنم این خطا را می دهد برای رفع این مشکل جه باید بکنم؟
The remote server returned an error: (404) Not Found.