استفاده از XML در جاوا

اگر دنبال راه بهتری برای نگه‌داری داده‌ها هستید.
اگر دنبال راه بهتری برای نگه‌داری داده‌ها هستید.

راستش همه این نوشته بخشی از جستجو‌های من است وقتی که تلاش می‌کردم تنظیمات برنامه‌ای که نوشتم رو به خارج از اون ببرم! نوشتن تنظیمات برنامه خارج از متن کلاس‌های جاوا یک بخش از پروژه درس برنامه‌نویسی پیشرفته من محسوب می‌شود. در این متن سعی می‌کنم تا جایی که یادگرفته‌ام موضوعات زیر را بررسی کنم:

  • چرا از XML استفاده کنیم؟
  • چطور تنظیمات، داده‌ها و یا نمایش برنامه‌ را از متن کلاس ها خارج کنیم؟ (hardcode ننویسیم!)
  • چطور در جاوا از روی یک فایل XML بخوانیم؟
  • چطور در جاوا روی یک فایل XML بنویسم؟

چرا از XML استفاده کنیم؟

احتمالا می‌دانید که برای خواندن و نوشتن روی فایل‌ها تکنولوژی‌های دیگری هم وجود دارد. XML یک زبان نشانه گذاری استاندارد است که تقریبا همه انتظار‌های شما برای ذخیره و انتقال داده‌هایتان را برآورده می‌کند. اگر مشخصا از جاوا استفاده می‌کنید و داده‌های ساده‌ای برای نگه‌داری دست دارید احتمالا propeties خواسته‌های شما را برآورده خواهد کرد اما برای نگه‌داری داده‌های پیچیده‌تر بهتر است از چیزی مثل XML استفاده کنید. propertiesها ممکن است برای شما محدودیت به بار بیاورد! مثلا اگر خواستید برنامه را به کاملا به زبان دیگری بازنویسی کنید استفاده از فایل‌هایی که مخصوص یک زبان خاص هستند منطقی نیست. بهتر است از استانداردی استفاده کنید که کدهایتان «قابل نگه‌داری» باشند. اگر شک دارید که چرا از XML استفاده کنید این دو لینک بیشتر می‌توانند به شما کمک کنند:

Java and XML by Brett McLaughlin

Java properties: .properties files vs xml?

چطور تنظیمات، داده‌ها و یا نمایش برنامه‌ را از متن کلاس ها خارج کنیم؟ (hardcode ننویسیم!)

تصور کنید یک برنامه‌ نوشته‌اید و می‌خواهید به کاربر اجازه دهید که سایز و یا رنگ‌های مختلف به کار رفته را به دلخواه خودش تغییر دهد. یکی از روش‌های خوب این است که تنظیمات برنامه را در متن کد برنامه ذخیره سازی نکنید. (اگر در متن برنامه تنظیماتی را بنویسید اصطلاحا hardcode نوشته‌اید) بیرون بردن تنظیمات برنامه به شما امکانات فراوانی می‌دهد مثلا شما می‌توانید چند فایل تنظیمات داشته باشید و به دلخواه یکی را لود کنید و یا اینکه به سادگی آن‌ها را تغییر دهید بدون اینکه دست به کد برنامه ببرید. مزایا این کار خیلی زیاد است! من هم بعد از استفاده از آن متوجه شدم این روش بسیار ساده و در عین حال کارآمد و تمیز است.


برای اینکه یک فایل مثل تنظیمات را به صورت XML ذخیره کنید از روی آن بخوانید احتیاج به یک کلاس Setting.java دارید که بتوانید از روی XML با همه فیلد‌های مورد نیاز یک آبجکت بسازید. مثلا من یک‌سری داده رو به صورت پابلیک و استاتیک ذخیره کرده‌ام که حالا می‌خواهم آن‌ها را با XML بنویسم: (توجه کنید که این مقادیر فاینال و استاتیک هستند، کاری که در برنامه‌نویسی خیلی توصیه نمی‌شود!)

public static final String TITLE = &quotFire Stone"
// Some sizes
public static final int STANDARD_STATES_WIDTH = 753;
public static final int STANDARD_STATES_HEIGHT = 525;
// Some color
public static final Color BUTTON_COLOR_1 = new Color(0xFF9900);

یک فایل XML ایجاد می‌کنم و سعی می‌کنم به طریق منطقی و قابل فهمی داده‌ها را نگه دارم:

<?xml version=&quot1.0&quot encoding=&quotUTF-8&quot?>
<setting>
    <title>Fire Stone</title>
    <window_size>
        <width>753</width>
        <height>525</height>
    </window_size>
    <color>
        <name>BUTTON_COLOR_1</name>
        <tag>0xFF9900</tag>
    </color>
</setting>

اینجا می‌توانید بیشتر در مورد نوشتن یک فایل XML بخوانید.


چطور در جاوا از روی یک فایل XML بخوانیم؟

فرض کنید در کل می‌خواهیم یک کلاس ستینگ از روی XML بسازیم از آن در برنامه استفاده کنیم. قبل از همه چیز باید همین کلاس Setting.java را بسازیم:

https://gist.github.com/benyaminbeyzaie/99f0b82be340e49f79d8c4126fa9f906

کلاس ستینگ ما آماده است. حالا یک کلاس احتیاج داریم که تنها کارش خواندن XML و ساختن یک موجودیت از آن است. این کلاس را SettingLoader.java نامگذاری می‌کنیم. برای خواندن از روی یک فایل XML یا نوشتن بر روی آن کتابخانه‌های زیادی وجود دارد! خودتان هم می‌توانید کمی وقت بگذارید و یکی بنویسید! اینجا از StAX استفاده می‌کنیم. خیلی سخت نیست، قابلیت‌های زیادی هم دارد. مطمئن شوید که این کتابخانه‌ را به پروژه خود اضافه کرده باشید. من از گردل استفاده می‌کنم: (اگر در مورد انتخاب StAX شک دارید اینجا را بخوانید)

// https://mvnrepository.com/artifact/stax/stax-api
compile group: 'stax', name: 'stax-api', version: '1.0.1'

چون قرار نیست فیلد خاصی در SettingLoader.java داشته باشیم و تنها به یک موجودیت از آن احتیاج داریم می‌توانیم از دیزاین پترن Singleton برای نوشتن این کلاس استفاده کنیم:

https://gist.github.com/benyaminbeyzaie/99b86ae1276ddda482355590ba5cfd92

تقریبا کارمان تمام شده است! حالا کافیست هر کجا که می‌خواهیم یک Setting بسازیم و با SettingLoader یک فایل XML را تبدیل به یک موجودیت از نوع Setting کنیم. به روش‌های مختلفی می‌توانیم از Setting استفاده کنیم مثلا این کلاس Constants.java را نگاه کنید، متد ()init آن توسط یک setting فراخوانی می‌شود و مقادیر استاتیک را به مقادیری که در XML آبجکت setting نوشته‌ایم تغییر می‌دهد.

https://gist.github.com/benyaminbeyzaie/1e5a506682909e837b5eb267c423ecae

حالا هر کجای برنامه که خواستیم می‌توانیم از این مقادیر استاتیک به سادگی استفاده کنیم و هر وقت که خواستیم آن‌ها را تغییر بدهیم متد init را با setting دیگری فراخوانی کنیم بدون اینکه به جای دیگری از برنامه دست ببریم. در این ویدیو هم کلاس Loader فایل XML و نحوه استفاده از آن را بیشتر توضیح داده‌ام:

https://www.aparat.com/v/IindX

این هم یک مثال دیگر از خواندن فایل XML در جاوا: https://www.journaldev.com/1191/java-stax-parser-example-read-xml-file

چطور در جاوا روی یک فایل XML بنویسیم؟

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

https://www.journaldev.com/892/how-to-write-xml-file-in-java-using-java-stax-api

https://www.baeldung.com/java-stax

https://www.vogella.com/tutorials/JavaXML/article.html