PHP 5 و XML (قسمت دوم)
|
11-25-2013, 01:42 PM
ارسال: #1
|
|||
|
|||
PHP 5 و XML (قسمت دوم)
همانطور که در مطلب قبل مشاهده کرديد، پياده سازی اين روش تفسير اسناد XML به سادگی صورت نمی پذيرد و به همين دليل توسعه گران معدودی هستند که واقعا به SAX علاقه دارند و اکثرا تا صحبت از تفسير اسناد XML در يک پروژه می شود، آنها به دنبال راه های آلترناتيوی برای فرار از XML هستند. متاسفانه در PHP 4 راه ديگر تفسير XML - توسعه DOM - تا همين چند وقت پيش دارای مشکلات عديده ای بود که همين امر موجب میشد که DOM نتواند جايگزين مناسبی برای XML/SAX باشد. علاوه بر اين در SAX چون کار تفسير کاملا بر عهده کدهای PHP بود (از طریق توابعی که برای هر رویداد می نوشتیم) بنابراين سرعت عمل PHP کم می شد زيرا برخورد با هر تگ داخل سند XML مستلزم فراخوانی سه تابع است که هر يک بر اساس منطق تعيين شده، اطلاعاتی را جمع آوری می کنند. بنابراين با وجود چنين مشکلاتی، تعجب آور نيست که توسعه گران برای بهبود فرآيند تفسير در PHP 5 همت گماشته اند.
SimpleXML: تلاقی سادگی و کاربرد يکی از توسعه هايی که برای تفسير آسان و سريع اسناد XML طراحی شده، SimpleXML است. اين توسعه با تکيه بر امکانات جديد شی گرای PHP 5 فرآيند تفسير اسناد XML را تا حد امکان ساده کرده است. بر خلاف توسعه XML اين توسعه از DOM (که مخفف Document Object Model است) برای تفسير اسناد بهره می برد. اين بدان معناست که جهت پردازش یک سند می بایست تمام محتویات سند دریافت شود و تنها در این صورت است که یک درخت DOM که نشاندهنده ساختار سند است در حافظه شکل می گیرد. اين عمل برای اسناد کوچکی که حافظه زیادی نمی خواهند، تقريبا سريع است؛ حتی اگر اين سند روی يک سرويس دهنده دوردست(Remote) باشد. لکن وقتی با سند XML بزرگی سروکار داريم که حجم آن بالغ بر چندين مگابايت است، اين عمل به دليل حافظه گزاف مورد نياز، به کندی صورت می پذيرد. خوشبختانه، افرادی که با چنين فايلهای XML حجيمی سروکار دارند، زياد نيستند و در بيشتر موارد، چنين محدوديتی قابل قبول است. تفسير يک سند XML با استفاده از SimpleXML از اين ساده تر نمی شود. همانطور در که تکه کد پايين مشاهده می کنيد، اين عمل تنها با فراخوانی يک تابع صورت می پذيرد که فقط يک پارامتر ورودی که حاوی محتويات سند XML است می پذيرد. اگر محتویات سند XML در يک فايل بصورت Local يا Remote ذخيره شده باشد از تابع simplexml_load_file و اگر داخل يک متغير رشته کاراکتری باشد از تابع simplexml_load_string استفاده می کنيم. کد php: // Create XML object from a file مقدار برگشتی توابع ()*_simplexml_load يک آبجکت می باشد که حاوی داده های موردنظر است. به داده های اين آبجکت که هر فيلد XML در يک Property يا خصيصه جداگانه با نام منتاظر ذخيره شده، مانند ساير آبجکتها در PHP دسترسی خواهيم داشت. Attributeها يا خصايص هر تگ XML هم کليدهای آرايه فيلد XMLای می شوند که به آن تعلق دارند؛ به تکد کد پايين دقت کنيد، همه چيز روشن است. کد php: $s = '<xml><a>Value 1</a><b id="1">Value 2</b></xml>'; در مواقعی که چندین نمونه از يک فيلد موجود باشد، می توان از ساختار foreach برای پيمايش المنتهای XML بهره برد؛ مثل حالتی که عناصر يک آرايه را پيمايش می کنيم. هر داده داخل حلقه foreach به چشم يک آبجکت نگريسته می شود که باز هم به طرق قبلی می توان به مقادير تگ و نام و مقدار خصايص آن دسترسی داشت. ذکر این نکته ضروری ایست که با انکه ساختار foreach را در این زمینه بکار بردیم ولی نمی توان اکثر توابع آرایه ای PHP را بر روی آبجکتهایی که توسط SimpleXML ساخته می شود به کار برد. در تکه کد پایین، از امکان دیگر شی گرایی PHP 5 استفاده شده است. از آنجا که متغیر a$ در واقع یک آبجکت است، SimpleXML با بکارگیری متد خاص ()toString__ امکان «چاپ» آبجکت و مقدار داده ذخیره شده در آن را فراهم می کند. در PHP 4 این عمل، متن بیهوده ای چاپ می کرد که کاملا برخلاف خروجی مورد انتظار بود. بنابراین یکی از دلایلی که SimpleXML را نمی توان به PHP 4 انتقال داد ناتوانی Zend Engine 1 در پشتیبانی از عملکرد مورد نیاز این توسعه است. کد php: $s = '<xml><a>Value 1</a><a>Value 2</a></xml>'; امکان جذاب ديگر SimpleXML قابليت دسترسی به المنت خاصی از سند XML بدون نياز به پيمايش می باشد. در اصل، این کار به چند طریق قابل انجام است.ساده ترین و سریعترین روش، استفاده از ارجاعات آبجکتی غیرمستقیم برای آسان نمودن دسترسی به المنت موردنظر از درخت DOM است. نمونه کد زیر موجب چاپ مقدار دومین المنت a که خود داخل المنت c و c فرزندی از المنت b است، می شود. کد php: $s = '<xml><b><c><a>Value 1</a><a>Value 2</a></c></b></xml>'; SimpleXML به قدر کافی هوشيار است که چنين منظوری را برآورده سازد؛ وقتی کليد آرايه مقدار عددی باشد، در واقع من خواستار دسترسی به يک المنت خاص هستم و نه يک خصيصه المنت. نکته ديگری که بايد مدنظر داشته باشيد اينست که اگر بخواهید به المنتی که در سند موجود نيست، دسترسی بيابيد، SimpleXML هيچ پيغام هشدارگونه ای چاپ نمی کند. خروجی شما تنها مقدار تهی يا NULL خواهد بود. بنابراين، به منظور بررسی وجود يک المنت، بايد از ساختار()empty استفاده کنيد. حتی اگر به هر دليلی، مقدار المنت، خالی (Blank) باشد، در نهايت با يک آبجکت طرف حساب هستيد به اين معنا که ساختار ()empty مقدار False را برميگرداند که گواه از موجود بودن المنتی است. در قسمت سوم مقاله به بررسی XPath می پردازم. بنده را از نظرات، انتقادات و پيشنهادات خود آگاه بفرماييد. |
|||
|
کاربرانِ درحال بازدید از این موضوع: 3 مهمان