JavaRush /Java blogi /Random-UZ /Java-da XML: bu nima?

Java-da XML: bu nima?

Guruhda nashr etilgan
Salom! Bugun biz XML deb nomlangan boshqa ma'lumotlar formati bilan tanishamiz. Bu juda muhim mavzu. Haqiqiy Java ilovalarida ishlayotganingizda, siz XML bilan bog'liq muammolarga deyarli duch kelasiz. Ushbu format Java dasturini yaratishda deyarli hamma joyda qo'llaniladi (biz nima uchun aynan quyida bilib olamiz), shuning uchun men ma'ruzani "diagonal" emas, balki hamma narsani yaxshilab tushunishni va shu bilan birga qo'shimcha adabiyotlarni/havolalarni o'rganishni tavsiya qilaman :) vaqt albatta behuda ketmaydi. Shunday qilib, keling, oddiylaridan boshlaylik - "nima" va "nima uchun"!

XML nima?

XML kengaytiriladigan belgilash tilini anglatadi. Siz belgilash tillaridan biri bilan allaqachon tanish bo'lishingiz mumkin: siz HTML haqida eshitgansiz, bu veb-sahifalarni yaratish uchun ishlatiladi :) XML nima - 1HTML va XML hatto tashqi ko'rinishida ham o'xshash:
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>
Boshqacha qilib aytganda, XML ma'lumotlarni tavsiflash tilidir.

XML nima uchun kerak?

XML dastlab ma'lumotlarni, shu jumladan Internet orqali qulayroq saqlash va uzatish uchun ixtiro qilingan. Bu vazifani muvaffaqiyatli bajarishga imkon beruvchi bir qator afzalliklarga ega. Birinchidan, uni odamlar ham, kompyuterlar ham o'qish oson. O'ylaymanki, siz ushbu xml fayli nimani tasvirlayotganini osongina tushunishingiz mumkin:
<?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>
Kompyuter ham bu formatni oson tushunadi. Ikkinchidan, ma'lumotlar oddiy matn formatida saqlanganligi sababli, uni bir kompyuterdan ikkinchisiga o'tkazishda hech qanday moslik muammosi bo'lmaydi. XML bajariladigan kod emas, balki ma'lumotlarni tavsiflash tili ekanligini tushunish muhimdir . XML yordamida ma'lumotlarni tavsiflaganingizdan so'ng, ushbu ma'lumotlarni yuborish/qabul qilish/qayta ishlash uchun kod yozishingiz kerak (masalan, Java-da).

XML qanday ishlaydi?

Uning asosiy komponenti teglardir: bular burchakli qavslardagi narsalar:
<book>
</book>
Ochilish va yopish teglari mavjud. Yopuvchi qo'shimcha belgiga ega - “ /”, buni yuqoridagi misolda ko'rish mumkin. Har bir ochilish tegi tegishli yopish tegiga ega bo'lishi kerak. Ular fayldagi har bir elementning tavsifi qayerdan boshlanishi va tugashini ko'rsatadi. Teglar joylashtirilishi mumkin! Bizning kitob misolimizda <book> tegi 3 ta subtegga ega - <title> , <author> va <year> . Bu bir daraja bilan cheklanmaydi: subteglar o'z pastki teglariga ega bo'lishi mumkin va hokazo. Ushbu dizayn teg daraxti deb ataladi. Keling, avtomobil sotuvchisi tavsifi bilan XML fayli misolida daraxtni ko'rib chiqaylik:
<?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>
Bu erda bizda yuqori darajadagi teg bor - <carstore> . U "ildiz" deb ham ataladi - ildiz yorlig'i. <carstore>da bitta kichik teg bor, <car>. <avtomobil>, o'z navbatida, 3 ta o'z farzand teglariga ega - <model>, <yil> va <price>. Har bir teg atributlarga ega bo'lishi mumkin - qo'shimcha muhim ma'lumotlar. Bizning misolimizda <model> tegi "lang" atributiga ega - model nomi yozilgan til:
<model lang="en">Scania R 770</model>
Shunday qilib, sarlavha ingliz tilida yozilganligini ko'rsatishimiz mumkin. Bizning <price> tegimiz “valyuta” atributiga ega.
<price currency="US dollar">150000.00</price>
Shunday qilib, biz mashina narxining AQSh dollarida ekanligini ko'rsatishimiz mumkin. Shunday qilib, XML "o'zini tavsiflovchi" sintaksisga ega . Ma'lumotlarni tavsiflash uchun kerakli ma'lumotlarni qo'shishingiz mumkin. Bundan tashqari, faylning boshida XML versiyasini va ma'lumotlar yozilgan kodlashni ko'rsatadigan qatorni qo'shishingiz mumkin. U " prolog " deb ataladi va quyidagicha ko'rinadi:
<?xml version="1.0" encoding="UTF-8"?>
Biz XML 1.0 versiyasi va UTF-8 kodlashdan foydalanamiz. Bu shart emas, lekin, masalan, faylingizda turli tillardagi matndan foydalansangiz foydali bo'lishi mumkin. XML "kengaytiriladigan belgilash tili" degan ma'noni anglatadi, ammo "kengaytiriladigan" nimani anglatadi? Bu sizning ob'ektlaringiz va fayllaringizning yangi versiyalarini yaratish uchun juda mos ekanligini anglatadi. Masalan, bizning avtosalonimiz ham mototsikllarni sotishni boshlashini xohlaymiz! Shu bilan birga, dasturda biz <carstore> ning ikkala versiyasini ham - eski (mototsikllarsiz) va yangisini qo'llab-quvvatlashimiz kerak. Mana bizning eski versiyamiz:
<?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>
Va mana yangi, kengaytirilgan:
<?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>
Biz faylimizga mototsikllarning tavsifini juda oson va sodda tarzda qo'shdik :) Shu bilan birga, biz mototsikllar uchun avtomobillar uchun bir xil bolalar teglarini o'rnatishimiz shart emas. E'tibor bering, mototsikllar, avtomobillardan farqli o'laroq, elementga ega <egasi> - egasi. Bu kompyuterning (yoki odamning) ma'lumotlarni o'qishiga to'sqinlik qilmaydi.

XML va HTML o'rtasidagi farqlar

XML va HTML tashqi ko'rinishida juda o'xshashligini allaqachon aytgan edik. Shuning uchun ular qanday farq qilishini bilish juda muhimdir. Birinchidan, ular turli maqsadlarda ishlatiladi. HTML - veb-sahifalarni belgilash uchun. Misol uchun, agar siz HTML-dan foydalanib veb-sayt yaratishingiz kerak bo'lsa, quyidagilarni belgilashingiz mumkin: “Menyu yuqori o'ng burchakda bo'lishi kerak. Unda falon tugmalar bo‘lishi kerak”. Boshqacha qilib aytganda, HTMLning maqsadi ma'lumotlarni ko'rsatishdir. XML - odamlar va kompyuterlar uchun qulay shaklda ma'lumotlarni saqlash va uzatish uchun . Ushbu formatda ushbu ma'lumotlarni qanday ko'rsatish kerakligi haqida ko'rsatmalar mavjud emas: bu dasturning o'zi kodiga bog'liq. Ikkinchidan, ular asosiy texnik farqga ega. HTML teglari oldindan belgilangan. Boshqacha qilib aytganda, sarlavha yaratish uchun (masalan, sahifa boshidagi katta yozuv) HTMLda faqat <h1></h1> teglaridan foydalaniladi (kichikroq sarlavhalar uchun - <h2></h2>, < h3></h3>). Turli sarlavhali teglar yordamida HTMLda sarlavhalar yarata olmaysiz. XML oldindan belgilangan teglardan foydalanmaydi. Teglarga istalgan nomlarni berishingiz mumkin - <header>, <title>, <idontknow2121>.

Mojarolarni hal qilish

XML taqdim etgan erkinlik ham ba'zi muammolarga olib kelishi mumkin. Masalan, bir xil ob'ekt (masalan, avtomobil) dastur tomonidan turli maqsadlarda ishlatilishi mumkin. Masalan, bizda mashinalarni tavsiflovchi XML fayli bor. Biroq, dasturchilarimiz oldindan kelishib olishmadi. Va endi, haqiqiy avtomobillar ma'lumotlaridan tashqari, bizning xml o'yinchoq modellari ma'lumotlarini ham o'z ichiga oladi! Bundan tashqari, ular bir xil xususiyatlarga ega. Bizning dasturimiz quyidagi XML faylini oladi. Haqiqiy mashinani o'yinchoq modelidan qanday ajratish mumkin?
<?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>
Prefikslar va nomlar bu erda bizga yordam beradi. Bizning dasturimizda o'yinchoq mashinalarni haqiqiylaridan (va umuman olganda, har qanday o'yinchoq narsalarni ularning haqiqiy prototiplaridan) ajratish uchun biz ikkita prefiksni kiritamiz - "haqiqiy" va "o'yinchoq".
<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>
Endi bizning dasturimiz ob'ektlarni ajrata oladi! O'yinchoq prefiksi bo'lgan har qanday narsa o'yinchoqlar sifatida tasniflanadi :) Biroq, biz hali tugatmadik. Prefikslardan foydalanish uchun ularning har birini nom maydoni sifatida ro'yxatdan o'tkazishimiz kerak. Xo'sh, aslida, "ro'yxatdan o'tish" - bu kuchli so'z :) Siz ularning har biri uchun o'ziga xos nom bilan chiqishingiz kerak. Bu xuddi sinflarga o'xshaydi: sinfning qisqa nomi ( Cat) va barcha paketlar bilan to'liq nomi ( zoo.animals.Cat) Noyob nom maydonlarini yaratish uchun odatda URI dan foydalaniladi . Ba'zan bu erda Internet manzili almashtiriladi, bu erda ushbu nom maydonining funktsiyalari va maqsadi batafsil tavsiflanadi. Lekin bu haqiqiy Internet manzili bo'lishi shart emas. Ko'pincha, loyihalar shunchaki nomlar bo'shliqlari ierarxiyasini kuzatishga yordam beradigan URI-ga o'xshash satrlardan foydalanadi. Mana bir misol:
<?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>
Albatta, Internetda http://testproject.developersgroup1.companyname/department2/namespaces/real manzilida hech qanday sayt yo'q Ammo foydali ma'lumotlar mavjud: "department2" bo'limidan "developersgroup1" ishlab chiquvchilar guruhi yaratish uchun javobgardir. "haqiqiy" nom maydoni. Agar siz yangi nomlar qo'shishingiz yoki ular bilan yuzaga kelishi mumkin bo'lgan nizolarni muhokama qilishingiz kerak bo'lsa, biz qaerga murojaat qilishni bilamiz. Ba'zan ushbu nomlar maydonining tavsifi bilan haqiqiy Internet manzili nomlar maydoni uchun noyob nom sifatida ishlatiladi. Misol uchun, agar u yirik kompaniya bo'lsa va uning loyihasi butun dunyo bo'ylab millionlab odamlar tomonidan qo'llaniladi. Ammo bu har doim ham amalga oshirilmaydi: Stackoverflow da bu masala muhokama qilinadi . Printsipial jihatdan, URI-larni nomlar maydoni uchun nom sifatida ishlatish talabi qat'iy emas: siz shunchaki tasodifiy satrlardan foydalanishingiz mumkin. Ushbu parametr ham ishlaydi:
xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
Ammo URI lardan foydalanishning bir qator afzalliklari bor. Bu haqda batafsil ma'lumotni shu yerda o'qishingiz mumkin .

Asosiy XML standartlari

XML standartlari - bu xml fayllariga qo'shimcha funktsiyalar qo'shadigan kengaytmalar to'plami. XMLda juda ko'p standartlar mavjud, ammo biz faqat eng muhimlarini ko'rib chiqamiz va ular eng mashhur XML standartlaridan biri bo'lgan AJAX ga nima qilishiga ruxsat berishini bilib olamiz. Bu sizga veb-sahifani qayta yuklamasdan uning mazmunini o'zgartirish imkonini beradi! Ajoyib eshitiladimi? :) Bu texnologiyani bu yerda shaxsan sinab ko'rishingiz mumkin . XSLT - XML ​​matnini boshqa formatlarga aylantirish imkonini beradi. Masalan, XSLT-dan foydalanib, siz XML-ni HTML-ga o'zgartirishingiz mumkin! XML ning maqsadi, yuqorida aytib o'tganimizdek, ma'lumotlarni ko'rsatish emas, balki tasvirlashdir. Ammo XSLT-dan foydalanib, biz bu cheklovni chetlab o'tishimiz mumkin! Mana ishchi misoli bo'lgan qum qutisi, u erda qanday ishlashini o'zingiz ko'rishingiz mumkin :) XML DOM - XML ​​faylidan alohida elementlarni olish, o'zgartirish, qo'shish yoki olib tashlash imkonini beradi. Bu qanday ishlashiga kichik bir misol. Bizda books.xml fayli bor:
<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>
Unda ikkita kitob bor. Kitoblar sarlavha kabi elementga ega - <title>. Va bu erda biz XML faylimizdagi barcha kitob sarlavhalarini olish va ulardan birinchisini konsolga chiqarish uchun JavaScript-dan foydalanishimiz mumkin:
<!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>
Shunga qaramay, men ushbu misol sandbox yordamida qanday ishlashini ko'rishni tavsiya qilaman :) DTD ("hujjat turini aniqlash") - XML ​​faylidagi ba'zi ob'ektlar uchun ruxsat etilgan elementlar ro'yxatini aniqlash imkonini beradi. Misol uchun, biz kitob do'koni veb-saytida ishlayapmiz va barcha ishlab chiqish guruhlari kitob elementi uchun XML fayllarida faqat nom, muallif va yil atributlari ko'rsatilishi kerakligiga kelishib oldilar. Ammo o'zimizni e'tiborsizlikdan qanday himoya qilishimiz mumkin? Juda oson!
<?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>
Bu yerda biz <book> uchun tegishli atributlar roʻyxatini aniqladik. U erda yangi element qo'shishga harakat qiling va siz darhol xatoga yo'l qo'yasiz!
<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
Xato! "Bu erda asosiy qahramon elementiga ruxsat berilmaydi" Boshqa ko'plab XML standartlari mavjud. Siz ularning har biri bilan tanishishingiz va WC3 veb-saytidagi kodni chuqurroq o'rganishga harakat qilishingiz mumkin ("Muhim XML standartlari" bo'limi). Va umuman olganda, XML haqida ma'lumot kerak bo'lsa, u erda deyarli hamma narsani topishingiz mumkin :) Xo'sh, bizning ma'ruzamiz o'z nihoyasiga etdi. Vazifalarga qaytish vaqti keldi! :) Ko'rishguncha!
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION