Sunteți pe pagina 1din 13

XML Schema

XML Schema este cel mai popular limbaj pentru crearea de vocabulare XML. Reamintim c un
vocabular XML este un set de reguli ce stabilesc urmtoarele aspecte:
ce marcatori se pot folosi ntr-un document XML;
ce atribute pot s aib acei marcatori;
ce tipuri de date pot avea valorile atributelor i coninuturile textuale ale marcatorilor;
cum se pot mbina marcatorii ntre ei.
Regulile unui vocabular sunt suplimentare regulilor de bun formare, care sunt strict sintactice (ex.:
toate atributele s aib valori ntre ghilimele, s existe un element-rdcin unic etc.). Regulile unui
vocabular nu se refer doar la respectarea unor principii sintactice, ci stabilesc "dialectul", "limbajul"
n care se poate scrie un document XML.

Practic, regulile unui vocabular formeaz un LIMBAJ DE TIP XML: De exemplu HTML este un limbaj
de tip XML, la baza cruia stau reguli precum:
IMG s aib ca atribut obligatoriu SRC i ca atribute opionale ALT, HEIGHT etc.
Valorile atributelor HEIGHT, WIDTH s fie numerice
TD s apar obligatoriu n interiorul lui TR, i acesta n interiorul lui TABLE
HTML s conin HEAD i BODY, exact n aceast ordine
.a.m.d.
Toate aceste reguli aparin vocabularului XHTML i stau la baza limbajului HTML. Existena acestor
reguli face posibil ca browserele s se pun de acord asupra modului n care interpreteaz marcatorii
HTML.

Exist o multitudine de astfel de vocabulare, fiecare cu regulile sale. Spre exemplu tipul de fiier
.DOCX din Word este tot un limbaj de tip XML, numit WordML. Ca i HTML, acesta conine o serie de
marcatori prin care se descriu structura i formatrile prezente ntr-un fiier Word. La fel exist
vocabulare pentru fiiere Excel, Powerpoint etc. Exist i vocabulare pentru fiiere grafice (SVG),
pentru formule matematice (MathML), pentru descrierea de sunet (MusicXML) etc.

Un document ce respect regulile impuse de un vocabular este considerat valid n raport cu acel
vocabular (nu exist validitate absolut, ci doar relativ la vocabularul ales). De exemplu: un
document ce respect regulile HTML, va fi valid fa de regulile HTML (dar nu i fa de altele). n
concluzie:
regulile de bun formare sunt absolute (orice document XML trebuie s le respecte,
indiferent de marcatori/attribute)
regulile unui vocabular sunt relative (ele trebuie respectate doar de documentele ce vor fi
folosite de utilizatorii acelui vocabular).

Dup ce un vocabular se creeaz, prin definirea regulilor sale, acele reguli se fac publice i se
promoveaz pentru a permite oricui s creeze programe care pot procesa documente valide n raport
cu vocabularul respective. De exemplu: browserele nu sunt altceva dect programe capabile s
proceseze documente scrise conform cu vocabularul HTML; Word este un program capabil s
deschid documente scrise conform cu vocabularul WordML.; etc

Cu alte cuvinte, ciclul de via al vocabularelor este urmtorul:


Un vocabular se creeaz atunci cnd cineva definete un set de reguli pentru vocabular.
Acestea se pot crea cu DTD, XML Schema, Schematron i alte limbaje similare. n acest
seminar vom folosi XML Schema n Oxygen pentru a crea un vocabular;
Apoi vocabularul este publicat on-line i, dac restul lumii l consider util, va crea
documente valide n raport cu acel vocabular. Toat lumea care adopt vocabularul
respectiv va ti la ce s se atepte cnd primete un astfel de document. n acest seminar
vom crea unele documente pentru vocabularul nostru i le vom testa validitatea n raport cu
regulile sale;
Dac vocabularul devine suficient de popular, cei care l adopt vor ncepe s creeze
programe capabile s prelucreze documente de acel tip. De exemplu, browserele au aprut
din necesitatea de a afia ntr-un mod prietenos coninutul documentelor HTML. MS Word
exist din necesitatea de a permite utilizatorilor s lucreze cu fiiere WordML (.docx).
o n cele mai multe cazuri, utilizatorii nici nu ajung n contact cu marcatorii XML!
Utilizatorii MS Office rareori intr n contact cu codul WordML. Utilizatorii unui
browser rareori sunt interesai s vad codul surs al unei pagini HTML.
o Uneori vocabularul e creat de aceiai autori care creeaz i programele cu care se
proceseaz documentele vocabularului. De exemplu Microsoft a creat att
vocabularul WordML (.DOCX) ct i programul (Word) care poate deschide fiiere de
acel tip. Utilizatorii Word sunt cei care creeaz documentele!
o Alteori, creatorii vocabularului, ai documentelor i ai programelor sunt diferii!
Pentru HTML, vocabularul a fost creat de Consoriul Web (W3C), documentele
(paginile Web) sunt create de designerii Web, iar programele ce pot interpreta acele
documente (browserele) sunt create de productorii de browsere.
o Alteori, creatorii vocabularului, ai documentelor i ai programelor sunt aceiai!
Adesea ntr-un parteneriat ce include mai multe companii, acestea se pun de acord
asupra unui vocabular, apoi creeaz programe interne capabile s prelucreze
documente de acel tip, apoi ncep s schimbe ntre ele documente (de ex. rapoarte,
facturi) conforme cu acel vocabular.
Programele ce vor procesa documente XML se creeaz cu ajutorul funciilor specializate
pentru extragerea de informaii din XML. n acest seminar nu vom utiliza astfel de programe,
ele au fost studiate anterior (DOM, SimpleXMLElement etc.)

n general se spune c XML este un limbaj flexibil pentru c ne permite s folosim ce marcatori
dorim i ce atribute dorim. Realitatea este ns alta: XML nu e un limbaj, ci un set de reguli (de
bun formare) ce ne permit:
(a) s crem propriul limbaj (vocabular) cu ce marcatori/atribute dorim;
(b) apoi s crem documentele ce respect acel vocabular (folosind doar marcatorii/atributele
definite la primul pas);
(c) apoi s crem programe ce pot prelucra documente precum cele create la pasul anterior.

Cel mai popular limbaj pentru crearea de vocabulare este XML Schema. Oxygen ne permite s
utilitm acest limbaj n mod visual, fr a-l nva propriu-zis! Vom folosi n continuare Oxygen pentru
a crea un vocabular minimal, apoi documente valide conform cu acesta, pentru a avea o idee legat
de modul n care sunt create limbajele cu marcatori.
n continuare vom crea un vocabular (limbaj) pentru descrierea de comenzi ntr-un magazin de
comer electronic, cu urmtoarele reguli:

Elementul rdcin s fie Comanda:


Comanda s conin obligatoriu maxim 3 elemente Produs urmate de 1 element opional
Onorata:
o Fiecare Produs s aib 2 atribute obligatorii (CodProdus, Pret) i un nod text
obligatoriu (denumirea produsului);
CodProdus s aib valoare string unic ("cheie primar") de exact 5
caractere;
Pret s aib valoare numeric pozitiv ntreag;
Nodul text ce exprim denumirea s accepte doar una din valorile Televizor,
Calculator, Ipod;
o Onorata s conin un nod text obligatoriu, cu o valoare boolean, indicnd dac s-a
onorat comanda sau nu.

XML Schema se bazeaz pe noiunea de TIP, ceva mai larg dect la alte limbaje. TIPURILE pot fi:
TIP PREDEFINIT: aici intr orice tip de date clasic (string, integer, etc.) plus unele propuse de
XML Schema (ID = stringuri unice, Name = stringuri fr spaii, token = stringuri cu maxim un
spaiu ntre cuvinte, etc.);
TIP SIMPLU: aici intr orice subset al unui TIP PREDEFINIT (de ex. un interval de valori integer,
o list de stringuri prestabilite etc.) sau o combinaie (reuniune) ntre astfel de subseturi;
TIP COMPLEX: un astfel de tip este o combinaie de marcatori mpreun cu atributele i
coninuturile lor, ce se dorete a fi reutilizat (deci o structur XML reutilizabil).

Crearea unui vocabular are fazele:


Se creeaz TIPURI, n care se stocheaz regulile vocabularului
Se definesc marcatori i atribute corespunztoare acelor TIPURI. n general TIPURILE SIMPLE
i PREDEFINITE se leag de atribute i/sau noduri text, iar cele COMPLEXE se leag de
marcatori.
n felul acesta, regulile unui vocabular devin modulare regulile se pot edita separat de marcatori.

Obs: n general se evit crearea unui TIP pentru elementul rdcin, avnd n vedere unicitatea lui,nu
se prea pune problema reutilizrii sale. Sunt totui situaii n care i structura rdcinii se poate
reutiliza ducnd la recursivitate, cnd copiii rdcinii motenesc structura rdcinii, nepoii la fel, etc.
ramificnd arborele DOM n maniera fractalilor, teoretic la infinit. Practic nu se merge la infinit dac
structurii recursive i se aloc un caracter opional (astfel nct nodurile de pe ultimul nivel s poat s
nu mai conin nimic).
Faza 1. Planificarea tipurilor

Tipurile se definesc n manier bottom-up, pornind de la nodurile simple ale viitoarelor documente
(atributele i nodurile text). n cazul de fa avem nevoie de:

1. Tipuri pentru atribute:


CodProdus: avem nevoie de un TIP SIMPLU, obinut prin: restricia "maxim 5 caractere"
aplicat TIPULUI PREDEFINIT ID (valoare string unic);
Pret: avem nevoie de TIPUL PREDEFINIT "numere pozitive ntregi"

2. Tipuri pentru nodurile simple (care conin doar text, fr atribute):


Pentru denumirile de produse: avem nevoie de un TIP SIMPLU, obinut prin: enumerarea a 3
valori prestabilite (Televizor, Calculator, Ipod), fiecare avnd TIPUL PREDEFINIT string;
Onorat: avem nevoie de TIPUL PREDEFINIT boolean.

3. Tipuri pt noduri complexe (care conin i altceva dect text atribute sau elemente copil):
Produs: avem nevoie de o structur alctuit din atribute (CodProdus, Pret) i denumirea
produsului ca nod text. Pentru toate 3 vom avea deja tipuri definite de la punctele
precedente)
Comanda: chiar dac e un element complex, faptul c e rdcin atrage dup sine faptul c
va fi unic! Deci nu are sens reutilizarea structurii sale, deci nu are sens crearea unui TIP
(exist totui situaii n care TIPUL rdcinii e reutilizat: atunci cnd dorim s permitem
documente recursive, unde rdcina poate conine elemente similare ei nsi; nu e cazul
aici)

Ca regul general:
TIPURILE SIMPLE se creeaz pentru atribute sau elemente ce vor conine doar text;
TIPURILE COMPLEXE se creeaz pentru elemente care pot avea i altceva n afar de coninut
textual (atribute sau elemente copil).
Faza 2. Crearea vocabularului

Crem n Oxygen un fiier de tip XML Schema. Spre deosebire de documentele XML, vocabularele n
Oxygen pot fi create cu un foarte comod n mod vitzual (modul Design) fr a cunoate neaprat
limbajul XML Schema!

n modul Design, cea mai mare parte din munc se realizeaz n meniul click dreapta, cu primele
dou opiuni:
New Global ne permite s construim TIPURILE;
Edit Attributes ne permite s configurm TIPURILE sau alte componente ale vocabularului

Avertismente:
Edit Attributes NU se refer la atributele XML, ci la diverse proprieti configurabile n
Oxygen (e o coinciden de denumire care risc s v duc n eroare);
Panoul Attributes din dreapta ofer de obicei aceleai opiuni cu Edit Attributes.
Faza 3. Crearea tipurilor

Se ncepe cu TIPURILE SIMPLE, ntr-o abordare bottom-up, de la simplu la complex:

TIPUL SIMPLU pentru denumirile de produse:


click dreapta New Global Simple Type
dm tipului un nume (ModelDenumiri)
Trebuie s-i spunem din ce TIP PREDEFINIT l vom crea, i ce filtru vom aplica:
click dreapta pe ModelDenumiri Edit Attributes
n jumtatea de sus a ferestrei alegem TIPUL PREDEFINIT: Base Type = xs:string
n seciunea Facets definim filtrul: Enumerations, apoi cu click dreapta Add adugm pe
rnd valorile permise

TIPUL SIMPLU pentru CodProdus:


click dreapta (pe grupul SCHEMA) New Global Simple Type
dm tipului numele ModelCoduri
click dreapta pe ModelCoduri Edit Attributes
TIPUL PREDEFINIT: BaseType=xs:ID
filtru: length 5
TIPUL COMPLEX pentru Produs:
click dreapta pe SCHEMA New Global Complex Type;
dm tipului un nume (ModelProduse)
Mai nti ne ocupm de coninutul textual al viitoarelor Produse:
click dreapta pe ModelProduse Edit Attributes;
alegem TIPUL coninutului: BaseType = ModelDenumiri (iat cum integrm TIPURILE SIMPLE
ntr-o structur de TIP COMPLEX); precizarea acestui tip va impune i obligativitatea
denumirii (fiind definit clar lista de valori, nu e permis irul vid, deci absena coninutului!)
Apoi ne ocupm de atribute:
click dreapta pe ModelProduse Append Child Attribute
dm atributului un nume (CodProdus), apoi ne ocupm de el:
o alegem TIPUL atributului: Type=ModelCoduri (de unde va moteni toate restriciile)
o alegem obligativitatea: Use = required
click dreapta pe ModelProduse Append Child Attribute
dm atributului nume: Pret:
o i alegem TIPUL PREDEFINIT: Type=xs:positiveInteger
o alegem obligativitatea: Use=required

n acest moment toate TIPURILE sunt create:


Faza 4. Crearea rdcinii

Click dreapta pe SCHEMA New Global Element


i dm nume: Comanda

Structura intern va fi o SECVEN = ir de elemente ntr-o anumit ordine

click dreapta pe Comanda Append Child Sequence


click dreapta pe SECVEN Append Child Element
o i dm nume: Produs;
click dreapta pe SECVEN Append Child Element
o i dm nume: Onorata

Le stabilim limitele de ocuren, caracterul opional (min.ocur.=0) sau obligatoriu (min.ocur.=1),


precum i TIPUL coninutului:

click dreapta pe Produs Edit Attributes:


o TIP coninut: Type=ModelProduse
o Min.Occur. =1, Max.Occur.=3 (obligatoriu, maxim de 3 ori)
click dreapta pe Onorata Edit Attributes:
o TIP: Type=xs:boolean
o Min.Occur.=0, Max.Occur.=1 (opional, maxim o dat)

Vocabularul final arat astfel:

Tipurile

Vocabularul propriu-zis

n modul Text putei vizualiza codul surs. Se poate observa pe codul surs c limbajul XML Schema
este el nsui un vocabular XML!

Salvm vocabularul cu numele vocabular.xsd


Faza 5. Validarea
Crem un document XML nou. De data aceasta, la creare apsm Customize pentru a indica
vocabularul, n caseta Schema URL.

nc de la creare, documentul va conine un element Produs, iar rdcina va fi nsoit de o serie de


atribute ce indic unde s-a salvat vocabularul (noNamespaceSchemaLocation, calea fiierului va fi
diferit pe calculatoarele voastre i trebuie pstrat i n exemplele urmtoare!):

<?xml version="1.0" encoding="UTF-8"?>


<Comanda xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="file:/C:/Users/2/Documents/vocabular.xsd">
<Produs CodProdus="" Pret=""></Produs>
</Comanda>

Prezena unui Produs vid e explicabil prin caracterul su obligatoriu. Cnd un document e construit
pe baza unui vocabular, se pot genera automat o serie de noduri obligatorii sau valori implicite.

La apsarea butonului de validare primim numeroase erori:

Putem testa pe rnd regulile vocabularului, scriind un document corect, apoi nclcnd regulile una
cte una, pentru a ne convinge de efectul acestora.
Urmtorul este un document valid:

<?xml version="1.0" encoding="UTF-8"?>


<Comanda xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="file:/C:/Users/......aici sa aveti calea vocabularului ">
<Produs CodProdus="aaaaa" Pret="2">Televizor</Produs>
<Produs CodProdus="bbbbb" Pret="4">Ipod</Produs>
<Produs CodProdus="ccccc" Pret="10">Ipod</Produs>
</Comanda>

Dei lipsete elementul Onorata, nu e o problem, acesta fiind definit cu caracter opional. Nici faptul
c valoarea Ipod se repet nu e o problem, important e s nu se ias din lista de valori permise. Tot
valid e i urmtorul document:

<?xml version="1.0" encoding="UTF-8"?>


<Comanda xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="file:/C:/Users/......aici sa aveti calea vocabularului ">
<Produs CodProdus="aaaaa" Pret="2">Televizor</Produs>
<Onorata>true</Onorata>
</Comanda>

Posibil subiect de examen: s primii un vocabular i un document i s gsii invaliditile.

Faza 6. Modificarea vocabularelor


Nu e obligatoriu ca la crearea unui vocabular s se lucreze cu TIPURI, aa cum am lucrat n acest mod.
Se pot impune toate restriciile direct pe nodurile vocabularului, fr a mai crea tipuri.
Totui, tipurile ofer avantaje legate de reutilizare i modularitate:

mai multe atribute/elemente pot s aib acelai tip, deci aceeai gam de valori/structur
intern permis (vezi exemplul urmtor);
se pot crea tipuri din alte tipuri (s-a vzut deja cum ModelProduse include ModelDenumiri i
ModelCoduri);
se pot aduce modificri la un tip fr a afecta restul vocabularului (vezi mai jos).

De exemplu, n cazul de fa dorim urmtoarele modificri:

Codurile de produse s aib structura: litera P, urmat de exact 3 cifre, urmate de cel puin
nc un caracter oarecare.
n loc de Onorata s poat s mai apar un grup de maxim 3 elemente ProdusIndisponibil,
cu aceeai structur intern ca i elementele Produs.

Pentru a modifica structura codurilor de produse e suficient s modificm TIPUL ModelCoduri


modificarea se va propaga peste tot n vocabular unde avem atribute (sau elemente!) de acest tip.

Click dreapta pe ModelCoduri Edit Attributes


Renunm la restricia length=5 (din panoul Facets)
n locul ei folosim restricia pattern = P[0-9]{3}.+

Iat o calitate foarte important a XML Schema posibilitatea de a constrnge valori cu expresii
regulate!

Expresia regulat exprim exact structura pe care o doream: s nceap cu P, s urmeze un caracter
din intervalul [0-9] repetat de exact 3 ori, apoi un caracter oarecare repetat minim o dat (punctul e
lociitor pt un caracter, + e indicator de repetiie cu obligativitate: minim o dat)

Pentru a preciza c elementul Onorata poate fi ALTERNAT cu un grup de elemente


ProdusIndisponibil, nlocuim Onorata cu un nod de tip CHOICE:

Click dreapta pe noul de tip Secven din Comanda Append Child Choice
De nodul Choice se vor lipi toate alternativele ntre care oferim posibilitatea de a alege:
o cum Onorata va fi una din variante, o tragem cu mouseul pn se lipete de nodul
Choice
o click dreapta pe nodul Choice Append Child Element i denumim noul element
cu numele ProdusIndisponibil.

Mai trebuie doar s precizm c ProdusIndisponibil reutilizeaz aceeai structur ca i elementele


Produs, apoi s-i stabilim ocurenele:

click dreapta pe ProdusIndisponibil Edit Attributes


o Min.Occurs=1, Max. Occurs=3
o Type=ModelProduse
Forma final a vocabularului va fi urmtoarea:

Un exemplu de document valid ar fi urmtorul:

<?xml version="1.0" encoding="UTF-8"?>


<Comanda xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="file:/C:/Users/......aici sa aveti calea vocabularului">
<Produs CodProdus="P999xx" Pret="200">Televizor</Produs>
<Produs CodProdus="P1111" Pret="50">Ipod</Produs>
<ProdusIndisponibil CodProdus="P123q" Pret="400">Calculator</ProdusIndisponibil>
</Comanda>

Dar documentul de mai jos?

<?xml version="1.0" encoding="UTF-8"?>


<Comanda xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation=" file:/C:/Users/......aici sa aveti calea vocabularului ">
<Produs CodProdus="P999xx" Pret="200">Televizor</Produs>
</Comanda>

i acesta e valid, chiar dac lipsesc att ProdusIndisponibil ct i Onorata! Asta din cauz c Choice ne
permite s alegem ntre 1-3 elemente ProdusIndisponibil i 0-1 elemente Onorata. Practic lipsa prii
de dup Choice nseamn c am optat pentru Onorata dar am profitat de caracterul opional i nu l-
am mai pus deloc.
Faza 7. Validarea n PHP

Majoritatea limbajelor de programare, inclusiv PHP, ofer facilitatea de validare XML Schema, dac
au acces att la vocabular (fiierul XML Schema) ct i la documentul XML. ntr-un scenariu realist, de
obicei vocabularul este stocat undeva pe server, iar documentul XML sosete de la o organizaie
partener. nainte de a ncepe prelucrarea sa, un script PHP trebuie s verifice mai nti dac
documentul sosit e conform cu regulile vocabularului. n continuare vom presupune c att
vocabularul ct i documentul sosit au fost deja salvate pe serverul nostru.

Pentru un astfel de exemplu, avei de nevoie de sistemul client-server XAMPP instalat, cu serverul
Apache pornit i fiierele de mai jos salvate n htdocs.

Pas1. n htdocs, salvai mai nti vocabularul anterior creat n Oxygen (cu ultimele modificri), ntr-un
fiier numit vocabular.xsd:

Pas2. n acelai folder, salvai urmtorul document XML, ntr-un fiier cu numele document.xml:

<?xml version="1.0" encoding="UTF-8"?>


<Comanda>
<Produs CodProdus="P999xx" Pret="200">Televizor</Produs>
<Produs CodProdus="P1111" Pret="50">Ipod</Produs>
<ProdusIndisponibil CodProdus="P123q" Pret="400">Calculator</ProdusIndisponibil>
</Comanda>

Pas3. n acelai folder, creai scriptul care realizeaz validarea, salvat cu numele validare.php:

<?php
$doc=new DOMDocument();
$doc->load('document.xml');
print $doc->schemaValidate('vocabular.xsd');
?>

La executarea scriptului prin localhost, vei primi rezultatul 1, care semnific validitatea
documentului. nlocuii codul primului produs cu "x999xx" i vei primi rezultatul 0, mpreun cu
erorile de validare:

faptul c noul cod nu respect expresia regulat (nu ncepe cu P)


faptul c TIPUL ModelCoduri nu a fost respectat (din aceeai cauz, cci eroarea se propag
n toate tipurile care se bazau pe ea).