XML در سی شارپ مثل آب خوردن
سلام _ ی نکته رو ذکر کنم شاید زیاد ترتیب رعایت نشده باشه ولی سعی کردم تا جایی که ممکنه ساده بیان کنم مطالبو
فایل های xml یک نوع فایل متنی است که قائده ی خاصی در انها وجود دارد . در این نوع فایل ها از تگ ها برای مشخص کردن اطلاعات استفاده میشه که تگ ها رو خودمون تعرف میکنیم برای مثال
برای ذخیره کردن سن یک نفر به این صورت عمل میکنیم
1 |
<age>21</age> |
متن داخلی این دو تگ برابر با مقدار سن فرد مورد نظر است.
برا نشون دادن س میتونید هر چیزی رو تعریف کنید مثلا <a>21</a>
تگها رو میشه تو در تو تعریف کرد برای مثال من اطلاعات کامل مربوط به یک شخص رو توی یک فایل xml میخوام ذخیره کنم ، توضیحشو بعدا میگم
1 2 3 4 5 6 7 8 9 10 11 |
<?"xml version="1.0" encoding="UTF-8?> <Student> <Family> Jafari </Family> <Name> mousa </Name> </Student> <age> 21 </age> |
یادتون باشه که xml به بزرگ و کوچکی حروف حساس است
خط اول تعریف فایل به عنوان xml هست
بیرونی ترین تگ به عنوان تگ ریشه شناخته میشه اینجا میشه Student
Xml دقیقا میشه پیاده سازی درخت و رابطه والد و فرزندی دارن
تا تگ فرزند بسته نشده نمیشه تگ والد رو بست ( در اینجا باید اول تگ های Name , Family , age بسته بشن و بعد از اون Student رو بست.)
میشه برا تگ ها ویژگی هایی رو نیز در نظر گرفت
مثلا میشه اطلاعات همین دانش اموز رو به صورت زیر نشون داد
1 |
<Student Name=”Mousa” Family=”Jafari” Age=”۲۱” /> |
چون تگ مقدار داخلی نداره تگ رو بدون ذکر نام میبندیم به صورت بالا
فاصله ها در نظر گرفته نمیشه در فایل های xml
کد زیر برا کامنت گذاشتن استفاده میشه به جای comment توضیحاتتون رو قرار میدین
<!–Comment –>
خب دیگه میریم سراغ کد نویسی توی سی شارپ برا تولید یک فایل xml
- اول باید یک فایل xml رو تولید کنین که میتونین با استفاده از visual studio
- Add new item رو انتخاب کنید و از اونجا Xml File رو انتخاب کرده و اسمشو وارد میکنید و add رو بزنید تا فایل ساخته بشه
- xml رو به رفرنس هاتون اضافه کنید و using system.xml رو اضافه کنید
1 |
XmlDocument DOC = new XmlDocument(); |
یک شی از نوع xmlDocument ساخته میشه
1 |
DOC.Load(Application.StartupPath + "\\DurationType.xml"); |
من اینجا فایل xml مورد نظرمو load کردم با نام DurationType.xml که در مسیر برنامم قرار داره
1 |
XmlNode root = DOC.DocumentElement; |
یک شی از نوع xmlnode به نام root تعریف کردیم که خاصیت documentElement مربوط به Doc رو به اون نسبت دادیم . اگر توجه کنین مقدار بازگشتی DocumentElement از نوع XmlNode خواهد بود _ خاصیت DocumentElement مربوط به Doc در واقع تگ ریشه رو برمیگردونه.
1 |
XmlNode type = DOC.CreateElement("type"); |
با استفاده از متد CreateElement(“Element”) یک تگ جدید تعریف میشه که در اینجا type نام منطقی اون تگ هست که توی برنامه نویس ازش استفاده میشه و رشته ی ارسالی به متد ، همان مقداری است که تگ با اون نمایش داده میشه مثلا در اینجا ی همچین چیزی تولید میشه <type></type>
خب تا اینجا تونستیم یک Node جدید تعریف کنیم حالا میخوایم این Node رو به یکی
از Node ها اضافه کنیم در واقع میشه فرزند یکی از Node ها
خب ابتدا یک مقدار به Node ایجاد شده میدیم به این صورت
1 |
type.InnerText = “ mousa “; |
نتیجه به این صورت میشه <type> mousa </type>
مثلا در اینجا میخوایم Node ایجاد شده رو به root اضافه کنیم
1 |
root.AppendChild(type); |
اگه به معانی هم توجه کنید مشخصه که چه اتفاقایی میافته در کد بالا یک فرزند با نام منطقی type به Node ریشه اضافه شده با استفاده از متد AppendChild()
خب بعد از ایجاد این تغییرات میخوایم فایل xml به روزرسانی بشه با استفاده از متد Save
1 |
DOC.Save(Application.StartupPath + "\\DurationType.xml"); |
خب حالا میخوایم یک node رو حذف کنیم از فایل :
1 2 3 4 5 |
DOC.Load(Application.StartupPath + "\\DurationType.xml"); XmlNode root = DOC.DocumentElement; XmlNodeList Types = root.ChildNodes; |
تا خط دوم رو میتونید سراسری تعریف کنید که نیاز به تعریف دوباره نباشه
xmlNodeList در واقع ارایه ای از Node ها است که یک نمونه از اون با نام منطقی Types تعریف شده
خاصیت ChildNodes تمام Node های فرزند یک Node رو تا یک مرحله برمیگردونه
1 2 3 4 5 6 7 8 9 |
foreach (XmlNode type in Types) { if (type.InnerText == DurationType) root.RemoveChild(type); } |
با استفاده از این کد تمامی مقادیر xmlNode بررسی میشه و اون Node که خاصیت innerText ش همون چیزی که میخوایم حذف بشه ، بود با استفاده از متد RemoveChild(“Node Logic Name”)
اون Node رو حذف میکنیم
و باز با استفاده از متد Save تغییرات اعمال میشه
1 |
DOC.Save(Application.StartupPath + "\\DurationType.xml"); |
خب دیگه مطلب خاصی نمیمونه _ تابع زیر یک فایل xml که فرزنداش تا یک مرحله هستن رو برمیگردونه چیز جدیدی توش نیست خودتون تحلیلش کنین
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
public string[] DurationTypes() DOC.Load(Application.StartupPath + "\\DurationType.xml"); { int i = 0; XmlNode root = DOC.DocumentElement; XmlNodeList Types = root.ChildNodes; string[] TypesArray = new string[Types.Count]; try { foreach (XmlNode type in Types) { } TypesArray[i] = type.InnerText; i++; } catch { } TypesArray[0] = "خطا،دباره سعی کنید"; } return TypesArray; |
برا مثال این یک الگو از فایل xml هست که فیلد کلید اصلی مربوط به رکورد های اضافه شده با دیتابیس و همچنین رکورد های اپدیت شده رو ذخیره میکنه توی خودش
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<Changes> <NewRecord> <PrimeryKey> 1 </PrimeryKey> <PrimeryKey> 2 </PrimeryKey> <PrimeryKey> 3 </PrimeryKey> </NewRecord> <Updates> <PrimeryKey> 10 </PrimeryKey> <PrimeryKey> 6 </PrimeryKey> </Updates> </Changes> |
امیدوارم که مفید بوده باشه
موفق باشید
یک پاسخ
سلام من با یک خطا مواجع شدم چکار کنم ؟
An unhandled exception of type ‘System.Xml.XmlException’ occurred in System.Xml.dll
Additional information: Name cannot begin with the ‘”‘ character, hexadecimal value 0x22. Line 1, position 3.