1. XML ilə tanışlıq
Bu gün JSON standart olsa da, Java dünyasında çoxlu legacy-kod var, buna görə bəzən XML ilə rastlaşa bilərsiniz. Ona görə də onun haqqında təsəvvürə malik olmaq faydalıdır. XML (eXtensible Markup Language) — strukturlu məlumatı saxlamaq və mübadilə etmək üçün mətn formatıdır. Onu tez-tez konfiqurasiyalar, proqramlararası mübadilə, məlumatın saxlanması və hətta obyektlərin seriyalaşdırılması üçün istifadə edirlər.
XML sənədinin strukturunun əsas elementləri:
Teqlər (elementlər):
< və > arasındakı hər şey. Hər teq açılır (<tag>) və bağlanır (</tag>) və ya özünü bağlayan olur (<tag/>).
Atributlar:
Teqin daxilindəki əlavə parametrlər.
Nümunə: <user name="Vasya" age="25"/>
Mətn düyünləri:
Teqlər arasındakı mətn.
Nümunə: <greeting>Salam, dünya!</greeting>
Sadə XML sənədinin nümunəsi
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user name="Vasya" age="25">Salam!</user>
<user name="Katya" age="30"/>
</users>
Burada:
- <users> — kök element.
- <user> — name və age atributları olan element; birinci istifadəçinin mətn məzmunu var.
2. Açar anlayışlar
Proloq:
Faylın əvvəlindəki sətir XML versiyasını və kodlaşdırmanı göstərir.
Nümunə: <?xml version="1.0" encoding="UTF-8"?>
Elementlər:
XML-in əsas tikinti blokları.
Nümunə: <book>...</book>
Atributlar:
Açan teqin daxilindəki parametrlər.
Nümunə: <book title="Java" author="Ivanov"/>
Şərhlər:
HTML-də olduğu kimi, <!-- ... --> arasında yazılır.
Nümunə: <!-- Bu şərhdir -->
CDATA bölmələri:
XML kimi şərh olunmayacaq mətni daxil etməyə imkan verir (məsələn, <, & və s. işarələri ilə).
Nümunə:
<script><![CDATA[
if (a < b && b > 0) { ... }
]]></script>
3. XML-də namespaces (ad məkanları) niyə lazımdır
Problem: adların konflikti
Böyük XML sənədlərində eyni adlı, lakin fərqli mənalı teqlər tez-tez rast gəlinir. Məsələn, sizdə HTML-in bir hissəsi kimi <table> və biznes-məntiqinizin (məsələn, verilənlər bazası) bir hissəsi kimi <table> ola bilər. Hansı teqin nə demək olduğunu necə başa düşmək olar?
Namespace olmadan:
<root>
<table>
<row>...</row>
</table>
<table>
<column>...</column>
</table>
</root>
Burada hansı <table> nəyə aid olduğu aydın deyil.
Həll: namespace-lər
Namespace (ad məkanı) — teqləri və atributları “işarələmək” və ad konfliktlərindən qaçmaq, müxtəlif teqlərin məna sahələrini dəqiq ayırmaq üsuludur.
- Hər bir namespace — unikal URI-dir (adətən keçid kimi görünür, amma bu, sadəcə identifikatordur).
- Müxtəlif namespace-lərə malik element və atributlar, adları üst-üstə düşsə belə, fərqli sayılır.
Üstünlüklər:
- Müxtəlif standartlar və sxemlər arasında ad konfliktləri olmur.
- Müxtəlif mənbələrdən olan məlumatları eyni sənəddə birləşdirmək mümkündür.
- Hər teqin hansı “sözlüyə” aid olduğu aydın görünür.
4. Namespace-lərin istifadəsi: elan və tətbiq
Namespace necə elan edilir
Açan element teqində xüsusi xmlns (XML Namespace) atributu yazılır:
- Prefikssiz: xmlns="URI" — bütün qapsanan elementlər üçün susmaya görə namespace elan edir.
- Prefikslə: xmlns:prefix="URI" — teqlərdə istifadə olunacaq qısa ad (prefiks) ilə namespace elan edir.
Namespace-in elan edilməsi və istifadəsi nümunəsi
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Hüceyrə 1</h:td>
<h:td>Hüceyrə 2</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>Masa</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
Burada:
- xmlns:h="..." — HTML cədvəli üçün h prefiksini elan edir.
- xmlns:f="..." — mebel üçün f prefiksini elan edir.
- <h:table> və <f:table> — adları eyni olsa belə, bunlar artıq müxtəlif elementlərdir.
Namespace-dən necə istifadə etmək olar
- Elan: Kökdə və ya istənilən elementdə: xmlns:prefix="URI"
- Tətbiq: Elementin və ya atributun adından əvvəl prefiks və iki nöqtə yazılır: <prefix:element>...</prefix:element>
Susmaya görə namespace
Sadəcə xmlns="URI" elan etsəniz, prefikssiz bütün elementlər həmin namespace-ə aid olacaq.
<books xmlns="http://example.com/books">
<book>...</book>
</books>
5. Təcrübə: bir neçə namespace ilə sadə XML sənədinin yaradılması
Gəlin HTML və mebel üçün iki ad məkanından istifadə edilən bir XML nümunəsi yaradaq.
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Hüceyrə 1</h:td>
<h:td>Hüceyrə 2</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>Masa</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
Burada nə baş verir:
- Kök elementdə iki namespace elan olunub: h və f.
- h: prefiksi olan bütün elementlər HTML cədvəlinə aiddir.
- f: prefiksi olan bütün elementlər mebelə aiddir.
6. Tipik səhvlər
Səhv 1: prefiksi elan etməyi unutmusunuz
<root>
<h:table>...</h:table>
</root>
Nəticə: XML parseri bu xətanı verəcək: The prefix 'h' for element 'h:table' is not bound.
Səhv 2: namespace olmadan eyni adlar
<root>
<table>...</table>
<table>...</table>
</root>
Nəticə: Hansı <table>-in nəyə aid olduğunu ayırd etmək mümkün deyil.
Səhv 3: prefiksin yanlış istifadəsi
<root xmlns:h="http://www.w3.org/TR/html4/">
<h:table>...</h:table>
<f:table>...</f:table> <!-- Səhv: f prefiksi elan edilməyib -->
</root>
Nəticə: Parser xətası: The prefix 'f' for element 'f:table' is not bound.
GO TO FULL VERSION