خانه » ادوبی فلش » ذخیره کردن XML به صورت Binary

ذخیره کردن XML به صورت Binary

ذخیره کردن و بارگزاری و استفاده از فایل های متنی و XML در اکشن اسکریپت ۳ به صورت دو دویی (Binary) امکان جدیدی می باشد ، که برای فایل های خارجی با حجم بالا استفاده زیادی دارد.

فایل های XML طولانی می بایست به صورت run-time بارگزاری شود ، با ذخیره XML به صورت Binary شما می توانید اطلاعات را فشرده سازی (compress) کنید و فایل با حجم کمتری دریافت نمایید.

البته میزان فشرده سازی وابسته به پیچیدگی اطلاعات فایل شما می باشد ، اما این فشرده سازی به طور معمول بیشتر از ۵۰% انجام می شود.

مسلما استفاده از اطلاعات XML به صورت فشرده شده و در قالب Binary با روشی که به صورت ساده و در قالب متنی ، برای XML استفاده می شود متفاوت است. بنابراین شما می بایست قبل از شروع به کار تصمیم خود را در مورد پروژه خود بگیرید. ممکن هست اطلاعات سری و امنیتی به صورت خارجی دارید و یا اطلاعات دارید که می خواهید بدون نیاز به کد گذاری دوباره بتوانید آن را تغییر دهید،  و در عین حال ترجیح می دهید که محتوا برای انسان غیر قابل درک باشد ، در مرحله بعد به تبدیل محتوای متنی به دودویی می پردازیم.

تبدیل XML به دو دویی(Binary) توسط کلاس ByteArray :

ابتدا به این موضوع می پردازیم که چگونه اطلاعات XML را در یک ByteArray دخیره کنیم. در کد زیر ما قبلا اطلاعات XML را به صورت رشته متنی (String) در متغیری با نام xmlData قرار داده ایم. که می توانید این کار را یا توسط بارگزاری اطلاعات انجام دهید و یا از XML داخلی فلش استفاده نمایید.


var data:ByteArray = new ByteArray();
data.writeUTFBytes(xmlData); // xmlData فایل ایکس ام ال اصلی ما می باشد
data.compress();

با استفاده از این کدها ، هم اکنون متغیر data از نوع ByteArray شامل محتوای فشرده شده فایل XML به صورت دو دویی (Binary) می باشد.

ذخیره به صورت یک فایل :

حال شما اطلاعات Binary از نوع ByeArray را دارید ، شما می توانید آن را به صورت یک فایل خام ذخیره کنید ، برای این کار شما گزینه های زیر را پیش رو دارید:

۱ – ارسال به سرور و ذخیره اطلاعات توسط واسط سمت سرور.
۲ – استفاده از امکاناتی که Adobe Air در اختیار شما قرار می دهد برای ذخیره بر روی دیسک سخت.
۳ – استفاده از فلش پلیر ورژن ۱۰ برای ذخیره بر روی دیسک سخت.

در این آموزش ما گزینه ۳ را انتخاب می کنیم زیرا برای اکثر توسعه دهندگان فلش در دسترس می باشد و نیز با امکانات جدید فلش پلیر ۱۰ به بالا نیز بیشتر آشنا می شویم.

کلاسی می بایست برای این امر از آن استفاده کنیم flash.net.FileReference می باشد، متد (method) مربوطه به ذخیره FileRefrence.save() می باشد و به کاربر امکان دادن مسیر ذخیره فایل را می دهد ، با این امکان شما می توانید اطلاعات خود را مانند یک فایل بر روی سیستم کاربر ذخیره کنید ، البته برای ذخیره کاربر امکان تغییر نام و مسیر فایل مورد نظر شما را خواهد داشت و البته یک مزیت این روش مناسب بودن برای نمونه های تحت وب است.

به عنوان یک اقدام امنیتی فلش پلیر نتها در صورتی این دستور را اجرا می کند که شما آن را با تعیین یک رویداد به کاربر نمایش دهید مانند (رویداد MouseEvent.CLICK).  به هر حال شما نیاز دارید یک دکمه (button) ایجاد کنید و شنونده (listener) مربوطه به رویداد را به آن اضافه کنید و در تابع مربوطه متد save() را فراخوانی کنید


function on_buttonClick(evt:MouseEvent):void
{
	var data:ByteArray = new ByteArray();
	data.writeUTFBytes(xmlData);
	// xmlData فایل اصلی ایکس ام ال در قالب متنی;
	data.compress();
	new FileReference  .save(data, "bindata.xml");
}//"bindata.xml" نام پیش فرض

فرمان save() کادر محاوره ای باز می کند که شما می توانید نام فایل و محل ذخیره سازی را به دلخواه مشخص نمایید و بر روی سیستم ذخیره نمایید ، توجه داشته باشید با این که در این مورد ما پسوند فایل را xml قرار دادیم ولی این فایل با فرمت (extension) دو دویی (binary) تبدیل شده است و محتوای آن عملا دیگر برای انسان قابل فهم نمی باشد و در صورتی که با یک ویرایشگر متنی فایل را مشاهده نمایید محتوای آن تشکیل شده است از متون در هم ریخته که مفهومی ندارد و دلیل این امر نیز فشرده شدن و تبدیل به دودویی (binary) می باشد.

شما می توانید این فایل را در هر پسوند دیگری به صورت دلخواه نیز ذخیره کنید و از آن استفاده نمایید.

بارگزاری فایل XML دو دویی (Binary) :

حال شما فایلی دارید که به صورت دو دویی می باشد ولی محتوای آن فایل xml  شماست ، حال برای استفاده و بارگزاری آن شما می بایست از روش زیر استفاده کنید. در نهایت محتوای بارگزاری شده در فلش مانند فایل ساده ی xml بوده و تمامی دسترسی هایی که در زمان بارگزاری و استفاده از یک فایل xml ساده دارید را همچنان بدون هیچ محدودیتی در اختیار دارید.


var ldr:URLLoader = new URLLoader();
ldr.dataFormat = URLLoaderDataFormat.BINARY;// ** مطمئن شوید این خط کد را نوشته اید **
ldr.addEventListener(Event.COMPLETE, on_XML);
ldr.addEventListener(IOErrorEvent.IO_ERROR, on_XML);
ldr.load(new URLRequest(pathToXMLFile));

این کد برای بارگزاری فایل XML مانند یک فایل XML ساده می باشد ، تنها تفاوتی که وجود دارد در این می باشد که شما می بایست dataFormat را نیز تعیین نمایید و آن را برای فایل دو دویی به صورت URLLoaderDataFormat.BINARY مقدار دهی نمایید. حتی اگر شما این فایل را به صورت ساده بارگزاری کنید کد می بایست به درستی کار کند.

تبدیل فایل دو دویی(Binary) به XML توسط کلاس ByteArray :

بعد از این که بارگزاری داده های binary فایل XML ما انجام شد می بایست اطلاعات دو دویی را به اطلاعات متنی XML تبدیل نماییم.


var xmlData:XML;

function on_XML(evt:Event):void
{
	if (evt.type == Event.COMPLETE)
	{
		var data:* = URLLoader(evt.target).data;
		if (data is ByteArray)
		{
			try
			{
				ByteArray(data).uncompress();
			}
			catch (e:Error)
			{
			}
		}
		xmlData = XML(data);
	}
}

با کد بالا برنامه شما می تواند هر دو نوع فایل text XML و binary XML را دریافت کند ،شما می توانید این کد را حتی در زمانی که فایل XML شما فشرده شده و به صورت دو دویی نمی باشد نیز استفاده کنید. با این کار در صورتی که شما در زمانی تصمیم گرفتید که از اطلاعات XML به صورت فشرده شده Binary در برنامه خود استفاده کنید می توانید این کار را به راحتی و بدون هیچ تغییری انجام دهید و برنامه به درستی این نوع فایل را دریافت خواهد کرد.

در پایان توجه داشته باشید این روش را می توانید برای هر فایل متنی استفاده کنید و تنها برای فایل های XML نمی باشد.

موفق و پیروز باشید.

Print Friendly
تگ ها :
پیوند مطلب قبلی
پیوند مطلب بعدی

درباره بهروز پولادرگ

متولد : ۵ مرداد سال ۱۳۶۷ ، حرفه : ادوبی فلش ، برنامه نویسی و طراحی وب ، طراحی گرافیک ، مالتی مدیا ، نرم افزار های تحت وب

24 نظر

  1. با عرض سلام و خسته نباشید.مطالبتون خیلی مفیدن
    من کد بالا را خودم با فلش سی اس ۵ و فلش پلیر ۱۰ طبق بالا نوشتم
    و در موقع ذخیره هم از من ادرس می پرسد و من بهش ادرس میدم و فایل را هم ذخیره میکند و لی در موقع خواندن باینری. به من اطلاعات درون ان فایل باینری که XML من است را نمیدهد فقط اسم چیزی که در این قسمت نوشتم را میدهد.
    data.writeUTFBytes (date);
    ممنون میشم اگه راهنماییم کنید که دقیقا به جای date چی باید بنویسم

    •  var data:* = URLLoader(evt.target).data;

      در واقع data محتوای بارگزاری شده شما می باشد که همان طور که در مطلب معلوم هست می بایست با dataFormat به صورت BINARY بارگزاری شده باشد
      خط کد بالا از دستور بارگزاری که رویداد Event.COMPLETE به آن داده شده است محتوای بارگزاری شده را دریافت می کند.

      در مورد اول data.writeUTFBytes (xmlData); متغیر xmlData همان محتوا فایل XML متنی شما هست که می بایست با روش بارگزاری مورد دوم بدون نیاز به dataFormat مانند یک فایل xml ساده بارگزاری شود ؛ و بعد محتوا در xmlData قرار گیرد.

      موفق و پیروز باشید.

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

  3. سلام
    من می خواستم بدونم چطوری میشه از Save()
    استفاده کرد بطوری که savedialog باز نشه و به صورت اتوماتیک این کار انجام بشه ؟!
    راه دیگه ای برای ذخیره روی یه فایل هست ! ;یه مقداری رو به صورت اتوماتیک یجا ذخیره کرد (البته فقط با AS3)
    ممنون

  4. سلام
    یه سوال داشتم که خیلی جوابش برام مهمه!
    میخوام ببینم با filerefrence چطوری میشه یه فایل xml رو به صورتی ذخیره کرد که کادر محاوره ای که میپرسه کجا save کنه نماشی داده نشه! در واقع آدرس رو ما بهش بدیم. اگر فایل وجود داشت overwrite بشه اگرم نبود ایجاد بشه!
    ممنون میشم جوابمو بدید.

    • سلام
      با filerefrence نمی توان این کار را کرد ، باید اگر روی سرور هست توسط فرمان های ارسال داده به سمت سرور این کار را انجام دهید اگر برای اپلیکیشن روی سیستم می خواهید می بایست یا از Adobe Air استفاده کنید یا از برنامه های کاربردی مثل MDM Zinc…
      موفق و پیروز باشید

  5. سلام دوست من …. میشه یک مطلبی درج کنی درباره سایت یک مر.ر گر ساده صفحات وب رو با فلش باز کنه …. صفحه هات اچ تی ام ال ادرس بدی و مثل یک مرور گر باز کنه … .. …

    • سلام
      منظور شما را متوجه نشدم
      ولی اگر منظورتان فلش هست ، فلش محدود بوده و همه دستورات HTML را پستیبانی نمی کند و نمی تواند یک مرورگر باشد ، ولی Adobe Air این امکان را برای ساخت اپلیکیشن توسط فلش دارد
      موفق و پیروز باشید

  6. سلام
    به راهنمایی شما نیاز دارم:
    یه فایل xml دارم که مشخصات افراد رو با شماره ملی ذخیره میکنه
    میخوام وقتی یه نفر جدید رو اضافه کنم سرچ کنه داخل فایل و اگر اون شماره ملی قبلا وجود نداشته اجازه ی ثبت رو بده
    وگرنه خطا بده که قبلا در سیستم ثبت شده

    ِیه سرچ ساده در try نوشتم به این صورت:

    try
    {
    throw new Error(xmlCustomer.Customer. (@ id == txt4.text).childIndex());
    }
    catch (e:Error)
    {

    چون دستور داخل try اگر سرچ چیزی پیدا نمیکرد خطا میداد
    ولی در این حالت اگر هم قبلا مشخصات فردی ثبت نشده باشه باز دستورات داخل catch اجرا میشه!!
    خود دستور سرچ به تنهایی وقتی نوشته میشه خطا میده چون مشخصات رو نمیتونه پیدا کنه

    مشکل کجاست؟
    لطفا راهنمایی کنید
    ممنون

    • سلام

      به نظر بنده این روش به صورت کلی غلط هست می توانید با یک شرط مورد را برسی کنید در صورت عدم وجود دستور ثبت اجرا شود و غیر این صورت خطای مورد نظر خود را نمایش دهید

      موفق و پیروز باشید

  7. با سلام و خسته نباشید
    من میخام یک فایل xml رو بارگزاری کرده اونو ویرایش و بعد خیره کنم.با استفاده از air چطوری می تونم این کار رو انجام بدم؟
    البته همه ی این کارها به صورت اتوماتیک انجام بشه و کاربر هیچ دخالتی نداشته باشه.کلی تو اینترنت سرچ کردم اما به نتیجه نرسیدم.
    با تشکر

    • سلام و عرض ادب

      این مورد فقط در حالت AIR امکان پذیر هست، باید از دستور File استفاده کنید.
      یک نمونه ساده برای بررسی شما قرار می دهم، برای موارد بیشتر می توانید عبارات موجود در نمونه را جستجو کنید

          var file:File =  new File(OUTPUT_FILE_NAME);
          var stream:FileStream = new FileStream();
          stream.open(file, FileMode.WRITE);
          stream.writeUTFBytes("Hello World");
          stream.close();
      

      توجه کنید استفاده از writeUTFBytes باعث می شود که مشکلی با متون فارسی نیز نداشته باشید

      موفق و پیروز باشید

  8. سلام
    مشکل من اینه که اطلاعاتی که از طریق فلش توی ایکس ام ال ذخیره میکنم همیشه میره توی خط آخر ایکس ام ال قرار میگیره در حالی که فایل ایکس ام ال من دارای child هایی هست که من میخوام محتوا توی اون چیلد ها ذخیره بشه
    چیکار باید بکنم؟؟؟؟؟
    ممنون میشم از طریق ایمیل هم جواب بدین

  9. نمیدونم چرا کدهای xml اینجا نمیشه فرستاد که بیشتر منظورمو برسونم

ارسال جواب

آدرس رایانامه شما منتشر نخواهد شد.فیلد های اجباری علامت گزاری شده اند *

*

رفتن به بالای صفحه