JavaRush /وبلاگ جاوا /Random-FA /XML در جاوا: چیست؟

XML در جاوا: چیست؟

در گروه منتشر شد
سلام! امروز با فرمت داده دیگری به نام XML آشنا می شویم. این موضوع بسیار مهمی است. هنگام کار بر روی برنامه های جاوا واقعی، تقریباً مطمئناً با مشکلات مربوط به XML روبرو خواهید شد. این فرمت تقریباً در همه جا در توسعه جاوا استفاده می شود (دقیقاً در زیر متوجه خواهیم شد که چرا)، بنابراین توصیه می کنم که سخنرانی را به صورت "مورب" بخوانید، بلکه همه چیز را به طور کامل درک کنید و در عین حال ادبیات / پیوندهای اضافی را مطالعه کنید :) این قطعا زمان تلف نخواهد شد بنابراین، بیایید با موارد ساده شروع کنیم - "چه" و "چرا"!

XML چیست؟

XML مخفف عبارت Extensible Markup Language است. ممکن است قبلاً با یکی از زبان های نشانه گذاری آشنا باشید: نام HTML را شنیده اید که برای ایجاد صفحات وب استفاده می شود :) XML - 1 چیستHTML و XML حتی از نظر ظاهری مشابه هستند:
HTML 1
<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML 1
<headline>title</headline>
<paragraph>paragraph</paragraph>
<paragraph>paragraph</paragraph>
HTML 2
<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML 2
<chief>title</chief>
<paragraph>paragraph</paragraph>
<paragraph>paragraph</paragraph>
به عبارت دیگر، XML زبانی برای توصیف داده ها است.

چرا XML مورد نیاز است؟

XML در ابتدا برای ذخیره سازی و انتقال راحت تر داده ها از جمله از طریق اینترنت اختراع شد. این دارای تعدادی مزیت است که به آن اجازه می دهد با موفقیت با این کار کنار بیاید. اول، خواندن آن هم توسط انسان و هم توسط رایانه آسان است. من فکر می کنم شما به راحتی می توانید درک کنید که این فایل xml چه چیزی را توصیف می کند:
<?xml version="1.0" encoding="UTF-8"?>
<book>
   <title>Harry Potter and the Philosopher’s Stone</title>
   <author>J. K. Rowling</author>
   <year>1997</year>
</book>
کامپیوتر نیز به راحتی این قالب را درک می کند. ثانیاً، از آنجایی که داده ها در قالب متنی ساده ذخیره می شوند، هنگام انتقال آن از یک رایانه به رایانه دیگر مشکلی در سازگاری وجود نخواهد داشت. درک این نکته مهم است که XML کد اجرایی نیست، بلکه یک زبان توصیف داده است . بعد از اینکه داده ها را با استفاده از XML توصیف کردید، باید کدی بنویسید (مثلاً در جاوا) که بتواند این داده ها را ارسال/دریافت/پردازش کند.

XML چگونه کار می کند؟

مؤلفه اصلی آن برچسب ها است: این موارد در براکت های زاویه ای هستند:
<book>
</book>
برچسب های باز و بسته شدن وجود دارد. بسته شدن دارای یک نماد اضافی است - " /"، این را می توان در مثال بالا مشاهده کرد. هر تگ باز باید یک تگ بسته شدن مربوطه داشته باشد. آنها نشان می دهند که توضیحات هر عنصر در فایل کجا شروع و به پایان می رسد. برچسب ها را می توان تودرتو کرد! در مثال کتاب ما، تگ <book> دارای 3 زیربرچسب است - <title> ، <author> و <year> . این به یک سطح محدود نمی‌شود: زیربرچسب‌ها می‌توانند برچسب‌های فرعی خود را داشته باشند و غیره. این طرح درخت تگ نامیده می‌شود. بیایید با استفاده از مثالی از یک فایل XML با توضیحات یک نمایندگی خودرو به درخت نگاه کنیم:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
در اینجا ما یک برچسب سطح بالا داریم - <carstore> . به آن "ریشه" - تگ ریشه نیز می گویند. <carstore> یک برچسب فرزند دارد، <car>. <car> نیز به نوبه خود دارای 3 تگ فرزند خود است - <model>، <year> و <price>. هر تگ می تواند ویژگی هایی داشته باشد - اطلاعات مهم اضافی. در مثال ما، تگ <model> دارای یک ویژگی "lang" است - زبانی که نام مدل در آن نوشته شده است:
<model lang="en">Scania R 770</model>
به این ترتیب می توانیم نشان دهیم که عنوان به زبان انگلیسی نوشته شده است. تگ <price> ما دارای ویژگی "currency" است.
<price currency="US dollar">150000.00</price>
به این ترتیب می توان نشان داد که قیمت خودرو به دلار آمریکا است. بنابراین، XML دارای یک نحو "خود توصیف کننده" است . می توانید هر اطلاعاتی را که برای توصیف داده ها نیاز دارید اضافه کنید. همچنین می توانید یک خط در ابتدای فایل اضافه کنید که نشان دهنده نسخه XML و رمزگذاری است که داده ها در آن نوشته شده است. این " prolog " نامیده می شود و به شکل زیر است:
<?xml version="1.0" encoding="UTF-8"?>
ما از XML نسخه 1.0 و رمزگذاری UTF-8 استفاده می کنیم. این ضروری نیست، اما اگر مثلاً از متن به زبان های مختلف در فایل خود استفاده کنید، می تواند مفید باشد. ما اشاره کردیم که XML مخفف "زبان نشانه گذاری توسعه پذیر" است، اما "extensible" به چه معناست؟ این بدان معنی است که برای ایجاد نسخه های جدید از اشیاء و فایل های شما کاملاً مناسب است. به عنوان مثال، ما می خواهیم نمایشگاه اتومبیل ما نیز شروع به فروش موتور سیکلت کند! در عین حال، در برنامه باید از هر دو نسخه <carstore> پشتیبانی کنیم - هم نسخه قدیمی (بدون موتور سیکلت) و هم نسخه جدید. این هم نسخه قدیمی ما:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
و در اینجا مورد جدید و توسعه یافته است:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
   <motorcycle>
       <title lang="en">Yamaha YZF-R6</title>
       <year>2018</year>
       <price currency="Russian Ruble">1000000.00</price>
       <owner>Vasia</owner>
   </motorcycle>
   <motorcycle>
       <title lang="en">Harley Davidson Sportster 1200</title>
       <year>2011</year>
       <price currency="Euro">15000.00</price>
       <owner>Petia</owner>
   </motorcycle>
</carstore>
به همین راحتی و به سادگی توضیحات موتورسیکلت ها را به فایل خود اضافه کردیم :) در عین حال، ما مطلقاً نیازی به تنظیم برچسب های فرزند مشابه برای موتورسیکلت ها نداریم. لطفاً توجه داشته باشید که موتورسیکلت ها برخلاف اتومبیل ها دارای عنصر <مالک> هستند - مالک. این مانع از خواندن داده ها توسط رایانه (یا شخص) نمی شود.

تفاوت بین XML و HTML

قبلاً گفتیم که XML و HTML از نظر ظاهری بسیار شبیه به هم هستند. بنابراین، دانستن تفاوت آنها بسیار مهم است. اولا، آنها برای اهداف مختلف استفاده می شوند. HTML - برای علامت گذاری صفحات وب. به عنوان مثال، اگر نیاز به ایجاد یک وب سایت دارید، با استفاده از HTML می توانید مشخص کنید: «منو باید در گوشه سمت راست بالا باشد. باید فلان دکمه داشته باشد.» به عبارت دیگر، هدف HTML نمایش داده ها است. XML - برای ذخیره و انتقال اطلاعات به شکلی مناسب برای انسان و رایانه. این قالب حاوی هیچ دستورالعملی در مورد نحوه نمایش داده ها نیست: به کد خود برنامه بستگی دارد. دوم اینکه آنها یک تفاوت فنی اصلی دارند. تگ های HTML از پیش تعریف شده اند. به عبارت دیگر، برای ایجاد یک عنوان (به عنوان مثال، یک کتیبه بزرگ در ابتدای صفحه)، فقط از تگ های <h1></h1> در HTML استفاده می شود (برای عنوان های کوچکتر - <h2></h2>، < h3></h3>). شما نمی توانید با استفاده از برچسب هایی با عناوین مختلف، عنوان در HTML ایجاد کنید. XML از تگ های از پیش تعریف شده استفاده نمی کند. می‌توانید هر نامی را که می‌خواهید به برچسب‌ها بدهید - <header>، <title>، <idontknow2121>.

حل تعارض

آزادی ای که XML فراهم می کند نیز می تواند منجر به برخی مشکلات شود. به عنوان مثال، یک موجودیت مشابه (مثلاً یک ماشین) می تواند توسط یک برنامه برای اهداف مختلف استفاده شود. به عنوان مثال، ما یک فایل XML داریم که ماشین ها را توصیف می کند. با این حال، برنامه نویسان ما از قبل بین خودشان توافق نکردند. و اکنون، علاوه بر داده های ماشین های واقعی، xml ما شامل داده هایی از مدل های اسباب بازی نیز می شود! علاوه بر این، آنها ویژگی های یکسانی دارند. برنامه ما فایل XML زیر را دریافت می کند. چگونه یک ماشین واقعی را از یک مدل اسباب بازی تشخیص دهیم؟
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">100.00</price>
   </car>
</carstore>
پیشوندها و فضاهای نام در اینجا به ما کمک می کنند. برای جدا کردن ماشین های اسباب بازی از واقعی در برنامه ما (و به طور کلی، هر اسباب بازی از نمونه های اولیه واقعی آنها)، دو پیشوند - "واقعی" و "اسباب بازی" را معرفی می کنیم.
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
اکنون برنامه ما قادر خواهد بود بین موجودیت ها تمایز قائل شود! هر چیزی که پیشوند اسباب بازی داشته باشد به عنوان اسباب بازی طبقه بندی می شود :) با این حال، هنوز کارمان تمام نشده است. برای استفاده از پیشوندها، باید هر یک از آنها را به عنوان فضای نام ثبت کنیم. خوب، در واقع، "ثبت نام" کلمه قوی است :) شما فقط باید یک نام منحصر به فرد برای هر یک از آنها پیدا کنید. مانند کلاس ها است: یک کلاس دارای یک نام کوتاه ( Cat) و یک نام کامل با تمام بسته ها ( zoo.animals.Cat) برای ایجاد فضای نام منحصر به فرد، معمولاً از یک URI استفاده می شود . گاهی اوقات آدرس اینترنتی در اینجا جایگزین می شود، جایی که عملکرد و هدف این فضای نام به طور مفصل توضیح داده می شود. اما این نباید یک آدرس اینترنتی معتبر باشد. اغلب، پروژه ها به سادگی از رشته های URI مانند استفاده می کنند که به ردیابی سلسله مراتب فضاهای نام کمک می کند. در اینجا یک مثال است:
<?xml version="1.0" encoding="UTF-8"?>
<carstore xmlns:real="http://testproject.developersgroup1.companyname/department2/namespaces/real"
         xmlns:toy="http://testproject.developersgroup1.companyname/department2/namespaces/toy">
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
</carstore>
البته، هیچ سایتی در اینترنت به آدرس http://testproject.developersgroup1.companyname/department2/namespaces/real وجود ندارد ، اما اطلاعات مفیدی وجود دارد: گروه توسعه دهندگان "developersgroup1" از بخش "department2" مسئول ایجاد فضای نام "واقعی". اگر نیاز به اضافه کردن نام‌های جدید دارید، یا در مورد درگیری‌های احتمالی با آنها بحث می‌کنید، می‌دانیم به کجا مراجعه کنیم. گاهی اوقات یک آدرس اینترنتی واقعی با شرح این فضای نام به عنوان یک نام منحصر به فرد برای یک فضای نام استفاده می شود. به عنوان مثال، اگر یک شرکت بزرگ باشد و پروژه آن توسط میلیون ها نفر در سراسر جهان استفاده شود. اما این همیشه انجام نمی شود: بحثی در مورد این موضوع در Stackoverflow وجود دارد . در اصل، الزام استفاده از URI به عنوان نام فضاهای نام سختگیرانه نیست: شما فقط می توانید از رشته های تصادفی استفاده کنید. این گزینه نیز کار خواهد کرد:
xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
اما استفاده از URI ها مزایای زیادی دارد. شما می توانید بیشتر در مورد این در اینجا بخوانید .

استانداردهای اصلی XML

استانداردهای XML مجموعه ای از پسوندها هستند که قابلیت های اضافی را به فایل های xml اضافه می کنند. XML استانداردهای زیادی دارد، اما ما فقط به مهم ترین آنها نگاه می کنیم و خواهیم فهمید که آنها به AJAX ، یکی از معروف ترین استانداردهای XML، چه اجازه ای می دهند. این به شما امکان می دهد محتوای یک صفحه وب را بدون بارگذاری مجدد تغییر دهید! باحال به نظر می رسد؟ :) می توانید این فناوری را شخصاً در اینجا امتحان کنید . XSLT - به شما امکان می دهد متن XML را به فرمت های دیگر تبدیل کنید. به عنوان مثال، با استفاده از XSLT، می توانید XML را به HTML تبدیل کنید! همانطور که قبلاً گفتیم هدف XML توصیف داده ها است نه نمایش آنها. اما با استفاده از XSLT می توانیم این محدودیت را دور بزنیم! در اینجا یک جعبه شنی با یک نمونه کار وجود دارد، که در آن می توانید خودتان ببینید که چگونه کار می کند :) XML DOM - به شما امکان می دهد عناصر جداگانه را از یک فایل XML دریافت کنید، تغییر دهید، اضافه یا حذف کنید. در اینجا یک مثال کوچک از نحوه عملکرد آن آورده شده است. ما یک فایل books.xml داریم:
<bookstore>
   <book category="cooking">
       <title lang="en">Everyday Italian</title>
       <author>Giada De Laurentiis</author>
       <year>2005</year>
       <price>30.00</price>
   </book>
   <book category="children">
       <title lang="en">Harry Potter</title>
       <author>J K. Rowling</author>
       <year>2005</year>
       <price>29.99</price>
   </book>
</bookstore>
دو کتاب در آن موجود است. کتاب ها عنصری به عنوان عنوان دارند - <title>. و در اینجا می‌توانیم از جاوا اسکریپت استفاده کنیم تا تمام عناوین کتاب را از فایل XML خود دریافت کنیم و اولین آنها را به کنسول خروجی دهیم:
<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
  myFunction(this);
  }
};
xhttp.open("GET", "books.xml", true);
xhttp.send();

function myFunction(xml) {
    var xmlDoc = xml.responseXML;
  document.getElementById("demo").innerHTML =
  xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
}
</script>

</body>
</html>
مجدداً، توصیه می‌کنم ببینید که چگونه این مثال با استفاده از یک جعبه شنی کار می‌کند :) DTD («تعریف نوع سند») - به شما امکان می‌دهد فهرستی از عناصر مجاز را برای برخی موجودیت در یک فایل XML تعریف کنید. به عنوان مثال، ما در حال کار بر روی یک وب سایت کتابفروشی هستیم و همه تیم های توسعه توافق کرده اند که برای عنصر کتاب، فقط ویژگی های عنوان، نویسنده و سال باید در فایل های XML مشخص شود. اما چگونه می توانیم خود را از بی توجهی محافظت کنیم؟ بسیار آسان!
<?xml version="1.0"?>
<!DOCTYPE book [
       <!ELEMENT book (title,author,year)>
       <!ELEMENT title (#PCDATA)>
       <!ELEMENT author (#PCDATA)>
       <!ELEMENT year (#PCDATA)>
       ]>

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
</book>
در اینجا لیستی از ویژگی های معتبر برای <book> تعریف کرده ایم. سعی کنید یک عنصر جدید در آنجا اضافه کنید و بلافاصله با خطا مواجه خواهید شد!
<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
خطا! "Element mainhero در اینجا مجاز نیست" بسیاری از استانداردهای XML دیگر وجود دارد. می توانید با هر یک از آنها آشنا شوید و سعی کنید کدهای موجود در وب سایت WC3 را عمیق تر کنید (بخش "استانداردهای مهم XML"). و به طور کلی، اگر به اطلاعاتی در مورد XML نیاز دارید، تقریباً همه چیز را می توانید در آنجا پیدا کنید :) خب، سخنرانی ما به پایان رسیده است. زمان بازگشت به وظایف است! :) به امید دیدار!
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION