Documente Academic
Documente Profesional
Documente Cultură
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
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:
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).
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:
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
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!
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.
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:
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:
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).
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.
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)
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.
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:
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: