CodeGym /وبلاگ جاوا /Random-FA /XML در جاوا
John Squirrels
مرحله
San Francisco

XML در جاوا

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

Java XML چیست؟

XML مخفف عبارت Extensible Markup Language است. ممکن است قبلاً با یک زبان نشانه گذاری آشنا باشید - آیا نام HTML را شنیده اید که برای ایجاد صفحات وب استفاده می شود :) XML چیست؟  - 1HTML و 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>
به همین راحتی و ساده می‌توان توضیحی درباره موتورسیکلت‌ها به فایل خود اضافه کرد :) علاوه بر این، ما مطلقاً نیازی به داشتن برچسب‌های فرزند مشابه برای موتورسیکلت‌ها نداریم. لطفا توجه داشته باشید که موتورسیکلت ها بر خلاف خودروها دارای عنصر <owner> هستند. این مانع از خواندن داده ها توسط رایانه (یا انسان) نمی شود.

تفاوت بین XML و HTML

قبلاً گفتیم که XML و HTML از نظر ظاهری بسیار شبیه به هم هستند. این امر باعث می شود که دانستن تفاوت آنها بسیار مهم باشد. اول، آنها برای اهداف مختلف استفاده می شوند. HTML برای علامت گذاری صفحات وب است. به عنوان مثال، هنگام ایجاد یک وب سایت، می توانید با استفاده از HTML مشخص کنید: "منو باید در گوشه سمت راست بالا باشد. دکمه های فلان و فلان داشته باشد". به عبارت دیگر، وظیفه HTML نمایش داده ها است. XML برای ذخیره و ارسال اطلاعات به شکلی مناسب برای انسان و رایانه است. این قالب هیچ نشانه ای از نحوه نمایش داده ها ندارد: این بستگی به کد برنامه ای دارد که آن را می خواند. دوم، یک تفاوت فنی عمده وجود دارد. تگ های HTML از پیش تعریف شده اند. به عبارت دیگر، ایجاد یک هدر HTML (به عنوان مثال، یک عنوان بزرگ در بالای صفحه) فقط از تگ های <h1></h1> استفاده می کند (<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" وجود ندارد، اما این رشته حاوی اطلاعات مفیدی است: توسعه دهندگان گروه 1 در بخش 2 مسئول ایجاد فضای نام "واقعی" هستند. . اگر نیاز به معرفی نام‌های جدید یا بحث در مورد درگیری‌های احتمالی داشته باشیم، می‌دانیم به کجا مراجعه کنیم. گاهی اوقات توسعه دهندگان از یک آدرس وب توصیفی واقعی به عنوان یک نام فضای نام منحصر به فرد استفاده می کنند. به عنوان مثال، ممکن است این مورد برای یک شرکت بزرگ باشد که پروژه آن توسط میلیون ها نفر در سراسر جهان مورد استفاده قرار گیرد. اما مطمئناً این کار همیشه انجام نمی شود: Stack Overflow درباره این موضوع بحث می کند. به طور کلی، هیچ الزام دقیقی برای استفاده از 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 دیگر وجود دارد. شما می توانید با هر یک از آنها آشنا شوید و سعی کنید بیشتر در کد جستجو کنید. به هر حال، اگر به اطلاعاتی در مورد XML نیاز دارید، تقریباً همه چیز را می توانید در آنجا پیدا کنید :) و با این کار، درس ما به پایان می رسد. زمان بازگشت به وظایف است! :) تا دفعه بعد!
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION