Elemente de tip simplu
In genaral, continutul unei schema XML consta din declaratii de elemente, care la randul lor pot include alte elemente sau date caracter. Un element care contine doar date caracter si care nu detine atribute se numeste element simplu sau element de tip simplu, in timp ce un element care contine alte elemente sau care detine atribute se numeste element complex sau element de tip complex.
Declararea unui element de tip simplu se face precizand atributul type in marcajul de inceput al elementului xsd:element. Valoarea atributului type pentru un element simplu poate fi orice tip de date predefinit sau orice tip de date simplu, definit de utilizator.
<xsd:element name="nume_element" type="tip_date_element" /> |
Dupa cum se poate observa din exemplele anterioare, declararea unui element simplu se poate face si fara atributul type, in cazul in care xsd:element contine un element de tip xsd:simpleType care defineste tipul de date. In aceasta situatie, spunem ca avem o definitie anonima pentru un tip de date.
Limbajul XML Schema pune la dispozitie o serie de constructii speciale pentru manipularea elementelor si atributelor. Aceste constructii sunt cunoscute sub denumirea de indicatori si pot fi clasificate in trei categorii:
• indicatori de aparitie: minOccurs, maxOccurs; specifica numarul de aparitii pentru un element;
• indicatori de ordine: all, sequence, choice; specifica ordinea elementelor;
• indicatori de grupare: group, attributeGroup; permit definirea de grupuri de elemente sau atribute.
Pentru a controla numarul de aparitii al unui element intr-un anumit context, pot fi utilizati indicatorii de aparitie minOccurs (indica numarul minim de aparitii) si maxOccurs (indica numarul maxim de aparitii). Daca acesti indicatori nu sunt precizati, sub forma de atribute ale elementului xsd:element, atunci elementul definit va aparea o singura data. Deci, valoarea implicita pentru minOccurs si maxOccurs este 1. Atributul maxOccurs poate detine valoarea unbounded, in cazul in care numarul de aparitii este nedefinit.
<?xml version="1.0" encoding="UTF-8"?> | |
<studenti xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://virtualcampus.ro studenti.xsd"> | |
<student> | |
<nume>Virgil Popescu </nume> | |
<email>virgil.popescu@gmail.com</email> | |
<email>popiv@virtualcampus.ro</email> | |
<grupa>1.1</grupa> | |
<medie>9.5</medie> | |
</student> | |
<student> | |
<nume>Catalin Calinovici </nume> | |
<email>catalin.calinovici@virtualcampus.ro</email> | |
<grupa>1.1</grupa> | |
<medie>7.2</medie> | |
</student> | |
</studenti> |
Singurul tip de date complex predefinit, in XML Schema, este xsd:anyType. Aceste tip de date este alocat automat unui element, daca atributul type lipseste si declaratia elementului nu include un tip de date anonim. Un element care este declarat prin intermediul tipului complex xsd:anyType, poate contine date caracter, precum si elemente si atribute.
<xsd:element name="nume_element" type="xsd:anyType" /> <xsd:element name="nume_element" />
Tipul xsd:anyType reprezinta tipul de baza pentru toate tipurile de date din schemele XML. Toate tipurile de date predefinite, definite de utilizator sau complexe sunt derivate din xsd:anyType.
Daca un tip de date simplu este definit prin intermediul elementului xsd:simpleType, un tip de date complex utilizeaza o structura asemanatoare, elementul xsd:complexType. Un tip complex contine un model de continut, care prezinta elementele permise, modul de aranjare si numarul de aparitii al acestora.
Indicatori de ordine
Definirea unui model de continut se realizeaza cu ajutorul indicatorilor de ordine: xsd:all, xsd:sequence, xsd:choice. Acesti indicatori sunt utilizati pentru a controla ordinea de aparitie a elementelor, astfel:
• xsd:all elementele copil pot aparea in orice ordine; implicit, toate elementele copil apar o singura data; totusi, exista posibilitate de a face anumite elemente copil optionale, prin utilizarea indicatorului de aparitie minOccurs cu valoarea 0;
<?xml version="1.0" encoding="UTF-8"?> | |
<studenti xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://virtualcampus.ro studenti2.xsd"> | |
<student> | |
<nume>Virgil Popescu </nume> | |
<matricol>LK1723</matricol> | |
<medie>9.5</medie> | |
<grupa>1.1</grupa> | |
</student> | |
<student> | |
<matricol>LK2105</matricol> | |
<nume>Catalin Calinovici </nume> | |
<grupa>1.1</grupa> | |
</student> | |
</studenti> |
• xsd:sequence elementele copil trebuie sa apara in cadrul elementului parinte in ordinea specificata;
<?xml version="1.0" encoding="UTF-8"?> | |
<!-- carti.xml --> | |
<carti xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="carti.xsd"> | |
<carte> | |
<titlu>Cel mai iubit dintre pamanteni</titlu> | |
<autor>Marin Preda</autor> | |
<pagini>573</pagini> | |
<pret>48.20</pret> | |
</carte> | |
<carte> | |
<titlu>Razboi si anti razboi</titlu> | |
<autor>Alvin Toffler</autor> | |
<autor>Heidi Toffler</autor> | |
<pagini>340</pagini> | |
</carte> | |
</carti> |
• xsd:choice doar unul din elementele copil care apartin unui astfel de grup poate aparea la un moment dat.
<?xml version="1.0" encoding="UTF-8"?> | |
<!-- carti2.xml --> | |
<carti xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="carti2.xsd"> | |
<carte> | |
<titlu>Cel mai iubit dintre pamanteni</titlu> | |
<autor>Marin Preda</autor> | |
<pagini>573</pagini> | |
<pret>48.20</pret> | |
<beletristica/> | |
</carte> | |
<carte> | |
<titlu>Razboi si anti razboi</titlu> | |
<autor>Alvin Toffler</autor> | |
<autor>Heidi Toffler</autor> | |
<pagini>340</pagini> | |
<politica/> | |
<diverse/> | |
</carte> | |
</carti> |
Pentru a controla numarul de aparitii al unui grup de elemente, care a fost definit cu ajutorul indicatorilor de ordine, pot fi utilizati indicatorii de aparitie (minOccurs si maxOccurs). Acestia sunt introdusi sub forma de atribute pentru elementele xsd:all, xsd:sequence si xsq:choice.
Elemente de tip complex
Elementele de tip complex pot contine elemente, date caracter si atribute si pot fi clasificate astfel:
• elemente vide cu sau fara atribute;
• elemente care contin doar alte elemente; pot detine atribute;
• elemente care contin atat elemente, cat si date caracter; elementele cu continut mixt pot detine atribute;
• elemente care contin doar date caracter; pot detine atribute.
Pentru a exemplifica cele patru clase de elemente de tip complex mai intai sunt trecute in revista modalitatile de declarare a atributelor, intr-o schema XML.
Declararea unui atribut, intr-o schema XML, se realizeaza cu ajutorul elementului xsd:attribute. In mod similar elementelor care contin doar date caracter, atributele sunt tipuri simple. Tipul de date corespunzator valorii unui atribut poate fi precizat prin intermediul atributului type al elementului xsd:attribute si poate fi reprezentat de orice tip de date simplu, predefinit sau definit de utilizator.
<xsd:attribute name="nume_atribut" type="tip_atribut" /> |
Din declaratiile anterioare, poate fi observat faptul ca tipul de date pentru un atribut poate fi precizat explicit, cu ajutorul atributului type, sau implicit, prin definirea unui nou tip de date simplu in interiorul elementului xsd:attribute.
Declaratia unui atribut mai poate include o serie de optiuni definite prin atribute ale elementului xsd:attribute:
• default: stabileste o valoare implicita pentru atribut, care este atribuita automat daca nu este specificata o alta valoare;
• use: specifica un mecanism de control al aparitiei atributului in elementul pentru care este definit; poate detine urmatoarele valori: optional (atributul este optional), required (atributul trebuie inclus) si prohibited (atributul nu poate fi inclus); valoarea implicita a optiunii use este optional;
• fixed: stabileste o valoare fixa pentru atribut, care este atribuita automat; optiunile default si fixed sunt incompatibile.
<xsd:attribute name="status" type="xsd:string" use="required" /> |
Un element vid (element fara continut), cu sau fara atribute, este declarat prin intermediul elementului pentru definirea unui tip complex, xsd:complexType . Un element fara continut nu detine un model de continut.
<xsd:element name="nume_element"> | |
<xsd:complexType> | |
</xsd:complexType> | |
</xsd:element> |
Definitia tipului complex nu poate fi omisa in acest caz, deoarece elementul nu ar mai fi unul vid, ci unul de tip anyType.
<imagine sursa="logo.gif"/> |
Un element al carui continut este reprezentat de elemente copil este declarat printr-o definitie de tip complex, care include un model de continut. Elementul parinte poate detine in acest caz si atribute. Modelul de continut este specificat cu ajutorul indicatorilor de aparitie (xsd:all, xsd:sequence, xsd:choice) si descrie elementele copil permise, precum si modul de aranjare si numarul de aparitii al acestora.
<xsd:element name="nume_element"> | |
<xsd:complexType> | |
<!-- model continut --> | |
... | |
</xsd:complexType> | |
</xsd:element> |
Si in acest caz tipul elementului poate fi precizat implicit, prin definirea unui nou tip de date complex, sau explicit, prin intermediul atributului type al ementului xsd:element.
Schemele XML ofera un control mult mai bun in descrierea continutului mixt (orice combinatie de date caracter si elemente). Declaratia unui element cu continut mixt este asemanatoare cu declaratia unui element care contine doar elemente copil.
Singura diferenta este reprezentata de adaugarea atributului mixed=”true” la definitia tipului complex.
<xsd:element name="nume_element"> | |
<xsd:complexType mixed="true"> | |
<!-- model continut --> | |
... | |
</xsd:complexType> | |
</xsd:element> |
In urmatorul exemplu, elementul nume poate contine orice combinatie de date caracter si elemente copil (prenume). Elementul prenume este utilizat pentru a marca mult mai precis anumite parti ale numelui unei persoane.
<?xml version="1.0" encoding="UTF-8"?> | |
<studenti xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://virtualcampus.ro studenti3.xsd"> | |
<student matricol="LK1723"> | |
<nume><prenume>Virgil</prenume><prenume>Cosmin</prenume>Popescu</nume> | |
<medie>9.5</medie> | |
<grupa>1.1</grupa> | |
</student> | |
<student matricol="LK2105"> | |
<nume><prenume>Catalin</prenume>D. Calinovici</nume> | |
<grupa>1.1</grupa> | |
</student> | |
</studenti> |
Un element care contine doar date caracter (si/sau atribute) este condiderat ca fiind un element cu continut simplu. Declaratia unui astfel de element presupune utilizarea unei noi structuri de tip XML schema, xsd:simpleContent, si extinderea sau limitarea unui tip de baza pentru continutul simplu, prin intermediul elementelor xsd:extension sau xsd:restriction.
<xsd:element name="nume_element"> | |
<xsd:complexType> | |
<xsd:simpleContent> | |
<xsd:extension base="tip_de_baza"> | |
... | |
</xsd:extension> | |
</xsd:simpleContent> | |
</xsd:complexType> | |
</xsd:element> |
Elementul xsd:simpleContent specifica derivarea unui nou tip de date complex, dintr-un tip simplu, in detrimentul construirii unui model de continut. Declaratia atributului este inclusa in elemente de tip xsd:extension sau xsd:restriction , pentru a arata ca operatia de extindere sau limitare este realizata prin adaugarea unui atribut.
<carte isbn="2543-2353-2322-1">Cel mai iubit dintre pamanteni</carte> |
Urmatorul exemplu include toate cele patru tipuri de declaratii de elemente complexe.
<?xml version="1.0"?> | |
<produse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="produse.xsd"> | |
<monitor status="in stoc"> | |
<id_produs>1223</id_produs> | |
<denumire>LCD W1934S-BN</denumire> | |
<marca>LG</marca> | |
<pret valuta="ron">459</pret> | |
<culoare valoare="negru"/> | |
<descriere> | |
19 LG <bold>W1934S-BN</bold>, 5 ms, 1440x900, 1000:1, <italic>black</italic> | |
</descriere> | |
</monitor> | |
<laptop> | |
<id_produs>243</id_produs> | |
<denumire>HP Pavilion DV6-1310eq</denumire> | |
<marca>HP</marca> | |
<pret valuta="ron">3400</pret> | |
</laptop> | |
</produse> |
Indicatori de grupare
Indicatorii de grupare sunt utilizati in schemele XML pentru a realiza grupuri de elemente sau atribute: xsd:group, xsd:attributeGroup. Grupurile definite cu ajutorul indicatorilor de grupare pot fi referite intr-o schema XML prin cuvantul cheie ref. Orice grup de elemente sau atribute detine un nume, prin intermediul caruia poate fi referit.
<?xml version="1.0"?> | |
<personal xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="personal.xsd"> | |
<tutor departament="Comunicatii" id="1241"> | |
<nume>Cornel Donea</nume> | |
<cnp>1630803626343</cnp> | |
<adresa> | |
<strada>1 Decembrie 1918</strada> | |
<oras>Timisoara</oras> | |
</adresa> | |
<grad>Sef lucrari</grad> | |
<cursuri>PMM TIM RC</cursuri> | |
</tutor> | |
<administrativ departament="Teleuniversitatea" id="634"> | |
<nume>Dragos Cornea</nume> | |
<cnp>1750911365236</cnp> | |
<adresa> | |
<strada>Ardealului</strada> | |
<oras>Timisoara</oras> | |
</adresa> | |
<functie>tehnician</functie> | |
</administrativ> | |
</personal> |
Definirea unui grup de elemente necesita prezenta indicatorilor de ordine (xsd:all, xsd:sequence, xsd:choice).
<xsd:group name="nume_grup_elemente"> | |
<!-- model grup elemente --> | |
... | |
</xsd:group> | |
<xsd:group ref="nume_gup_elemente"/> |
Un set de atribute care este utilizat in mai multe declaratii de elemente poate fi organizat sub forma unui grup de atribute, prin intermediul indicatorului de grupare attributeGroup.
<xsd:attributeGroup name="nume_grup_atribute"> | |
<!-- lista declaratii atribute --> | |
... | |
</xsd:attributeGroup> | |
<xsd:attributeGroup ref="nume_grup_atribute" /> |
Exemplul de mai jos introduce un document XML care descrie personalul unei organizatii. Apar doua zone relevante pentru discutia anterioara: un grup de atribute (departament, id), denumit marca, si un grup de elemente (nume, cnp, adresa), denumit persoana.
In schemele XML, grupurile de elemente si atribute ofera posibilitatea reutilizarii anumitor structuri.
Adnotari
Adnotarile sunt utilizate in schemele XML pentru a oferi o serie de informatii suplimentare persoanelor sau aplicatiilor care acceseaza documentul. Adnotarile sunt introduse cu ajutorul elementului annotation, care in functie de destinatie poate include elemente documentation sau appInfo.
<xsd:element name="titlu"> | |
<xsd:annotation> | |
<xsd:documentation> | |
titlul unei carti din librarie | |
</xsd:documentation> | |
</xsd:annotation> | |
... | |
</xsd:element> |
Intr-o schema XML pot fi precizate referinte la alte scheme XML, atata timp cat acestea respecta specificatiile XML schema. In felul acesta, intr-o schema XML pot fi folosite elemente și atribute care au fost declarate in alte scheme XML.
Pentru a referi scheme XML intr-un document de tip XML Schema trebuie avute in vedere doua aspecte importante, și anume: utilizarea unor spatii de nume definite corespunzator și crearea unor prefixe diferite pentru aceste spatii de nume.
<?xml version="1.0"?> | |
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" | |
xmlns:xs="https://virtualcampus.ro/mda/schema1.xsd" | |
xmlns:xss="https://virtualcampus.com/xml_schema/schema2.xsd"> | |
... | |
</xsd:schema> |