۱۳۸۷/۰۸/۲۱

خواندن فيد گزارش آب و هواي ياهو با استفاده از روش Xml serialization


در مطلب قبلي (در مورد كتابخانه anti-xss مايكروسافت) از روش xml serialization براي خواندن فايل xml حملات استفاده كرديم.
ايجاد اين كلاس و نگاشت اشياء با توجه به ساختار ساده آن به صورت دستي و به‌سادگي انجام شد. اكنون به مثال زير دقت بفرمائيد:
سرويس آب و هواي ياهو براي شهرهاي مختلف ايران از طريق لينك زير قابل استفاده است:
http://weather.yahoo.com/regional/IRXX.html
اگر به صفحات شهرهاي مختلف مراجعه نمائيد، يك فيد rss هم مشاهده خواهيد كرد، براي مثال در مورد تهران داريم:
http://weather.yahooapis.com/forecastrss?p=IRXX0018&u=c
ساختار اين فايل xml تا حدودي با يك rss استاندارد تطابق دارد. اما اگر به سورس xml آن دقت كنيم تگ‌هاي ديگري را نيز مشاهده خواهيم كرد كه براي مثال دما ، تاريخ و شرايط جوي را به صورت دقيقي و با استفاده از اصول xml ارائه مي‌دهند.

<yweather:condition text="Partly Cloudy" code="29" temp="10" date="Tue, 11 Nov 2008 5:30 pm IRT" />

خوب، براي دريافت اين اطلاعات چه بايد كرد؟ يكي از روش‌هاي متداول براي كار با اين نوع داده‌ها، استفاده از كلاس DataSet در دات نت و فراخواني متد ReadXml آن است (يك آدرس اينترنتي را هم مي‌تواند دريافت كند). سپس مطابق روش‌هاي معمول ADO.Net مي‌توان به تگ‌ها ومقادير آنها دسترسي داشت.
روش‌ بالا هر چند مشكلي ندارد اما به زيبايي كار با خواص يك كلاس متناظر با آن فايل xml نيست. اما در اينجا براي استفاده از روش xml serialization يك مشكل وجود دارد! ايجاد دستي اين كلاس كه بيانگر عملكرد آن فايل xml است كار ساده‌اي نيست.
خوشبختانه به همراه SDK‌ دات نت فريم ورك 2، برنامه‌اي به نام xsd.exe نيز همراه است كه كار ايجاد يك كلاس cs يا vb را از يك فايل xml جهت اين منظور انجام مي‌دهد (اين برنامه براي مثال در مسير C:\Program Files\Microsoft.NET\SDK\v2.0\Bin قرار دارد).

براي ايجاد فايل كلاس به صورت خودكار از روي يك فايل xml موجود بايد به ترتيب زير عمل كرد:
الف) ايجاد فايل xsd متناظر (XML Schema Definition)
براي اينكار در خط فرمان تايپ كنيد:
xsd.exe file.xml

نكته 1:
روش ديگر انجام اين كار : فايل xml را در VS.net باز كنيد، از منوي بالاي صفحه گزينه xml را انتخاب نموده و بر روي دكمه Create Schema كليك كنيد.

ب) ايجاد فايل cs يا vb از روي فايل(هاي) xsd ايجاد شده
در اينجا براي فيد آب و هواي ياهو سه فايل xsd توليد خواهد شد. براي تبديل آنها به كلاس cs بايد دستور زير را در خط فرمان اجرا كرد:

Xsd.exe file_1.xsd file_2.xsd file_3.xsd /c

اين مورد نكته مهمي است و تنها اگر يكي از فايل‌ها اينجا ذكر شوند، كلاس ناقصي تشكيل خواهد شد. (براي نمونه فايل xssAttacks.xml مطلب قبلي، ساختار ساده‌اي داشته و تنها به يك فايل xsd ختم خواهد شد)

نكته 2:
براي انتخاب زبان VB (با توجه به اين‌كه پيش فرض آن CS است) مي‌توان به صورت زير عمل كرد:
xsd.exe file.xsd /c  /l:vb

نكته 3:
براي توليد فايل xsd ، از برنامه Infer.exe نيز مي‌توان استفاده كرد (خروجي نهايي دقيق‌تري را ارائه مي‌دهد). اين برنامه را از اينجا دريافت كنيد.

تصاوير زير مقايسه دو فايل كلاس نهايي توليد شده از xsd هاي اين دو برنامه است:






پس از طي اين مراحل فايل كلاس ما براي xml serialization آماده خواهد شد. مرحله بعد دريافت اطلاعات و نگاشت آن به اين كلاس توليد شده است:

public static rss DeserializeFromXML()
{
XmlSerializer deserializer =
new XmlSerializer(typeof(rss));
using (XmlReader reader = XmlReader.Create("http://weather.yahooapis.com/forecastrss?p=IRXX0018&u=c"))
{
return (rss)deserializer.Deserialize(reader);
}
}

كلاس rss از فيد xml و فايل‌هاي xsd آن كه توليد كرديم به صورت خودكار ايجاد شده است.
اكنون براي مثال خواندن وضعيت فعلي جوي از فيد دريافتي به سادگي زير است:

rss data = DeserializeFromXML();
MessageBox.Show(data.channel.item.condition.text);