PDA

View Full Version : بازکردن فایلهایی با نام یونیکدی در libxml



sh_roohani
یک شنبه 11 فروردین 1387, 03:42 صبح
سلام،

آقا من داشتم با این libxml بدجوری حال می کردم که یهو زدم به درخت. مشکل اینه که نام فایل XMLی که می خوام بازش کنم یونیکدیه، ولی تابع xmlParseFile نام فایل رو ASCII می گیره. گشتم یه چیزایی پیدا کردم درباره xmlIO.h، ولی راستش اصلا نمی فهمم باید چیکار کنم.

کسی تا حالا چنین تجربه ای داشته؟

sh_roohani
دوشنبه 12 فروردین 1387, 03:39 صبح
سلام دوباره،

آقا من یه راه حلی واسش پیدا کردم. البته آخرش نفهمیدم با این xmlIO چه جوری کارکنم، اگه یه روز یاد گرفتم حتما میام تو این پست می نویسم، شاید به درد کسی خورد. فعلا قضیه رو برای load کردن با استفاده از توابع xmlCreatePushParserCtxt و xmlParseChunk حل کردم و برای save کردن هم با xmlDocDumpMemory.

یعنی برای load کردن، ابتدا با هر چی که می خوام (من با wfopen_ اینکارو کردم) یه فایل باز می کنم. بعد با xmlCreatePushParserCtxt یه push parser درست می کنم. بعد محتوای فایل رو بلوک به بلوک می خونم و می دم به xmlParseChunk برام parse کنه. دست آخر هم از xmlParserCtxtPtr::myDoc واسه کاری که می خوام استفاده می کنم. بعد هم فایل رو می بندم. البته من نمی دونم حالا که از xmlParseFile استفاده نمی کنم، صدا زدن xmlCleanupParser لازمه یا نه، ولی ضرر نداره که اینکار رو هم بکنیم.

برای save کردن هم، باز به همون ترتیب یه فایل باز می کنم، شیء xmlDocم رو با xmlDocDumpMemory می ریزم تو یه بافر و اون بافر رو با fwrite می نویسم تو فایل. بعد هم فایل رو می بندم.

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

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

امیدوارم این تجربه روح یک برنامه نویس دیگه رو از شکنجه ای که من دیدم در امان بداره. آخه می دونین، منم که حساس!