Spatiile de nume XML (XML namespaces) ofera o metoda simpla de desemnare a numelor elementelor si atributelor folosite in documentele XML, prin asocierea lor cu adrese URI (Uniform Resource Identifier). Se asigura astfel o modalitate de reutilizare a denumirilor in documente XML, chiar daca exista conflicte intre numele elementelor sau atributelor. Conflictele de nume se refera la aparitia mai multor elemente sau atribute din surse diferite, care au acelasi nume.
Consideram urmatorul document XML, document care descrie cursurile din cadrul unei facultati.
<?xml version="1.0" encoding="UTF-8"?> | |
<!-- cursuri1.xml --> | |
<cursuri> | |
<curs> | |
<titlu>Modele de date avansate</titlu> | |
<an>1</an> | |
<semestru>1</semestru> | |
<tutori> | |
<tutor> | |
<titlu>Sl.dr.ing.</titlu> | |
<nume>Maria Popescu</nume> | |
<birou>226</birou> | |
</tutor> | |
</tutori> | |
</curs> | |
<curs> | |
<titlu>Programare pentru ingineria datelor</titlu> | |
<an>1</an> | |
<semestru>2</semestru> | |
<tutori> | |
<tutor> | |
<titlu>Conf.dr.ing.</titlu> | |
<nume>Dan Bota</nume> | |
<birou>619</birou> | |
</tutor> | |
<tutor> | |
<titlu>As.dr.ing.</titlu> | |
<nume>Iulia Enache</nume> | |
<birou>221</birou> | |
</tutor> | |
</tutori> | |
</curs> | |
</cursuri> |
Se poate observa ca in documentul precedent elementul titlu este utilizat atat pentru a defini gradul didactic corespunzator unui tutor, cat si pentru a specifica denumirea unui curs. Acest document introduce un conflict de nume. Un procesor XML nu va face diferenta intre cele doua elemente care poarta numele titlu. Pentru rezolvarea acestei probleme putem stabili o conventie de nume, prin care elementele care au rol in descrierea unui curs sunt precedate de prefixul c, iar cele care descriu un tutor sunt precedate de prefixul t. Conflictele de nume pot fi evitate foarte usor folosind prefixe pentru elemente si atribute.
Pentru a face distinctie intre elemente care reprezinta concepte diferite, le vom asocia cate un spatiu de nume. Un spatiu de nume este o entitate abstracta, un grup de denumiri care participa la definirea unui concept.
Fiecare spatiu de nume este identificat prin intermediul unui URI unic (denumirea spatiului de nume). De asemenea, un spatiu de nume detine un prefix, care inlocuieste URI-ul in documentul XML. Spatiile de nume pot fi declarate in elementele in care sunt utilizate sau in elementul radacina al documentului XML.
<?xml version="1.0" encoding="UTF-8"?> | |
<!-- cursuri2.xml --> | |
<c:cursuri xmlns:c="https://www.idata.upt.ro/cursuri/master/curricula/" | |
xmlns:t="https://www.etc.upt.ro/personal/"> | |
<c:curs> | |
<c:titlu>Modele de date avansate</c:titlu> | |
<c:an>1</c:an> | |
<c:semestru>1</c:semestru> | |
<c:tutori> | |
<t:tutor> | |
<t:titlu>Sl.dr.ing.</t:titlu> | |
<t:nume>Maria Popescu</t:nume> | |
<t:birou>226</t:birou> | |
</t:tutor> | |
</c:tutori> | |
</c:curs> | |
<c:curs> | |
<c:titlu>Programare pentru ingineria datelor</c:titlu> | |
<c:an>1</c:an> | |
<c:semestru>2</c:semestru> | |
<c:tutori> | |
<t:tutor> | |
<t:titlu>Conf.dr.ing.</t:titlu> | |
<t:nume>Dan Bota</t:nume> | |
<t:birou>619</t:birou> | |
</t:tutor> | |
<t:tutor> | |
<t:titlu>As.dr.ing.</t:titlu> | |
<t:nume>Iulia Enache</t:nume> | |
<t:birou>221</t:birou> | |
</t:tutor> | |
</c:tutori> | |
</c:curs> | |
</c:cursuri> |
In marcajul de inceput al elementului radacina am definit doua atribute xmlns, care prezinta urmatoarea sintaxa generala:
xmlns:prefix = "URI"
Fiecare din aceste atribute constituie o declaratie a unui spatiu de nume. Prefixul nu are o semnificatie anume, el reprezinta doar o referinta catre denumirea spatiului de nume (URI). URI-ul califica numele elementelor si atributelor si asigura unicitatea acestora. In cele mai multe cazuri, URI-ul ia forma unei adrese URL. Consortiul W3C recomanda utilizarea adreselor URL pentru definirea spatiilor de nume. Un URI (Uniform Resource Identifier) este o abstractizare a unui URL. In timp ce un URL identifica o locatie, un URI identifica o resursa.
Un element XML poate contine un spatiu de nume implicit, pentru care nu este necesara precizarea unui prefix. Chiar daca pentru un element pot fi declarate mai multe spatii de nume, unul singur poate fi implicit. Spatiul de nume implicit se aplica elementului in care este declarat, daca acesta nu detine un prefix, dar si elementelor fara prefix continute in elementul care introduce spatiul de nume implicit.
Prin stabilirea unui spatiu de nume implicit pentru elementul cursuri, documentul XML anterior va avea urmatoarea forma:
<?xml version="1.0" encoding="UTF-8"?> | |
<!-- cursuri3.xml --> | |
<cursuri xmlns="https://www.idata.upt.ro/cursuri/master/curricula/" | |
xmlns:t="https://www.etc.upt.ro/personal/"> | |
<curs> | |
<titlu>Modele de date avansate</titlu> | |
<an>1</an> | |
<semestru>1</semestru> | |
<tutori> | |
<t:tutor> | |
<t:titlu>Sl.dr.ing.</t:titlu> | |
<t:nume>Maria Popescu</t:nume> | |
<t:birou>226</t:birou> | |
</t:tutor> | |
</tutori> | |
</curs> | |
<curs> | |
<titlu>Programare pentru ingineria datelor</titlu> | |
<an>1</an> | |
<semestru>2</semestru> | |
<tutori> | |
<t:tutor> | |
<t:titlu>Conf.dr.ing.</t:titlu> | |
<t:nume>Dan Bota</t:nume> | |
<t:birou>619</t:birou> | |
</t:tutor> | |
<t:tutor> | |
<t:titlu>As.dr.ing.</t:titlu> | |
<t:nume>Iulia Enache</t:nume> | |
<t:birou>221</t:birou> | |
</t:tutor> | |
</tutori> | |
</curs> | |
</cursuri> |
Elementul cursuri apartine spatiului de nume implicit, care este specificat prin intermediul adresei web https://www.idata.upt.ro/cursuri/master/curricula/.
Mai mult, elementul curs impreuna cu toate elementele sale copil, titlu, an, semstru si tutori, mostenesc spatial de nume implicit, deoarece nu contin nici o declaratie a unui spatiu de nume. Elementul tutor si toate elementele sale copil sunt prefixate si apartin unui alt spatiu de nume, https://www.etc.upt.ro/personal/. Spatiile de nume implicite sunt utilizate pentru a obtine documente XML mult mai clare.