XML Namespaces - Domenii pentru nume in XML

Mihai Gabroveanu

Abstract

Domeniile pentru nume XML ofera o metoda simpla de calificare a numelor elementelor si atributelor folosite in documentele XML prin asocierea lor cu domenii pentru nume identificate prin adrese IRI


1. Introducere
2. Domeniile pentru nume XML
2.1. Definirea domeniilor de nume utilizand atributul xmlns
2.2. Definirea domeniilor multiple
2.3. Definirea domeniului implicit
2.4. Atribute
3. Bibliografie

1. Introducere

Domeniile de nume XML furnizeaza o metoda de reutilizare a marcajelor in documente, eliminad conflicte intre numele elementelor si atributelor folosite in oricare din marcaje. Prin conflict intelelegem ca un element (sau combinatie element/atribut) definit intr-un DTD are acelasi nume cu un element definit intr-un alt DTD.

Exemplu: Sa consideram urmatorul document XML ce reprezinta datele despre un curs.

<?xml version="1.0" ?>
<CURS>
    <NUME>Programare in XML</NUME>
    <SECTIA>Informatica</SECTIA>
    <AN>3</AN>
    <PROFESOR>
        <PERSOANA>
            <NUME>Mihai</NUME>
            <PRENUME>Gabroveanu</PRENUME>
            <AN>1976</AN>
        </PERSOANA>
    </PROFESOR>
</CURS>    

Se observa ca desi documentul este bine format (well-formed) sunt unele probleme cu acesta. Astfel, elemenul NUME este utilizat cu doua semnificatii diferite: o data reprezinta numele unui curs iar cea de-a doua oara reprezinta numele unei persoane. De asemenea, elementul AN in prima aparitie indica anul de studii iar in cea de-a doua reprezinta anul nasterii. Practic, este posibil ca la o prelucrare automata sa se faca confuzie intre aceste elemente ele apartinand la doua concepte diferite. Spunem ca avem un conflict de nume.

Pentru a rezolva astfel de probleme au fost introduse domeniile de nume (namespaces). Domeniile de nume identifica care elemente din document apartin aceluiasi vocabular XML.

2. Domeniile pentru nume XML

Pentru a putea face distinctie intre elementele ce reprezinta concepte (vocabulare) diferite le vom incardra pe fiecare intr-un domeniu de nume (namemespace). Fiecarui domeniu de nume ii vom asocia un URI unic.

Note

Un URI (Universal Resource Identifier) este o abstractizare a unui URL. In timp ce un URL identifica o locatie un URI identifica o resursa. De exemplu, un URI pentru o persona poate fi codul numeric personal. Asta nu insemana ca putem sa vizualizam o persoana in browser specificandu-i cnp-ul.

Acest URI nu poiteaza intotdeauna la un fisier anume. URI-ul defineste un domeniu de nume pur formal.

2.1. Definirea domeniilor de nume utilizand atributul xmlns

In exemplu anterior, elementele trebuie incadrate in doua domenii diferite: unul care refera multumea cursurilor si unul care refera multimea persoanelor.

Incadrarea unui element intr-un namespace se face printr-un prefix urmat de doua puncte :. Asocierea dintre prefix si namespace se face utilizand atributul xmlns in radacina elementului ce introduce conceptul. Sintaxa este urmatoarea:

<prefix:nume-element xmlns:prefix="NAME-SPACE-URI">
        <prefix:nume-copil>...</prefix:nume-copil>
        ... 
</prefix:nume-element>

Exemplu: Sa presupunem pentru exemplul anterior ca multimea cursurilor o in cadram in namespace-ul http://inf.ucv.ro/curs iar multimea persoanelor le incadram in namespace-ul http://inf.ucv.ro/persoana. Atunci fisierul XML devine:

<?xml version="1.0" ?>
<C:CURS xmlns:C="http://inf.ucv.ro/curs">
    <C:NUME>Programare in XML</C:NUME>
    <C:SECTIA>Informatica</C:SECTIA>
    <C:AN>3</C:AN>
    <C:PROFESOR>
        <P:PERSOANA xmlns:P="http://inf.ucv.ro/persoana">
            <P:NUME>Mihai</P:NUME>
            <P:PRENUME>Gabroveanu</P:PRENUME>
            <P:AN>1976</P:AN>
        </P:PERSOANA>
    </C:PROFESOR>
</C:CURS>
      

Se observa ca fiecare element al fiecarui concept este precedat de prefixul asociat namespace-ului corespunzator.

Numele elementelor precedate de prefix, adica cele de forma prefix:nume-element se numesc nume calificate, iar cele ce urmeaza dupa prefix se numesc nume locale.

2.2. Definirea domeniilor multiple

Sintaxa limbajlui XML permite definirea de namespace-uri multipe pentru un element. Sintaxa este urmatoarea:

<prefix:nume-element-radacina xmlns:prefix-1="NS-URI-1" ... xmlns:prefix-n="NS-URI-n">
       <prefix-1:nume-copil-ns-1>...</prefix-1:nume-copil-ns1>
        ....
            <prefix-n:nume-copil-ns-n>...</prefix-n:nume-copil-ns-n>
</prefix:nume-element-radacina>

unde prefix este un prefix ce identifica fie un namespace tocmai introdus, fie unul definit la unul din parintii elementului, fie poate sa lipseasca.

Exemplu: In exemplul anterior am definit ambele namespace-uri utilizate la nivelul elementului radacina:

<?xml version="1.0" ?>
<C:CURS xmlns:C="http://inf.ucv.ro/curs" xmlns:P="http://inf.ucv.ro/persoana">
    <C:NUME>Programare in XML</C:NUME>
    <C:SECTIA>Informatica</C:SECTIA>
    <C:AN>3</C:AN>
    <C:PROFESOR>
        <P:PERSOANA >
            <P:NUME>Mihai</P:NUME>
            <P:PRENUME>Gabroveanu</P:PRENUME>
            <P:AN>1976</P:AN>
        </P:PERSOANA>
    </C:PROFESOR>
</C:CURS>      

In general se recomanda ca toate namespace-urile utilizate intr-un document XML sa se declare la nivelul elementului radacina.

2.3. Definirea domeniului implicit

In documentele de dimensiuni mari in care majoriatea elementelor apartin aceluiasi namespace devine deranjata prefixarea tuturor tagurilor cu acelasi prefix. Aceasta problema poate fi rezolvata asignand un namespace implicit pentru un element si tuturor copiilor lui. Definirea namespace-ului implicit (default) se face utilizand atributul xmlns fara a fi urmat de nici un prefix. Elementul respectiv impreuna cu toti copii lui se considera ca fac parte din acel namespace implicit daca nu sunt precedati de un prefix. Sintaxa definirii acestuia este urmatoarea:

<nume-element xmlns="default-name-space-uri" xmlns:prefix-1="NS-URI-1" ... xmlns:prefix-n="NS-URI-n">
   ....
</nume-element>

Exemplu: Sa presupunem pentru exemplul anterior ca http://inf.ucv.ro/curs este namespace-ul default. Atunci avem:

<?xml version="1.0" ?>
<CURS xmlns="http://inf.ucv.ro/curs" xmlns:P="http://inf.ucv.ro/persoana">
    <NUME>Programare in XML</NUME>
    <SECTIA>Informatica</SECTIA>
    <AN>3</AN>
    <PROFESOR>
        <P:PERSOANA >
            <P:NUME>Mihai</P:NUME>
            <P:PRENUME>Gabroveanu</P:PRENUME>
            <P:AN>1976</P:AN>
        </P:PERSOANA>
    </PROFESOR>
</CURS>

2.4. Atribute

Deoarece atributele apartin unui element specificat, pentru ele nu exista pericolul confuziei in cazul elementelor similare din namespace-uri diferite. Astfel pentru atribute nu este obligatoriu sa specificam namespace-ul. Totusi pentru a fi consecventi sintaxa libajului XML permite specificarea namespace-ului prin prefixarea la fel ca la elemente cu numele lui.

Exemplu:

<?xml version="1.0" ?>
<C:CURS xmlns:C="http://inf.ucv.ro/curs" xmlns:P="http://inf.ucv.ro/persoana">
    <C:NUME>Programare in XML</C:NUME>
    <C:SECTIA>Informatica</C:SECTIA>
    <C:AN>3</C:AN>
    <C:PROFESOR>
        <P:PERSOANA P:cnp="176051116039">
            <P:NUME>Mihai</P:NUME>
            <P:PRENUME>Gabroveanu</P:PRENUME>
            <P:AN>1976</P:AN>
        </P:PERSOANA>
    </C:PROFESOR>
</C:CURS>

3. Bibliografie

  • Namespaces in XML 1.1 W3C Recommendation 4 February 2004, Tim Bray, Dave Hollander, Andrew Layman, Richard Tobin

  • Elliotte Rusty Harold, XML Bible. IDG Books Worldwide, Inc, 919 E. Hillsdale Blvd., Suite 400, Foster City, CA 94404

  • http://www.w3schools.com/xml/