Limbajul XML utilizeaza o structura de marcaje (etichete/tag-uri) similara cu cea a limbajului HTML (HyperText Markup Language). Totusi, rolul acestor marcaje este diferit in cele doua limbaje. Daca in cazul limbajului HTML marcajele definesc modul de afisare a datelor, in cazul limbajului XML marcajele permit descrierea datelor. De asemenea, limbajul XML nu impune un set fix de marcaje, precum limbajul HTML.
Intr-un document XML pot fi utilizate urmatoarele constructii: elemente, atribute, comentarii, entitati, sectiuni CDATA, instructiuni de procesare, spatii.
Elemente
Documentele XML sunt alcatuite din unitati informationale numite elemente. Un element este specificat explicit prin intermediul a doua marcaje (un marcaj de inceput si un marcaj de final). Numele unui element delimitat prin simboluri de tip <, > constituie un marcaj. Marcajul de final poate fi identificat printr-un slash, /, plasat inaintea numelui elementului. Tot in categoria marcajelor pot fi incluse si alte constructii, precum: entitatile, comentariile, delimitatorii pentru sectiunile CDATA, declaratiile tipului de document, instructiunile de procesare si declaratiile XML.
Elementele XML pot fi vide, in cazul in care nu contin nimic intre marcaje, sau pot include un text si/sau alte elemente. In interiorul unui document XML, elementele definesc o structura ierarhica asemanatoare unui arbore, care reflecta atat structura logica a datelor, cat si continutul stocat.
Cateva exemple simple de elemente sunt urmatoarele:
<nume>Virgil Popescu</nume> <grupa/> <grupa></grupa> <medie>9.5</medie>
Relatiile dintre elementele XML pot fi vazute in termeni de:
• incluziune: un element poate include alte elemente;
• ierarhie: un element inclus se mai numeste si copil, in timp ce elementul plasat la nivel imediat superior poarta numele de parinte;
• grupare: un element parinte grupeaza elementele plasate la nivel inferior;
• secventa: elementele aflate pe acelasi nivel genereaza o secventa.
Elementele dintr-un document XML trebuie sa respecte cateva reguli de baza:
• un element trebuie sa detina atat un marcaj de inceput, cat si un marcaj de final; exceptie de la aceasta regula fac elementele vide, in cazul in care sunt introduse prin intermediul unei forme simplificate <element/>;
• elementele XML sunt case-sensitive <EleMent>text</EleMent>;
• marcajele nu pot include spatii inaintea denumirii elementelor < element>text</ element>;
• pentru un element, numele celor doua marcaje trebuie sa fie identice;
• marcajele trebuie imbricate corect; marcajul de final al unui element copil trebuie sa preceada marcajul de final al elementului parinte corespunzator;
• numele unui element poate sa contina litere, cifre, semne uzuale (_, -, .) si trebuie sa inceapa cu o litera sau caracterul _; numele elementelor care incep cu sirul de caractere xml sunt rezervate;
• orice document trebuie sa contina un singur element radacina (element document).
Exemplele urmatoare prezinta cazuri de nerespectare a acestor reguli:
<student> <numE>Virgil Popescu</nume> < grupa>1.2</ grupa> <media>9.5</medie> <student><nume>Virgil Popescu<grupa>1.1</grupa></student></nume>
Un document este bine format, daca respecta regulile de sintaxa stabilite in specificatiile XML.
Un document XML este valid, daca este bine format si contine in plus o definitie a tipului de document (DTD – Document Type Definition) sau o schema XML, care defineste modelul documentului (structura marcajelor documentului).
Atribute
In limbajul XML, atributele sunt utilizate pentru a asocia elementelor perechi de nume si valori. Atributele ofera informatii suplimentare cu privire la elementele XML. Atributele sunt intotdeauna continute in marcajul de inceput al unui element XML, dupa numele elementului.
Definirea atributelor pentru elementele XML trebuie sa tina seama de urmatoarele reguli:
• pentru un element nu pot fi definite doua atribute care sa aiba acelasi nume;
• nu pot fi introduse doua valori pentru acelasi atribut;
• numele atributelor sunt case-sensitive;
• precizarea unei valori pentru un atribut este obligatorie;
• valorile atributelor sunt delimitate prin ghilimele, ” “, sau prin apostrofuri, ‘ ‘;
• valorile atributelor nu pot contine caracterele utilizate pentru delimitare; in schimb, pot fi utilizate entitati predefinite, precum " si ', daca este necesara includerea unor delimitatori in valoarea atributelor;
• valorile atributelor nu pot contine caracterul &, cu exceptia inserarii unor referinte (caracter sau entitate);
• valorile atributelor nu pot include caracterul <.
In mod similar limbajului HTML, in XML putem considera urmatorul element ce contine mai multe atribute.
<img src="image.png" width="640" height="480" alt="test image" /> |
Daca renuntam la atribute, linia precedenta poate fi rescrisa folosind elemente copil.
<img> | |
<src>image.png</src> | |
<width>640</width> | |
<height>480</height> | |
<alt>test image</alt> | |
</img> |
Intr-un astfel de caz, poate fi luata in discutie urmatoarea intrebare: cand sa utilizam atribute si cand sa utilizam elemente copil? In mod normal, nu exista reguli clare cu privire la utilizarea atributelor. Totusi, se impune urmatoarea precizare: este de preferat stocarea datelor in elemente si stocarea metadatelor (informatii care descriu datele) in atribute.
Atributele pot fi utilizate pentru a retine id-uri (identificatori unici), referinte, legaturi URL si alte informatii care nu prezinta relevanta imediata pentru cititor.
<?xml version="1.0" encoding="UTF-8"?> | |
<!-- Studenti inscrisi la cursul Sisteme de Baze de Date --> | |
<lista_studenti> | |
<student id="1"> | |
<nume>Virgil Popescu</nume> | |
<email>virgil.popescu@virtualcampus.ro</email> | |
<grupa>1.1</grupa> | |
<medie>9.5</medie> | |
</student> | |
<student id="2"> | |
<nume>Catalin Calinovici</nume> | |
<email>catalin.calinovici@virtualcampus.ro</email> | |
<grupa>1.1</grupa> | |
<medie>7.2</medie> | |
</student> | |
<student id="3"> | |
<nume>Oana Demeter</nume> | |
<email>oana.demeter@virtualcampus.ro</email> | |
<grupa>1.2</grupa> | |
<medie>8.4</medie> | |
</student> | |
<student id="4"> | |
<nume>Irina Almajan</nume> | |
<email>irina.almajan@virtualcampus.ro</email> | |
<grupa>1.2</grupa> | |
<medie>9.1</medie> | |
</student> | |
</lista_studenti> |
Pentru stocarea datelor in XML, in general, este preferata utilizarea elementelor. Cateva din motivele care sustin afirmatia precedenta sunt urmatoarele: elementele XML permit reprezentarea datelor structurate, in timp ce atributele nu ofera aceasta optiune; fiind mult mai flexibile, elementele XML pot fi extinse mult mai usor; atributele nu pot include valori multiple; unele aplicatii prezinta limitari in ceea ce priveste manipularea atributelor (de exemplu, limitarea numarului de atribute selectate).
Un alt exemplu de rescriere a atributelor unui element pentru o stocare mai eficienta a datelor este urmatorul. In prima faza data este retinuta prin intermediul atributului date al elementului mail. Daca informatia de tip data calendaristica este stocata ca si atribut, accesarea doar a unei parti a datei (zi, luna, an) este destul de complexa. Mai mult, daca avem in vedere formatul in care este retinuta aceasta informatie, putem presupune ca persoane din diferite parti ale globului vor interpreta diferit data.
<?xml version="1.0"?> | |
<mail date="12.03.2019"> | |
<to>webmaster@virtualcampus.ro</to> | |
<from>virgil.popescu@virtualcampus.ro</from> | |
<subject>Test mail</subject> | |
<body /> | |
</mail> |
Limbajul XML pune la dispozitie si atribute predefinite: xml:lang, xml:space. Primul precizeaza limba in care este scris continutul unui element, inclusiv valorile atributelor elementului. Valorile alocate acestui atribut trebuie sa se conformeze unor specificatii, precum ISO-639, pentru coduri de limba de doua litere, si ISO-3166, pentru a include si subcoduri de doua litere corespunzatoare unei anumite regiuni. Cel de-al doilea atribut, xml:space, este utilizat pentru a specifica daca procesarea se realizeaza fara a afecta spatiile – spatiu, tab, linie vida, rand nou (de exemplu, pentru texte care contin cod sursa). Specificand valoarea preserve pentru atributul xml:space se poate asigura o mai buna vizualizare a continutului unui document XML.
<subject xml:lang="en">Test mail</subject> <subject xml:lang="en-GB">Test mail</subject>
Comentarii
Comentariile pot aparea in orice zona a unui document XML, in afara altor marcaje, si au rolul de a descrie sau exclude portiuni din document. Chiar daca un document XML este autodescriptiv, comentariile sunt necesare pentru o mai buna intelegere a rolului si structurii constructiilor documentului.
La fel ca si in limbajul HTML, comentariile XML sunt introduse prin marcajul <!– si se incheie cu –>. Comentariile XML pot avea orice lungime si nu pot contine secventa de caractere –.
<?xml version="1.0"?> | |
<!-- structura utilizata pentru stocarea unui mesaj --> | |
<mail> | |
<to>webmaster@virtualcampus.ro</to> | |
<!-- elementul <from> precizeaza cine este autorul mesajului --> | |
<from>virgil.popescu@virtualcampus.ro</from> | |
<subject>Test mail</subject> | |
<body /> | |
<date> | |
<day>12</day> | |
<month>03</month> | |
<year>2019</year> | |
</date> | |
</mail> |
Dupa cum precizam si mai inainte, comentariile pot fi utilizate si pentru a exclude portiuni dintr-un document XML, fara a le indeparta. O astfel de situatie este prezentata in documentul urmator, unde elementul student identificat prin atributul id cu valoarea 3 este marcat ca si comentariu. Procesoarele XML pot oferi aplicatiilor acces la comentarii, desi acest lucru nu este obligatoriu.
<?xml version="1.0" encoding="UTF-8"?> | |
<!-- Studenti inscrisi la cursul Sisteme de Baze de Date --> | |
<lista_studenti> | |
<student id="1"> | |
<nume>Virgil Popescu</nume> | |
<email>virgil.popescu@virtualcampus.ro</email> | |
<grupa>1.1</grupa> | |
<medie>9.5</medie> | |
</student> | |
<student id="2"> | |
<nume>Catalin Calinovici</nume> | |
<email>catalin.calinovici@virtualcampus.ro</email> | |
<grupa>1.1</grupa> | |
<medie>7.2</medie> | |
</student> | |
<!-- | |
<student id="3"> | |
<nume>Oana Demeter</nume> | |
<email>oana.demeter@virtualcampus.ro</email> | |
<grupa>1.2</grupa> | |
<medie>8.4</medie> | |
</student> | |
--> | |
<student id="4"> | |
<nume>Irina Almajan</nume> | |
<email>irina.almajan@virtualcampus.ro</email> | |
<grupa>1.2</grupa> | |
<medie>9.1</medie> | |
</student> | |
</lista_studenti> |
Entitati
Conform specificatiilor standardului XML, un document poate fi alcatuit dintr-un numar de unitati de stocare a datelor, denumite entitati, care sunt identificate prin intermediul unui nume unic. O unitate poate fi orice, de la un singur caracter la un intreg document sau chiar o referinta la un alt document.
Entitatile sunt reprezentari simbolice ale datelor. Ele sunt utilizate in diverse situatii, precum:
• impartirea documentelor de mare intindere in sectiuni;
• folosirea unor portiuni de continut in diferite zone ale unui document sau chiar in alte documente;
• accesarea unor caractere ASCII complexe ©.
Entitatile au nume specifice alocate de catre dezvoltatori. Cu exceptia entitatii document, toate entitatile dintr-un document XML trebuie mai intai definite prin intermediul unei declaratii a tipului de document (interna sau externa) sau prin intermediul unei scheme XML.
O entitate este creata in interiorul unei declaratii a tipului de document. Sintaxa generala a unei entitati XML este urmatoarea:
<!ENTITY numeEntitate "text care inlocuieste entitatea">
Sintaxa unei referinte la o entitate cuprinde caracterul &, urmat de numele entitatii, care la randul lui este urmat de caracterul ;.
&numeEntitate;
Un prim exemplu de utilizare a entitatilor se refera la utilizarea unei semnaturi in cadrul mesajelor trimise prin email. In acest exemplu, entitatea signature este definita chiar in documentul XML in care este utilizata (entitate interna).
<?xml version="1.0"?> | |
<!DOCTYPE mail [ | |
<!ENTITY signature "Yours Sincerely, Virgil Popescu"> | |
]> | |
<mail> | |
<to>webmaster@virtualcampus.ro</to> | |
<from>virgil.popescu@virtualcampus.ro</from> | |
<subject>Test mail</subject> | |
<body> | |
<signature>&signature;</signature> | |
</body> | |
</mail> |
Entitatile pot fi clasificate dupa modul de procesare in doua categorii:
• entitati parsate: contin text in format XML, sub forma de marcaje sau date; pot fi procesate prin intermediul unui parser XML;
• entitati neparsate: reprezinta resurse care nu sunt destinate procesarii; pot sau nu sa contina text; de asemenea, continutul nu este obligatoriu in format XML; exemple de entitati neparsate sunt documentele in format binar (imagini, audio, video).
O alta clasificare a entitatilor are in vedere locatia:
• entitati interne: sunt localizate in interiorul unui document XML; fiecare document XML contine cel putin o entitate interna (elementul radacina corespunzator entitatii document); entitatea document constituie punctul de plecare in procesarea unui document XML si poate contine intregul document;
• entitati externe: reprezinta resurse localizate in afara documentului XML care urmeaza a fi procesat; entitatile externe pot fi atat documente XML, cat si documente non XML, neparsate; entitatile externe sunt incluse in timpul procesarii prin intermediul referintelor la aceste entitati.
De asemenea, entitatile pot fi clasificare dupa utilizare in:
• entitati generale: sunt definite in DTD-uri sau scheme XML si sunt utilizate pentru a construi documentele XML asociate;
• entitati parametru: sunt definite in DTD-uri sau scheme XML si sunt utilizate pentru a construi declaratii in DTD-uri sau scheme XML.
Entitatile externe permit referirea unui fisier extern intr-un document XML. Entitatile externe pot contine text sau date binare. Daca o entitate externa contine text, continutul fisierului extern este inserat la locatia referintei la entitate si procesat ca si parte a documentului XML care contine referinta. Datele binare continute de o entitate externa nu sunt procesate. Ele pot fi referite doar ca si valoare a unui atribut.
Consideram un document XML (curs.xml) care descrie cursul Managementul Bazelor de Date. In documentul XML definim o entitate externa, numita tutor, care permite includerea continutului unui alt document XML (tutor.xml).
<?xml version="1.0" encoding="UTF-8"?> | |
<!-- curs.xml --> | |
<!DOCTYPE curs [ | |
<!ENTITY tutor SYSTEM "tutor.xml"> | |
]> | |
<curs> | |
<disciplina>Managementul Bazelor de Date</disciplina> | |
<facultate>Electronica, Telecomunicatii si Tehnologii Informationale</facultate> | |
<master>Ingineria Datelor</master> | |
<anstudiu>1</anstudiu> | |
<semestru>2</semestru> | |
&tutor; | |
</curs> |
Limbajul XML pune la dispozitie cinci entitati predefinite, care pot fi utilizate pentru a inlocui caracterele corespunzatoare entitatilor, in situatia in care acestea nu sunt permise. De exemplu, valoarea unui atribut nu poate contine caracterul <, deoarece procesoarele XML il asociaza inceputului unui marcaj. In aceasta situatie poate fi utilizata o referinta la entitate, <, in locul caracterului <.
Caracter | Referinta entitate |
---|---|
< | < ; |
> | > ; |
& | & ; |
“ | " ; |
‘ | &apos ; |
Un tip special de entitati il constituie referintele la caractere (referintele numerice la caractere). Referintele la caractere sunt utilizate pentru a include in documentele XML caractere speciale. In functie de format, referintele la caractere pot fi de tip zecimal &#nnnn sau de tip hexazecimal &#xhhhh, unde nnnn si hhhh reprezinta un cod in format zecimal, respectiv hexazecimal, corespunzator unui caracter.
Caracter | Entitate | Referinta cod zecimal | Referinta cod hexazecimal |
---|---|---|---|
€ | euro | € ; | € ; |
¢ | cent | ¢ ; | ¢ ; |
£ | Pound | £ ; | £ ; |
¥ | yen | ¥ ; | ¥ ; |
§ | sect | § ; | § ; |
< | lt | < ; | < ; |
> | gt | > ; | > ; |
& | amp | & ; | & ; |
“ | quot | " ; | " ; |
‘ | apos | ' ; | ' ; |
© | copy | © ; | © ; |
® | reg | ® ; | ® ; |
Σ | sigma | Σ ; | Σ ; |
™ | trade | ™ ; | ™ ; |
<?xml version="1.0" encoding="UTF-8"?> <word> côté is the French word for "side." </word>
Sectiuni CDATA
Sectiunile CDATA (sectiuni de marcare) sunt utilizate pentru a inhiba procesarea unor portiuni de text care contin caractere necesare pentru marcare. Textul care nu face parte dintr-un marcaj reprezinta date caracter. Marcajele (marcaje de inceput, marcaje de final, marcaje pentru elemente vide, referinte la entitati, referinte la caractere, comentarii, delimitatori pentru sectiuni CDATA, declaratii de tip de document, instructiuni de procesare) sunt ignorate de catre procesoarele XML si tratate ca si date caracter, daca sunt delimitate prin intermediul sectiunilor de marcare.
Sintaxa generala a unei sectiuni de marcare are urmatoarea forma:
<![CDATA[ Sectiune ignorata de procesoarele XML. ]]>
In interiorul unei sectiuni CDATA nu este permisa aparitia sirului de caractere ]], daca este urmat de caracterul >. De asemenea, sectiunile CDATA nu pot contine alte sectiuni CDATA (nu pot fi imbricate).
Un exemplu tipic de utilizare a sectiunilor CDATA il constituie realizarea unui tutorial care cuprinde portiuni din documente XML.
<?xml version="1.0"?> | |
<tutorial> | |
Acesta este un exemplu de document XML care utilizeaza referinte la entitati. | |
<![CDATA[ | |
<?xml version="1.0"?> | |
<!DOCTYPE mail [ | |
<!ENTITY signature "Yours Sincerely, Virgil Popescu"> | |
]> | |
<mail> | |
<to>webmaster@virtualcampus.ro</to> | |
<from>virgil.popescu@virtualcampus.ro</from> | |
<subject>Test mail</subject> | |
<body> | |
<signature>&signature;</signature> | |
</body> | |
</mail> | |
]]> | |
</tutorial> |
Instructiuni de procesare
O instructiune de procesare reprezinta un tip special de marcaj, care contine informatii pentru anumite aplicatii. Instructiunile de procesare sunt transmise de procesorul XML direct catre aplicatii.
Sintaxa generala a unei instructiuni de procesare este urmatoarea:
<?aplicatie date_instructiune_procesare?>
Instructiunile de procesare sunt delimitate de sirurile de caractere <?, ?>. Numele unei instructiuni de procesare nu poate incepe cu sirul de caractere xml (indiferent de forma), acesta fiind rezervat de catre Consortiul W3C pentru standardizari ulterioare.
Declaratia XML este un caz particular, standardizat, de instructiune de procesare, fiind utilizata de catre procesorul XML. Alte instructiuni de procesare standardizate pot fi utilizate pentru a preciza clientilor web cum sa afiseze continutul unui document XML.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> | |
<?xml-stylesheet type="text/css" href="style.css"?> | |
<articol> | |
<titlu>Instructiuni de procesare</titlu> | |
<autor>M. Cubos</autor> | |
<data>09.11.2020</data> | |
<rezumat>O instructiune de procesare reprezinta un tip special de marcaj, | |
care contine informatii pentru anumite aplicatii. Instructiunile de | |
procesare sunt transmise de procesorul XML direct catre aplicatii.</rezumat> | |
</articol> |