CATEGORII DOCUMENTE |
XML SCHEMA
Spatiul WWW actualmente este compus din pagini (documente) marcate in limabaje precum HTML (HyperText Markup Language), WML (Wireless Markup Language), SVG (Scalable Vector Graphics), continand informatii textuale, grafice si/ sau multimedia destinate a fi citite si intelese esentialmente de catre consumatorii umani. Principala activitate a calculatoarelor este acea de a reda aceste continuturi si nu sa le interpreteze intr-o maniera automata si autonoma. Informatiile trebuie regasite intr-un mod inteligent si trebuie sa poata fi procesate de catre masina. Conform creatorului spatiului WWW, Tim Berners-Lee, Web-ul semantic reprezinta o panza consistenta si logica a tuturor resurselor de pe Web, accentul punandu-se pe interpretarea datelor de catre masina si nu pe reprezentarea lor. In cadrul unui scenariu vizionar, prezentat in "Berners-Lee, Hendler&Lassile, 2001", se prefigureaza modul cum dispozitive inteligente partajeaza cunostinte privitoare la propriile functionalitati si la contextul in care isi desfasoara activitatea, utilizand reguli de inferenta si meta-date pentru a gasi sau regasi informatiile solicitate de utilizatorii umani.
Web-ul semantic cuprinde standarde si utilitare ca XML, XML Schema, RDF, RDF Schema, RSS si OWL.
. XML este un standard pentru descrierea structurii
documentelor
. XML Schema este un limbaj ce impune constrangeri asupra structurii
documentelor XML
. RDF este datamodel pentru obiecte ( resurse ) si relatiile dintre ele utilizand
sintaxa XML
. RDF Schema este un vocabular pentru descrierea proprietatilor si claselor
resurselor RDF, cu o semantica pentru generalizarea/ ierarhizarea acestora
. RSS este un format structurat de distributie electronica a informatiilor
prin Internet sau in cadrul retelelor Intranet, un format XML pentru folosirea comuna a continutului web
. OWL adauga noi elemente de vocabular pentru descrierea propritatilor si
claselor: among others, relatii intre clase - disjointness, cardinalitate -
exactly one, egalitate, simetrie, etc.
Toate tehnologiile oferite de Semantic Web se bazeaza pe XML - eXtensible Markup Language) a carui istorie incepe in urma cu aproape 40 de ani. El poate fi vazut ca nivelul sintactic care se gaseste la baza web-ului semantic.
La mijlocul anilor 60, IBM a format un grup de cercetare condus de Charles Goldfarb care sa incerce sa rezolve problema incompatibilitatii documentelor editate cu ajutorul unor tehnologii diverse. Ideea lui a fost simpla si consistenta: nu modul cum arata un document este important, ci structura sa. Aceasta trebuie evidentiata printr-un set de 'marcaje'. Insa cum fiecare tip de document isi are propria structura, a fost inventat un 'meta-limbaj' de marcare -- adica un limbaj care descrie limbaje de marcare specifice tipurilor de continut. Asa cum o piesa de teatru poate fi descrisa ca o succesiune de acte constand din succesiuni de scene constand din replici rostite de personaje, asa si o factura sau un contract isi are propria structura specifica. Dupa standardizare, meta-limbajul s-a numit SGML (Standard Generalized Markup Language) aparut in anii 80. Acest limbaj isi propunea la aparitie sa creeze documente ce pot fi analizate de catre masini prin introducerea de marcaje (sau taguri), fiind prima incercare de definire a marcajului generalizat; este de fapt un metalimbaj, deoarece el defineste modul in care orice limbaj de marcare dat poate fi specificat formal. SGML nu a fost un succes deoarece era foarte complex si astfel crearea de programe care sa-l analizeze.
In anii 90 la CERN a aparut HTML-ul (HyperText Markup Language). La baza acestui limbaj a fost SGML-ul si scopul sau a fost marcarea documentelor astfel incat sa poata fi transmise prin retea. Una din ideile de baza era ca browserele trebuie sa ignore marcajele si atributele pe care nu le inteleg. Aceasta idee a avut ca efect aparitia unui limbaj mai simplu care sa poata fi parsat rapid de catre browsere. Si astfel s-a dezvoltat HTML-ul.
Succesul avut de Web a cauzat o dezvoltare rapida a browserelor care analizau marcajele HTML. Astfel au aparut o gama larga de marcaje si atribute care puteau fi scrise fara prea multe constrangeri. Browserele au trebuit sa tina cont de aceste constrangeri si au devenit foarte complexe. Pe de alta parte s-a sesizat utilizarea HTML-ului pentru adnotarea documentelor si o slabiciune de-a sa - faptul ca nu se pot adauga marcaje noi.
In acest context in decembrie 1997 W3C (World Wide Web Consortium [2]) a lansat ca recomandare propusa versiunea 1.0 de XML. In acest document se afirma ca XML este un subset al SGML care pastreaza caracteristici cum ar fi posibilitatea crearii de marcaje, posibilitatea de validare, posibilitatea de a fi citit si inteles de catre oameni. Totodata se afirma ca XML este creat pentru a fi folosit pentru adnotari, schimb de date, publicare documente si prelucreare automata de catre clienti (agenti) inteligenti. Pastrand un subset al SGML impreuna cu un set de constrangeri documentele XML vor putea fi prelucrate foarte rapid de catre parsere neavand limitele date de complexitatea SGML.
XML este un limbaj care nu proceseaza in nici un fel datele sau informatia. Menirea lui principala este doar de a formata si structura informatia. Informatia structurata cu ajutorul XML va fi citita si interpretata ulterior in acelasi fel, indiferent de dispozitiv, fie el mobil, palmtop, PC sau Mac. Unele dintre cele mai importante avantaje ale XML - ului sunt :
o XML structureaza datele (informatiile)
Prin date structurate intelegem lucruri ca spreadsheets, liste de contacte, parametri de configuratie, tranzactii financiare sau desene tehnice. XML este un set de reguli (poti sa le consideri si conventii) pentru a crea formate text care iti permit sa structurezi datele. XML nu este un limbaj de programare si nu trebuie sa fii programator pentru a-l invata si folosi. Cu XML, unui calculator ii este usor sa genereze si sa citeasca datele, cat si sa se asigure ca structura datelor este corecta. XML evita problemele obisnuite ale limbajelor de programare: este extensibil, independent de platforma si suporta internationalizarea si localizarea. XML este complet compatibil cu Unicode.
o XML seamana putin cu HTML
Ca si HTML, XML foloseste tags-uri
(cuvinte cuprinse in ' <' si '> ') si attribute (de forma nume = 'valoare'
). Pe cand HTML
specifica ce inseamna fiecare tag si atribut, si deseori cum va aparea textul
marcat cu acestea in browser, XML foloseste taguri doar pentru a delimita
bucati de date, lasand interpretarea acestor date cu totul in seama aplicatiei
care le citeste. Cu alte cuvinte, daca vezi ' <p> ' intr-un
fisier XML, nu trebuie sa presupui ca este un paragraf. In functie de context,
poate fi un pret, un parametru, o persoana (sau un cuvant care nici macar nu
incepe cu p).
o XML este text dar nu e facut pentru a fii citit
Programe care produc spreadsheets, liste de contacte si alte tipuri de date structurate deseori pastreaza datele pe hard, folosind un format binar sau text. Un avantaj al formatului text este ca permite utilizatorului, daca este necesar, sa vizualizeze fisierul fara a folosi programul care l-a produs. Adica poti citi datele (textul) cu editorul tau de text preferat. De asemenea, formatul text face debugging-ul mai usor pentru developeri. Ca si HTML, fisierele XML sunt fisiere pe care utilizatorii nu sunt obligati sa le citeasca, dar pot face acest lucru daca au nevoie. Comparat cu HTML, regulile XML permit mai putine variatii. Un tag uitat sau un atribut fara ghilimele face un fisier XML inutilizabil, pe cand in HTML acest lucru este permis. Specificatia XML interzice unei aplicatii sa incerce sa ghiceasca ce a vrut sa faca creatorul unui fisier XML gresit. Daca apare greseala, aplicatia trebuie sa opreasca citirea si sa raporteze o eroare.
o XML este "vorbaret" prin design
Deoarece XML este un format text si foloseste taguri pentru a delimita datele, fisierele XML sunt aproape intotdeuna mai mari decat formatele binare. Designerii XML au luat aceasta decizie pentru motive bune. Avantajele formatului text sunt evidente (vezi punctul 3), iar dezavantajele pot fi de obicei compensate la un alt nivel. Spatiul pe disk este mai ieftin decat era in trecut. Programe de compresie ca zip si gzip pot comprima fisierele foarte bine si foarte rapid. In plus, protocoluri de comunicare ca protocolul modem si HTTP/ 1.1, protocolul de baza al web-ului, pot comprima datele din mers, economisind bandwidth-ul la fel de bine ca formarul binar.
o XML este o familie de tehnologii
XML 1.0 este specificatia care defineste ce sunt tagurile si atributele. Mai departe de XML 1.0, 'familia XML' este un set de module (in continua crestere) care ofera servicii folositoare pentru indeplinirea unor lucruri importante si folosite deseori. XLink descrie un mod standard de a adauga hyperlinkuri unui fisier XML. XPointer este o sintaxa in dezvoltare, folosita la identificarea unor parti dintr-un document XML. Un XPointer este asemanator cu un URL, dar in loc sa indice un document web, indica o parte dint-un fisier XML. CSS, limbajul style sheet, se poate aplica la XML la fel ca la HTML. XSL este limbajul avansat style sheet. Este bazat pe XSLT, un limbaj de transformare folosit pentru a rearanja, adauga sau sterge taguri si atribute. DOM este un set standard de functii pentru manipularea fisierelor XML (si HTML) dintr-un limbaj de programare. XML Schemas 1 si ajuta developerii sa defineasca precis structura fisierelor XML, in formatul creat de ei. Alte module si utilitati sunt inca in dezvoltare.
o XML e nou dar nu chiar atat de nou
Dezvoltarea XML a inceput in 1996 si XML a devenit o recomandare W3C din Februarie 1998, ceea ce te poate face sa crezi ca este o tehnologie tanara. De fapt, aceasta tehnologie nu e chiar atat de noua. Inaintea XML-ului a fost SGML, creat la inceputul anilor '80, standard ISO din 1986, si folosit pe scara larga pentru proiecte de documentatie mari. Dezvoltarea HTML a inceput in 1990. Designerii XML-ului au preluat cele mai bune parti din SGML, folosind si experienta oferita de HTML, si au produs ceva nu mai putin puternic decat SGML, dar cu mult mai regulat si mai usor de folosit. Unele evolutii insa sunt greu de distins de revolutii Aici trebuie spus ca in timp ce SGML este folosit in principal pentru documentatii tehnice si mai putin pentru alte feluri de date, in cazul XML se intampla exact contrariul.
o XML transforma HTML in XHTML
Exista o importanta aplicatie XML care are format de document: XHTML, succesorul HTML-ului. XHTML are multe din elementele HTML-ului. Sintaxa a fost schimbata un pic pentru a corespunde regulilor XML. Un format bazat pe XML mosteneste sintaxa XML si o constrange in mai multe feluri (spre exemplu, XHTML permite folosirea ' <p> ', dar nu a ' <r> '); totodata, se adauga inteles sintaxei (XHTML spune ca ' <p> ' inseamna 'paragraph', si nu 'pret', 'persoana' sau altceva).
o XML este modular
XML iti permite sa definesti un nou format de document combinand si refolosind alte formate. Deoarece cele doua formate pot folosi elemente sau atribute cu acelasi nume, trebuie sa ai grija la combinarea lor (inseamna ' <p> ' 'paragraf' dintr-un format, sau 'persoana' din celalalt format?). Pentru a elimina confuzia, XML are un mecanism numit namespace (domenii pentru nume). XSL si RDF sunt exemple de formate bazate pe XML care folosesc namespace-uri. XML Schema este conceputa cu acest suport pentru modularizare. Aceasta modularizare la nivelul definirii unui document XML face posibila combinarea a doua scheme pentru a forma o a treia, care defineste un document combinat (combinatie de documente definite de cele doua scheme initiale).
o XML functioneaza pe orice platforma, este suportat bine si nu are nevoie de nici o licenta
Alegand XML pentru un proiect, vei putea folosi un numar mare de aplicatii (este posibil ca una dintre ele sa poata face deja ce ai tu nevoie) si vei avea acces la o comunitate de ingineri experimentati care te pot ajuta. A folosi XML este asemanator cu a alege SQL pentru baza de date: tot trebuie sa-ti construiesti baza ta de date si programele (si procedurile) care iti permit sa o folosesti, dar exista si multe unelte gata facute si o multitudine de oameni care te pot ajuta. Si pentru ca nu trebuie licenta pentru a folosi XML, nu trebuie sa platesti nimic nimanui. Comunitatea mare de persoane care folosesc XML inseamna ca nu depinzi de un sigur producator.
o XML este baza RDF-ului si WEB-ului Semantic
Resource Description Framework (RDF), al W3C, este un format XML text care suporta descrierea resurselor si aplicatiilor meta-date, cum ar fi playlist-uri pentru muzica, colectii foto si bibliografii. Spre exemplu, RDF iti poate permite sa identifici oameni intr-un album foto (pentru web) folosind informatii dintr-o lista de contacte; apoi clientul tau mail ar putea trimite automat un mail acestor persoane, anuntandu-i ca fotografiile lor sunt pe web (on-line). Cum HTML a integrat documente, imagini, sisteme de meniuri si formulare, RDF este o unealta care permite o integrare mai profunda, pentru a transforma web-ul un pic mai mult intr-un web semantic. La fel cum oamenii au nevoie de o conventie care sa stabileasca intelesurile cuvintelor cu care comunica, si calculatoarele au nevoie de acelasi lucru pentru a comunica eficient. Descrierile formale dintr-o anumita categorie (cumparare sau productie, spre exemplu) sunt numite ontologii si sunt o parte necesara a web-ului semantic. RDF, ontologiile si reprezentarea intelesului pentru a permite calculatoarelor sa ajute munca oamenilor, sunt parte a Activitatii pentru Web-ul Semantic.
Un document XML contine o structura arborescenta de date, adica noduri si date, el fiind considerat un document bine format atunci cand este conform cu regulile de sintaxa. Acest lucru inseamna:
- documentul are un singur element radacina (numit si element document)
- fiecare element are un marcaj de deschidere si unul de inchidere sau este unul de auto-inchidere (ce contine date vide)
<book> Acesta este un text intr-un document XML . </ book>
- un element poate sa contina mai multe subelemente, singura conditie fiind aceea ca marcajele sa fie inchise in mod corespunzatorUn document care nu este bine format, nu este considerat un document XML, iar un parser nu are dreptul sa il proceseze.
Un document XML valid, este conform cu cateva reguli semantice. Aceste reguli sunt fie definite de utilizator sau incluse intr-o schema XML sau DTD (Document Type Definition). Daca un document contine un marcaj care nu este definit in schema, atunci nu este valid, iar un parser nu este autorizat sa il proceseze.
XML Schema, standard cunoscut si sub numele de XML Schema Definition (XSD), XML Schema este o alternativa la DTD care este bazata pe standardul XML.
Initiativa a apartinut companiei Microsoft, intre timp insa, consortiul W3C a preluat aceasta initiativa si a dezvoltat un set mai larg de cerinte si caracteristici pentru documente ce descriu tipuri de documente. Acestea sunt reunite sub numele de Document Content Description.
XML Schema a devenit o recomandare W3C pe data de 02 Mai 2001.
XML Schema joaca un rol foarte important in viitorul XML-ului, in special in cel al serviciilor web unde este considerat a fii unul din stalpii fundamentali pe care este care va fii construit web-ul semantic.O XML Schema:
defineste elementele care pot sa apara intr-un document
defineste atributele pe care pot sa le aiba elementele dintr-un document
defineste care elemente au copii si care sunt acestia
defineste ordinea copiilor unui element
defineste numarul de copii
defineste daca un element este vid sau poate contine un text
defineste tipurile elementelor si atributelor
defineste valorile implicite si fixe ale elementelor si atributelor
</ persons>
Schema XML corespunzatoare va fii :
family.xsd:
<?xml version = '1.0' encoding = 'ISO-8859-1'?>
<xs:schema xmlns:xs = 'https:/ / www.w3.org/ 2001/ XMLSchema'
elementFormDefault = 'qualified'>
<xs:element name = 'persons'>
<xs:complexType>
<xs:sequence>
<xs:element name = 'person' maxOccurs = 'unbounded'>
<xs:complexType>
<xs:sequence>
<xs:element name = 'full_name' type = 'xs:string'/ >
<xs:element name = 'child_name' type = 'xs:string'
minOccurs = '0' maxOccurs = '5'/ >
</ xs:sequence>
</ xs:complexType>
</ xs:element>
</ xs:sequence>
</ xs:complexType>
</ xs:element>
</ xs:schema>
DTD-urile (Document Type Definition) sunt cele mai vechi scheme pentru formatarea documentelor XML, ele devenind depasite din cauza standardului XML 1.0.
Un nou limbaj tip schema XML, descrisa de catre W3C ca succesorul lui DTD, este XSD (XML Schema). Acesta foloseste un sistem mai mare pentru tipuri de date, permite stabilirea unor restrictii asupra structurii logice si are un format bazat pe XML, care permite crearea si modificarea cu unelte comune.
Inca de la primele utilizari ale XML-ului in aplicatii a devenit evident ca adeseori definirea tipurilor de documente folosind fisiere DTD are cateva neajunsuri, dintre care enumeram:
Limbajul DTD foloseste o alta sintaxa nu cea de XML Schema ceea ce presupune ca:
Utilizatorii sa invete doua "limbaje" (desi nici unul nu este dificil)
Aplicatiile care folosesc validarea de DTD sa contina componente separate de procesare a DTD-urilor
Sintaxa DTD este relativ restransa. In cadrul DTD ar fi dificil, de exemplu, de declarat un tip de document XML care contine rapoarte organizate pe luni si zile. Astfel, o regula evidenta ar fi ca un element luna ar trebui sa contina intre 28 si 31 de elemente de tip zi, lucru care se poate specifica in DTD insiruind de 28 de ori zi si apoi definindu-le pe restul ca fiind optionale . Un alt exemplu este acela de verificare a corectitudinii structurii CNP-urilor (numere alcatuite din 13 cifre). XML Schema face ca astfel de structuri sa poata fi definite mult mai usor.
DTD-urile au o capacitate foarte limitata de tipuri de date (suporta doar 10 tipuri de date). Pentru a exemplifica, in DTD nu putem spune ca un atribut este de tip intreg pozitiv, ci doar il putem defini ca sir de caractere, identificator sau fragment de nume.
DTD-urile suporta attribute identificatori si referinte catre acestia (ID si IDREF). Nu se pot insa trasa relatii clare cum ar fi: atributul zi_ref este o referinta catre un atribut de tip identificator din elementul zi.
DTD-urile nu suporta spatii de nume (namespaces).
Aceste neajunsuri au condus la aparitia XML Schema care prezinta urmatoarele avantaje:
Sunt scrise folosind aceeasi sintaxa ca si fisierele pe care le descrie, ceea ce presupune mai putina sintaxa de memorat.
Suporta peste 44 de tipuri de date si permite, de asemenea, definirea propriilor tipuri de date.
Sunt orientate pe obiecte (se poate restrictiona sau extinde un anumit tip, derivand un nou tip pe baza unuia vechi).
Se pot defini mai multe elemente care sa aiba acelasi nume dar continut diferit.
Suporta spatii de nume (namespaces).
Sunt extensibile ceea ce permite utilizarea unei Scheme in cadrul alteia, se pot referi mai multe scheme in cadrul aceluiasi document si se pot crea tipuri de date proprii derivate din tipurile standard.
Fie un document XML definit astfel:
<?xml version = '1.0'?>
<student>
<nume> Popescu </ nume>
<prenume> George </ prenume>
<adresa> undeva
in
<grupa> 505 </ grupa>
</ student>
Pentru a putea referi o XML Schema intr-un document XML se adauga cateva atribute elementului radacina a documentului:
<student
xmlns = 'https:/ / www.acs.ro/ '
xmlns:xs = 'https:/ / www.w3.org/ 2001/ XMLSchema-instance'
xs:schemaLocation = 'https:/ / www.acs.ro/ student.xsd'>
Aceste atribute au urmatoarea semnificatie:
xmlns = 'https:/ / www.eu.ro/ ' - defineste namespace-ul default, specificand validatorului ca toate elementele folosite in documentul XML sunt declarate in namespaceul de la adresa respectiva
xmlns:xs = 'https:/ / www.w3.org/ 2001/ XMLSchema-instance' - instanta Schemei utilizate pentru respectivul namespace
xs:schemaLocation = 'https:/ / www.eu.ro/ student.xsd' - defineste namespace-ul utilizat (https:/ / www.eu.ro/ ) si locatia XML Schemei ce va fi folosita pentru namespace-ul respectiv (student.xsd) .
Un fisier XML Schema
utilizeaza sintaxa XML pentru definirea structurii si tipurilor elementelor
unui document XML in vederea validarii. Un fisier XML Schema are extensia .xsd
si este un fisier XML ce are ca radacina <schema> .
Forma generala a unui astfel de document este urmatoarea:
<?xml version = '1.0'?>
<xs:schema
xmlns:xs = 'https:/ / www.w3.org/ 2001/ XMLSchema'
targetNamespace = 'https:/ / www.acs.ro/ '
xmlns = 'https:/ / www.acs.ro/ '
elementFormDefault = 'qualified'>
</ xs:schema>
Atributele folosite au urmatoarea semnificatie:
xmlns:xs = 'https:/ / www.w3.org/ 2001/ XMLSchema' - indica faptul ca elementele si tipurile de date utilizate in Schema (schema, element, complexType, sequence, string, boolean, etc.) provin din namespace-ul definit la adresa respectiva. Totodata, se mentioneaza si faptul ca pentru a folosi elementele si tipurile de date din acest namespace, ele trebuiesc prefixate cu xs (xs este un nume aleator pecare il dam noi)
targetNamespace = 'https:/ / www.acs.ro/ ' - indica faptul ca elementele definite de aceasta Schema (student, nume, prenume, adresa, grupa) provin din namespace-ul de la adresa respectiva
xmlns = 'https:/ / www.acs.ro/ ' - indica faptul ca namespace-ul default e cel de la adresa specificata
elementFormDefault = 'qualified' - indica faptul ca fiecare element utilizat in documentul XML si care au fost definite in Schema trebuie sa fie calificate de namespace-ul respectiv Namespace-ul default este cel care nu are asociat nici un sufix.
Orice schema XML are ca nod radacina elemental Schema. Acesta contine definitiile de attribute, elemente, constrangeri si tipuri de date. Pe
langa faptul ca ofera tipuri de date standardizate, se permite si definirea de noi tipuri de date.
Elementele din cadrul unei scheme XML sunt (descriere sumara):
attribute |
Defineste un atribut pentru un element. Poate apare in cadrul unui element ElementType. |
AttributeType |
Defineste un tip de atribut daca dorim spre exemplu sa declaram mai multe attribute de tip culoare sin u dorim sa repetam constrangerile sau alte caracteristici de mai multe ori in cadrul schemei. Apare in interiorul elementului Schema. |
datatype |
Specifica un tip de date pentru elementele ElementType sau AttributeType |
description |
Ofera posibilitatea documentarii elementelor si atributelor definite. |
Element |
Se refera la un element declarat care poate apare in cadrul unui element ElementType. |
ElementType |
Apare in cadrul elementului Schema si defineste un tip de element (similar !ELEMENT la DTD-uri) |
group |
Permite definirea de secvente de elemente (adica a gramaticii documentului) |
Schema |
Nodul radacina pentru orice XML Schema |
Tipuri de date
o String - folosit pentru date ce au valori ce contin siruri de caractere. Din acest tip sunt derivate urmatoarele tipuride date: normalizedString, token, ENTITIES, ENTITY, ID, IDREF, IDREFS, language, Name, NCName, NMTOKEN, NMTOKENS, Qname
o Date - folosit pentru date ce contin informatii legate de timp sau de date. Din acest tip sunt derivate: date, time, dateTime, duration, gDay, gMonth, gMonthDay, gYear, gYearMonth
o Decimal - folosit pentru date ce au valori de tip numeric. Din acest tip sunt derivate: byte, decimal, int, integer, long, negativeInteger, nonNegativeInteger, nonPositiveInteger, positiveInteger, short, unsignedLong, unsignedInt, unsignedShort, unsignedByte
o Boolean
o Binare:
- base64Binary (Base64-encoded binary data)
- hexBinary (hexadecimal-encoded binary data)
o Altele: anyURI, double, float, NOTATION, Qname
Pentru exemplul definit mai sus intreaga schema a documentului XML este:
<?xml version = '1.0'?>
<xs:schema xmlns:xs = 'https:/ / www.w3.org/ 2001/ XMLSchema'
targetNamespace = 'https:/ / www.acs.ro/ '
xmlns = 'https:/ / www.acs.ro/ '
elementFormDefault = 'qualified'>
<xs:element name = 'student'>
<xs:complexType>
<xs:sequence>
<xs:element name = 'nume' type = 'xs:string'/ >
<xs:element name = 'prenume' type = 'xs:string'/ >
<xs:element name = 'adresa' type = 'xs:string'/ >
<xs:element name = 'an' type = 'xs:string'/ >
<xs:element name = 'grupa' type = 'xs:string'/ >
</ xs:sequence>
</ xs:complexType>
</ xs:element>
</ xs:schema>
Daca "https:/ / www.w3.org/ 2001/ XMLSchema" nu este namespace-ul default, tipurile de date trebuiesc prefixate cu prefixul specific acestui namespace (ex: xs:string, xs:decimal, xs:integer, xs:boolean, xs:date, xs:time).
Elementul student este definit ca avand un tip complex deoarece contine alte elemente.
Celelalte elemente (nume, prenume, adresa, grupa) au tipul simplu pentru ca nu contin alte elemente in interiorul lor. Un element se numeste element simplu daca:
contine numai informatie text (date caracter)
nu are atribute
nu contine alte atribute
nu este vid
Totusi informatia text continuta de element poate sa fie de diferite tipuri. Ea poate sa fie de unul dintre tipurile predefinite in XML Schema (boolean, string, date, etc.), sau poate fi de un tip definit de utilizator. De asemenea se pot adauga restricii (fatete) asupra tipurilor de date pentru a stabili limitele, sau poate fi stabilit un patern peste care trebuie sa se potriveasca.
Definirea elementelor simple
Sintaxa definiri unui element simplu este urmatoarea:
<xs:element name = 'nume_element' type = 'tip_element'/ >
unde:
In XML Schema sunt predefinite urmatoarele tipuri:
Exemplu: Se considera urmatoarele elemente XML:
<NUME> Oprian Maria </ NUME>
<VARSTA> 24 </ VARSTA>
<DATA_NASTERII> 1984-09-23 </ DATA_NASTERII>
Atunci definitiile corespunzatoare ale acestor elemente simple in XML Schema sunt:
<xs:element name = 'NUME' type = 'xs:string'/ >
<xs:element name = 'VARSTA' type = 'xs:integer'/ >
<xs:element name = 'DATA_NASTERII' type = 'xs:date'/ >
Elementele simple pot avea in anumite situatii valori implicite SAU o valore fixa. Sintaxa declararii acestora este:
<xs:element name = 'nume_element' type = 'tip_element' default = 'valoare-implicita'/ ><xs:element name = 'nume_element' type = 'tip_element' fixed = 'valoare-fixa'/ >
Definirea atributelor
Elementele simple nu pot avea atribute. Daca un element are cel putin un atribut atunci este considerat de element de tip complex. Totusi, atributul insusi este declarat intotdeauna ca un tip simplu. Sintaxa de definire a unui atribut este urmatoarea:
<attribute name = 'nume_atribut' type = 'tip_atribut'/ >
unde:
nume_atribut este numele atributului
tip atribut este tipul atributului identic cu cel de la definirea elementelor simple
Exemplu: Se considera urmatorul element cu un atribut:
<PERSOANA sex = 'feminin'> Tocitu Mihaela </ PERSOANA>
atunci definitia atributului sex este urmatoarea:
<xs:attribute name = 'sex' type = 'xs:string'/ >
Sintaxa XML Schema pentru definirea atributelor permite de asemenea definirea de valori implicite (default) pentru atribute SAU atribute cu valori fixe. Sintaxa definirii acestora este urmatoarea:
<xs:attribute name = 'lang' type = 'xs:string' default = 'EN'/ >
<xs:attribute name = 'lang' type = 'xs:string' fixed = 'EN'/ >
In plus fata de elemente, se poate specifica si daca respectivul atribut poate sau nu sa lipseasca. In mod default, atributul este optional, adica atributul poate sa lipseasca. Pentru a specifica faptul ca atributul este obligatoriu, se adauga atributul use:
<xs:attribute name = 'lang' type = 'xs:string' use = 'required'/ >
In momentul in care se specifica un anumit tip de date pentru un element sau pentru un atribut din XML, se impune o restrictie asupra continutului acestuia (de exemplu, daca tipul este "date", se va genera o eroare in momentul in care se gaseste informatia "Buna ziua").
De asemenea, se pot adauga restrictii suplimentare asupra elementelor sau atributelor, restrictii care se numesc fatete (facets).
Definirea elementelor complexe
Un element complex este un element complex care contine alte elemente sau/ si atribute. Sunt 4 tipuri de elemente complexe si oricare din aceste tipuri poate sa aiba si atribute:
a) elemente ce contin numai alte elemente in interiorul lor - au numai copii, fara text :
<employee> <firstname> Popescu </ firstname> <lastname> Ion </ lastname> </ employee>
b) elemente vide - ce nu contin nimic in interiorul lor
<product pid = '1345'/ >
c) elemente care contin in interiorul lor numai text
<mancare tip = 'desert'> tort </ mancare> )
d) elemente mixte - care contin in interiorul lor atat elemente cat si text
<scrisoare> Stimate Domnule <nume> Ion </ nume> , Scrisoarea dumneavoastra <sid> 102 </ sid> va ajunge pe data <data> 15-11-2008 </ data> . </ scrisoare>
Definirea acestor elemente se face dupa cum urmeaza:
a) elemente ce au doar copii in componenta lor
Folosind tipuri implicite |
Folosind tipuri explicite |
Explicatie |
<xs:element name = 'employee'> <xs:complexType> <xs:sequence> <xs:element name = 'firstname' type = 'xs:string'/ > <xs:element name = 'lastname' type = 'xs:string'/ > </ xs:sequence> </ xs:complexType> </ xs:element> |
<xs:element name = 'employee' type = 'personinfo'/ > <xs:complexType name = 'personinfo'> <xs:sequence> <xs:element name = 'firstname' type = 'xs:string'/ > <xs:element name = 'lastname' type = 'xs:string'/ > </ xs:sequence> </ xs:complexType> |
Se specifica faptul ca elementul employee are doi copii (firstname si lastname) care trebuie sa apara strict in aceasta ordine datorita indicatorului <xs:sequence> . Folosirea tipului implicit il face inutilizat in alta parte,spre deosebire de folosirea tipurilor explicite care permite refolosirea acestuia precum si crearea de noi elemente complexe. |
Exemplu de refolosire si extindere a tipului explicit "personinfo":
Sintaxa |
Explicatie |
<xs:element name = 'employee' type = 'personinfo'/ > <xs:element name = 'student' type = 'personinfo'/ > <xs:element name = 'member' type = 'personinfo'/ > <xs:complexType name = 'fullpersoninfo'> <xs:complexContent> <xs:extension base = 'personinfo'> <xs:sequence> <xs:element name = 'address' type = 'xs:string'/ > <xs:element name = 'city' type = 'xs:string'/ > <xs:element name = 'country' type = 'xs:string'/ > </ xs:sequence> </ xs:extension> </ xs:complexContent> </ xs:complexType> |
Tipul personinfo este utilizat atat la definirea elementului employee cat si la definirea elementelor student si member.In acest fel s-a definit tipul fullpersoninfo care are un continut complex ( <xs:complexContent> ) si porneste de la tipul personinfo extinzandu-l ( <xs:extension base = 'personinfo'> ) cu o secventa de alte elemente ( <xs:sequence> . </ xs:sequence> ) |
b) elemente vide - pentru a defini un tip vid, trebuie definit un tip care sa contina numai elemente in interiorul sau, dar caruia sa nu ii se adauge, de fapt, nici un element. Astfel, el este definit ca fiind un tip complex, cu un continut complex, ceea ce arata faptul ca se intentiona extinderea sau restrangream continutul unui element de tip complex.
Sintaxa |
Sintaxa simplificata |
Sintaxa simplificata folosind tipuri explicite |
<xs:element name = 'product'> <xs:complexType> <xs:complexContent> <xs:restriction base = 'xs:integer'> <xs:attribute name = 'prodid' type = 'xs:positiveInteger'/ > </ xs:restriction> </ xs:complexContent> </ xs:complexType> </ xs:element> |
<xs:element name = 'product'> <xs:complexType> <xs:attribute name = 'prodid' type = 'xs:positiveInteger'/ > </ xs:complexType> </ xs:element> |
<xs:element name = 'product' type = 'prodtype'/ > <xs:complexType name = 'prodtype'> <xs:attribute name = 'prodid' type = 'xs:positiveInteger'/ > </ xs:complexType> |
c) elemente care contin in interiorul lor numai text. Acest tip contine numai continut simplu (text sau/ si atribute). Pentru a defini un astfel de tip, se foloseste "simpleContent" si trebuie utilizata o extensie sau o restrictie.
Restrictie |
Extensie |
<xs:element name = 'nume'> <xs:complexType> <xs:simpleContent> <xs:restriction base = 'tip'> </ xs:restriction> </ xs:simpleContent> </ xs:complexType> </ xs:element> |
<xs:element name = 'nume'> <xs:complexType> <xs:simpleContent> <xs:extension base = 'tip'> </ xs:extension> </ xs:simpleContent> </ xs:complexType> </ xs:element> |
Observatie: Extensia/ restrictia se foloseste pentru a extinde sau limita tipul de baza.
Exemplu:
Sintaxa |
Sintaxa cu tip explicit |
<xs:element name = 'mancare'> <xs:complexType> <xs:simpleContent> <xs:extension base = 'xs:string'> <xs:attribute name = 'tip' type = 'xs:string' / > </ xs:extension> </ xs:simpleContent> </ xs:complexType> </ xs:element> |
<xs:element name = 'mancare' type = 'tip_mancare'> <xs:complexType name = 'tip_mancare'> <xs:simpleContent> <xs:extension base = 'xs:string'> <xs:attribute name = 'tip' type = 'xs:string' / > </ xs:extension> </ xs:simpleContent> </ xs:complexType> |
d) elemente mixte (ex: <scrisoare> Stimate Domnule <nume> Ion </ nume> , Scrisoarea dumneavoastra <sid> 102 </ sid> va ajunge pe data <data> 15-11-2008 </ data> . </ scrisoare> )
Folosind tipuri implicite |
Folosind tipuri explicite |
Explicatie |
<xs:element name = 'scrisoare'> <xs:complexType mixed = 'true'> <xs:sequence> <xs:element name = 'nume' type = 'xs:string'/ > <xs:element name = 'sid' type = 'xs:positiveInteger'/ > <xs:element name = 'data' type = 'xs:date'/ > </ xs:sequence> </ xs:complexType> </ xs:element> |
<xs:element name = 'scrisoare' type = 'tip_s'/ > <xs:complexType name = 'tip_s' mixed = 'true'> <xs:sequence> <xs:element name = 'nume' type = 'xs:string'/ > <xs:element name = 'sid' type = 'xs:positiveInteger'/ > <xs:element name = 'data' type = 'xs:date'/ > </ xs:sequence> </ xs:complexType> |
Pentru a permite sa apara texte intre copiii elementului scrisoare, trebuie ca atributul "mixed" sa aiba valoarea "true". Tagul <xs:sequence> specifica faptul ca elementele definite in cadrul ei (nume, sid, data) trebuie sa apara in ordinea specificata in elementul scrisoare |
Elementele declarate la nivele superioare ale unei <schema> sunt disponibile pentru restul schemei. Elementele declarate intr-un xs:complexType sunt locale in acel tip si nu pot fi referite la un nivel superior. Astfel in exemplul anterior elementele NUME si PRENUME sunt locale in cadrul elementului PERSOANA.
Unui tip complex i se poate asigna un nume astfel:
<xs:complexType name = 'nume-tip'>
.
</ xs:complexType>
Referirea la el se face printr-o constructie de foma:
<xs:element name = 'nume' type = 'nume-tip-declarat'/ >
Exemplu:
<xs:complexType name = 'PERSOANA'>
<xs:sequence>
<xs:element name = 'NUME' type = 'xs:string'/ >
<xs:element name = 'PRENUME' type = 'xs:string'/ >
</ xs:sequence>
</ xs:complexType>
<xs:element name = 'STUDENT' type = 'PERSOANA'/ >
<xs:element name = 'PROFESOR' type = 'PERSOANA'/ >
De asemenea putem construi un tip complex prin extinderea unui alt tip complex:
<xs:complexType name = 'tip-nou'>
<xs:complexContent>
<xs:extension base = 'alt-tip'>
caracteristici noi
</ xs:extension>
</ xs:complexContent>
</ xs:complexType>
Restrictiile sunt folosite pentru a defini acceptate pentru elementele si atributele XML.
Sintaxa generala a definirii acestor restrictii este urmatoarea:
<xs:element name = 'nume'> (sau xs:attribute)
<xs:simpleType>
<xs:restriction base = 'tip'>
restrictii
</ xs:restriction>
</ xs:simpleType>
</ xs:element>
Restrictiile sunt de mai multe feluri :
Restrictii asupra valorilor continute in interiorul tagurilor
Folosint tipuri implicite |
Folosind tipuri explicite |
Explicatie |
<xs:element name = 'varsta'> <xs:simpleType> <xs:restriction base = 'xs:integer'> <xs:minInclusive value = '0'/ > <xs:maxInclusive value = '80'/ > </ xs:restriction> </ xs:simpleType> </ xs:element> |
<xs:element name = 'varsta' type = 'tip_v'> <xs:simpleType name = 'tip_v'> <xs:restriction base = 'xs:integer'> <xs:minInclusive value = '0'/ > <xs:maxInclusive value = '80'/ > </ xs:restriction> </ xs:simpleType> </ xs:element> |
Impunerea faptului ca elementul "varsta" sa aiba valori cuprinse intre 0 si 80 |
Cele 2 expresii sunt echivalente din punct de vedere al definirii elementului de tip varsta. In cazul celei de-a doua forme, tipul "tip_v" poate fi refolosit in cadrul altor elemente sau extins/ restrictionat, deoarece nu este o parte a elementului varsta ca in primul caz.
Folosind tipuri implicite |
Folosind tipuri explicite |
Explicatie |
<xs:element name = 'varsta'> <xs:simpleType> <xs:restriction base = 'xs:string'> <xs:enumeration value = '20'/ > <xs:enumeration value = '30'/ > <xs:enumeration value = '40'/ > </ xs:restriction> </ xs:simpleType> </ xs:element> |
<xs:element name = 'varsta' type = 'tip_v'> <xs:simpleType name = 'tip_v'> <xs:restriction base = 'xs:string'> <xs:enumeration value = '20'/ > <xs:enumeration value = '30'/ > <xs:enumeration value = '40'/ > </ xs:restriction> </ xs:simpleType> </ xs:element> |
Impunerea faptului ca elementul "varsta" sa aiba una din valorile 20, 30 sau |
Restrictii asupra seriilor de valori - folosind patterne
Folosind tipuri implicite |
Folosind tipuri explicite |
Explicatie |
<xs:element name = 'cifra'> <xs:simpleType> <xs:restriction base = 'xs:integer'> <xs:pattern value = '[0-9]'/ > </ xs:restriction> </ xs:simpleType> </ xs:element> |
<xs:element name = 'cifra' type = 'tip_c'> <xs:simpleType name = 'tip_c'> <xs:restriction base = 'xs:integer'> <xs:pattern value = '[0-9]'/ > </ xs:restriction> </ xs:simpleType> </ xs:element> |
Descrierea unei cifre ca fiind orice intreg cuprins intre 0 si 9 |
<xs:element name = 'numar'> <xs:simpleType> <xs:restriction base = 'xs:integer'> <xs:pattern value = '0|[1-9]([0-9])*'/ > </ xs:restriction> </ xs:simpleType> </ xs:element> |
<xs:element name = 'numar' type = 'tip_n'> <xs:simpleType name = 'tip_n'> <xs:restriction base = 'xs:integer'> <xs:pattern value = '[1-9]([0-9])*'/ > </ xs:restriction> </ xs:simpleType> </ xs:element> |
Descrierea unui numar ca fiind numarul 0 sau o insiruire de oricate cifre cu conditia ca prima cifra sa fie cuprinsa intre 1 si 9 |
<xs:element name = 'CNP'> <xs:simpleType> <xs:restriction base = 'xs:integer'> <xs:pattern value = '(1|2)[0-9]'/ > </ xs:restriction> </ xs:simpleType> </ xs:element> |
<xs:element name = 'CNP' type = 'tip_cnp'> <xs:simpleType name = 'tip_cnp'> |
Descrierea unui CNP ca fiind un numar ce incepe cu cifra 1 sau 2 si care are |
Preserve |
Replace |
Collapse |
<xs:element name = 'address'> <xs:simpleType> <xs:restriction base = 'xs:string'> <xs:whiteSpace value = 'preserve'/ > </ xs:restriction> </ xs:simpleType> </ xs:element> |
<xs:element name = 'address'> <xs:simpleType> <xs:restriction base = 'xs:string'> <xs:whiteSpace value = 'replace'/ > </ xs:restriction> </ xs:simpleType> </ xs:element> |
<xs:element name = 'address'> <xs:simpleType> <xs:restriction base = 'xs:string'> <xs:whiteSpace value = 'collapse'/ > </ xs:restriction> </ xs:simpleType> </ xs:element> |
Sintaxa |
Explicatie |
<xs:element name = 'password'> <xs:simpleType> <xs:restriction base = 'xs:string'> <xs:length value = '8'/ > </ xs:restriction> </ xs:simpleType> </ xs:element> |
Campul "password" trebuie sa aiba exact 8 caractere |
<xs:element name = 'password'> <xs:simpleType> <xs:restriction base = 'xs:string'> <xs:minLength value = '5'/ > <xs:maxLength value = '8'/ > </ xs:restriction> </ xs:simpleType> </ xs:element> |
Campul "password" trebuie sa aiba intre 5 si 8 caractere |
Restrictii pentru tipurile de date
Constrangere |
Descriere |
enumeration |
Defineste o lista de valori ce pot fi acceptate. |
fractionDigits |
Specifica numarul maxim de decimale permise. Trebuie sa fie mai mare sau egal cu zero. |
length |
Specifica numarul exact de caractere sau de itemuri dintr-o lista. Trebuie sa fie mai mare sau egal cu zero. |
maxExclusive |
Specifica limita superioara pentru valorile numerice. Valoarea trebuie sa fie strict mai mica decat valoarea specifica astfel. |
maxInclusive |
Specifica limita superioara pentru valorile numerice. Valoarea trebuie sa fie mai mica sau egala cu valoarea specifica astfel. |
maxLength |
Specifica numarul maxim de caractere sau de itemuri dintr-o lista. Trebuie sa fie mai mare sau egal cu zero. |
minExclusive |
Specifica limita inferioara pentru valorile numerice. Valoarea trebuie sa fie strict mai mare decat valoarea specifica astfel. |
minInclusive |
Specifica limita inferioara pentru valorile numerice. Valoarea trebuie sa fie mai mare sau egala cu valoarea specifica astfel. |
minLength |
Specifica numarul minim de caractere sau de itemuri dintr-o lista. Trebuie sa fie mai mare sau egal cu zero. |
Pattern |
Specifica un patter pe care trebuiesa il respecte datele respective |
totalDigit |
Specifica numarul exact de digiti permisi. Trebuie sa fie mai mare sau egal cu zero |
whiteSpace |
Specifica cum sunt tratate whitespaceurile |
In XML Schema exista sapte indicatori grupati in 3 categorii:
a. All - toti copii trebuie sa apara o singura data in cadrul elementului parinte, in orice ordine.
b. Choice - orice copil poate sa apara in cadrul elementului parinte
c. Sequence - toti copiii trebuie sa apara in cadrul elementului parinte in ordinea specificata
All |
Choice |
Sequence |
<xs:element name = 'person'> <xs:complexType> <xs:all> <xs:element name = 'firstname' type = 'xs:string'/ > <xs:element name = 'lastname' type = 'xs:string'/ > </ xs:all> </ xs:complexType> </ xs:element> |
<xs:element name = 'person'> <xs:complexType> <xs:choice> <xs:element name = 'employee' type = 'employee'/ > <xs:element name = 'member' type = 'member'/ > </ xs:choice> </ xs:complexType> </ xs:element> |
<xs:element name = 'person'> <xs:complexType> <xs:sequence> <xs:element name = 'firstname' type = 'xs:string'/ > <xs:element name = 'lastname' type = 'xs:string'/ > </ xs:sequence> </ xs:complexType> </ xs:element> |
a. maxOccurs - specifica numarul maxim de aparitii a respectivului element
b. minOccurs - specifica numarul minim de aparitii a respectivului element
Sintaxa |
Explicatie |
<xs:element name = 'persoana'> <xs:complexType> <xs:sequence> <xs:element name = 'liceu' type = 'xs:string'/ > <xs:element name = 'facultate' type = 'xs:string' maxOccurs = '5' minOccurs = '0'/ > </ xs:sequence> </ xs:complexType> </ xs:element> |
Sintaxa defineste un element "persoana" care are 2 tipuri de copii: un copil "liceu" si un copil "facultate" care poate sa apara de un numar de ori cuprins intre 0 si 5 |
Observatii:
1) Pentru toti ceilalti indicatori (de ordine sau de grup), valorile implicite pentru
maxOccurs si minOccurs sunt 1.
2) Pentru a permite unui element sa apara de oricate ori, se foloseste
maxOccurs = "unbounded".
a. Group name - se defineste folosind <group name = 'groupname'> </ group> . In interiorul grupului trebuie definit unul din indicatorii de ordine. Dupa definirea grupului, acesta poate fi referit in alta structura:
Definirea unui grup de elemente |
Referirea acestui grup in alt element |
<xs:group name = 'persongroup'> <xs:sequence> <xs:element name = 'firstname' type = 'xs:string'/ > <xs:element name = 'lastname' type = 'xs:string'/ > <xs:element name = 'birthday' type = 'xs:date'/ > </ xs:sequence> </ xs:group> |
<xs:element name = 'person' type = 'personinfo'/ > <xs:complexType name = 'personinfo'> <xs:sequence> <xs:group ref = 'persongroup'/ > <xs:element name = 'country' type = 'xs:string'/ > </ xs:sequence> </ xs:complexType> |
b. attributeGroup name - se defineste folosind <attributeGroup name = 'groupname'> </ attributeGroup> . Dupa definirea grupului, acesta poate fi referit in alta structura:
Definirea unui grup de atribute |
Referirea acestui grup in alta structura |
<xs:attributeGroup name = 'personattrgroup'> <xs:attribute name = 'firstname' type = 'xs:string'/ > <xs:attribute name = 'lastname' type = 'xs:string'/ > <xs:attribute name = 'birthday' type = 'xs:date'/ > </ xs:attributeGroup> |
<xs:element name = 'person'> <xs:complexType> <xs:attributeGroup ref = 'personattrgroup'/ > </ xs:complexType> </ xs:element> |
Pentru a permite extinderea Schemelor XML, sintaxa permite folosirea unor elemente de tip whildcard ( <any> si <anyAttribute> ) ce permit imbogatirea Schemelor cu elemente/ atribute a caror definitie nu este data in Schema respectiva.
Sintaxa |
Explicatie |
<xs:element name = 'person'> <xs:complexType> <xs:sequence> <xs:element name = 'firstname' type = 'xs:string'/ > <xs:element name = 'lastname' type = 'xs:string'/ > <xs:any minOccurs = '0'/ > </ xs:sequence> </ xs:complexType> </ xs:element> |
Prin folosirea elementului any, continutul elementului "person" poate fi extins cu un alt element, care poate sa nu fie declarat in Schema curenta. Astfel, daca se declara un element "child" intr-o alta schema si apoi se specifica in documentul XML ca se vor folosi ambele scheme, atunci elementul persoana poata ca contina ca si copil si elementul "child" si astfel documentul XML sa fie valid. |
In unele cazuri, se doreste ca in documentul XML sa existe alternative. De exemplu, se poate defini un element adresa in care unul dintre campuri sa fie judetul, pentru locuitorii din provincie sau sectorul pentru locuitorii din capitala. Pentru astfel de situatii, XML Schema pune la dispozitie atributul substitutionGroup. Astfel se pot defini doua elemente in care unul sa fie un substitut pentru celalalt:
<xs:element name = 'judet' type = 'xs:string'/ >
<xs:element name = 'sector' substitutionGroup = 'judet'/ >
Astfel, daca avem o XML Schema care defineste o adresa in felul urmator:
<xs:element name = 'judet' type = 'xs:string'/ >
<xs:element name = 'sector' substitutionGroup = 'judet'/ >
<xs:complexType name = 'adresa'>
<xs:sequence>
<xs:element ref = 'judet'/ >
</ xs:sequence>
</ xs:complexType>
Atunci, urmatorul document XML este valide:
<adress book>
<adresa> <judet> Calarasi </ judet> </ adresa>
<adresa> <sector> trei </ sector> </ adresa>
</ adress book>
Observatii:
a) Tipul elementelor care se doresc a fii substituite trebuie sa fie aceleasi sau, in cel mai rau caz, derivate din tipul de baza (care se doreste a putea fi substituit). Daca tipul este acelasi, atunci nu mai este nevoie sa fie definit tipul elementelor care vor substitui elementul de baza
b) Pentru a putea folosi substituirea este necesar ca elementele implicate in aceasta sa fie declarate global (adica sa fie copii directi ai elementului "schema")
c) Este posibila impiedicarea incercarii de substitutie, prin folosirea atributului block care trebuie sa aiba valoarea 'substitution'. Astfel, daca in exemplul de mai sus, elementului judet i se asociaza block = 'substitution', atunci documentul XML nu mai e valid:
<xs:element name = 'judet' type = 'xs:string' block = 'substitution'/ >
Se considera urmatorul document XML ce isi propune sa reprezinte un ordin de plata:
<?xml version = '1.0' encoding = 'ISO-8859-1'?>
<shiporder orderid = '889923' xmlns:xsi = 'https:/ / www.w3.org/ 2008/ XMLSchema-instance'
xsi:noNamespaceSchemaLocation = 'shiporder.xsd'>
<orderperson> Tocitu Mihaela </ orderperson>
<shipto>
<name> Oprian Maria </ name>
<address> Kogalniceanu 36-46 </ address>
<city> Bucuresti </ city>
<country>
</ shipto>
<item>
<title> Visual Basic 6.0 </ title>
<note> Editie Speciala </ note>
<quantity> 1 </ quantity>
<price> 10.90 </ price>
</ item>
<item>
<title> XML Schema </ title>
<quantity> 1 </ quantity>
<price> 9.90 </ price>
</ item>
</ shiporder>
O schema XML atasata acestui document arata astfel:
<?xml version = '1.0' encoding = 'ISO-8859-1' ?>
<xs:schema xmlns:xs = 'https:/ / www.w3.org/ 2001/ XMLSchema'>
<xs:element name = 'shiporder'>
<xs:complexType>
<xs:sequence>
<xs:element name = 'orderperson' type = 'xs:string'/ >
<xs:element name = 'shipto'>
<xs:complexType>
<xs:sequence>
<xs:element name = 'name' type = 'xs:string'/ >
<xs:element name = 'address' type = 'xs:string'/ >
<xs:element name = 'city' type = 'xs:string'/ >
<xs:element name = 'country' type = 'xs:string'/ >
</ xs:sequence>
</ xs:complexType>
</ xs:element>
<xs:element name = 'item' maxOccurs = 'unbounded'>
<xs:complexType>
<xs:sequence>
<xs:element name = 'title' type = 'xs:string'/ >
<xs:element name = 'note' type = 'xs:string' minOccurs = '0'/ >
<xs:element name = 'quantity' type = 'xs:positiveInteger'/ >
<xs:element name = 'price' type = 'xs:decimal'/ >
</ xs:sequence>
</ xs:complexType>
</ xs:element>
</ xs:sequence>
<xs:attribute name = 'orderid' type = 'xs:string' use = 'required'/ > </ xs:complexType>
</ xs:element>
</ xs:schema>
Schema prezentata anterior este relativ simpla insa poate sa devina dificila de inteles in conditiile in care documentul ar fi mai complex.
In continuare este prezentata o versiune imbunatatita bazata pe urmatorul principiu: se definesc mai intai elementele si atributele, apoi acestea sunt referite utilizand atributul ref.
<?xml version = '1.0' encoding = 'ISO-8859-1' ?>
<xs:schema xmlns:xs = 'https:/ / www.w3.org/ 2001/ XMLSchema'>
<!-definirea elementelor simple -->
<xs:element name = 'orderperson' type = 'xs:string'/ >
<xs:element name = 'name' type = 'xs:string'/ >
<xs:element name = 'address' type = 'xs:string'/ >
<xs:element name = 'city' type = 'xs:string'/ >
<xs:element name = 'country' type = 'xs:string'/ >
<xs:element name = 'title' type = 'xs:string'/ >
<xs:element name = 'note' type = 'xs:string'/ >
<xs:element name = 'quantity' type = 'xs:positiveInteger'/ >
<xs:element name = 'price' type = 'xs:decimal'/ >
<!-definirea atributelor -->
<xs:attribute name = 'orderid' type = 'xs:string'/ >
<!-definirea elementelor complexe -->
<xs:element name = 'shipto'>
<xs:complexType>
<xs:sequence>
<xs:element ref = 'name'/ >
<xs:element ref = 'address'/ >
<xs:element ref = 'city'/ >
<xs:element ref = 'country'/ >
</ xs:sequence>
</ xs:complexType>
</ xs:element>
<xs:element name = 'item'>
<xs:complexType>
<xs:sequence>
<xs:element ref = 'title'/ >
<xs:element ref = 'note' minOccurs = '0'/ >
<xs:element ref = 'quantity'/ >
<xs:element ref = 'price'/ >
</ xs:sequence>
</ xs:complexType>
</ xs:element>
<xs:element name = 'shiporder'>
<xs:complexType>
<xs:sequence>
<xs:element ref = 'orderperson'/ >
<xs:element ref = 'shipto'/ >
<xs:element ref = 'item' maxOccurs = 'unbounded'/ >
</ xs:sequence>
<xs:attribute ref = 'orderid' use = 'required'/ >
</ xs:complexType>
</ xs:element>
</ xs:schema>
Designul schemei de mai sus pate fi rafinata si mai mult asignand nume tipurilor:
<?xml version = '1.0' encoding = 'ISO-8859-1' ?>
<xs:schema xmlns:xs = 'https:/ / www.w3.org/ 2001/ XMLSchema'>
<xs:simpleType name = 'stringtype'>
<xs:restriction base = 'xs:string'/ >
</ xs:simpleType>
<xs:simpleType name = 'inttype'>
<xs:restriction base = 'xs:positiveInteger'/ >
</ xs:simpleType>
<xs:simpleType name = 'dectype'>
<xs:restriction base = 'xs:decimal'/ >
</ xs:simpleType>
<xs:simpleType name = 'orderidtype'>
<xs:restriction base = 'xs:string'>
<xs:pattern value = '[0-9]'/ >
</ xs:restriction>
</ xs:simpleType>
<xs:complexType name = 'shiptotype'>
<xs:sequence>
<xs:element name = 'name' type = 'stringtype'/ >
<xs:element name = 'address' type = 'stringtype'/ >
<xs:element name = 'city' type = 'stringtype'/ >
<xs:element name = 'country' type = 'stringtype'/ >
</ xs:sequence>
</ xs:complexType>
<xs:complexType name = 'itemtype'>
<xs:sequence>
<xs:element name = 'title' type = 'stringtype'/ >
<xs:element name = 'note' type = 'stringtype' minOccurs = '0'/ >
<xs:element name = 'quantity' type = 'inttype'/ >
<xs:element name = 'price' type = 'dectype'/ >
</ xs:sequence>
</ xs:complexType>
<xs:complexType name = 'shipordertype'>
<xs:sequence>
<xs:element name = 'orderperson' type = 'stringtype'/ >
<xs:element name = 'shipto' type = 'shiptotype'/ >
<xs:element name = 'item' maxOccurs = 'unbounded' type = 'itemtype'/ >
</ xs:sequence>
<xs:attribute name = 'orderid' type = 'orderidtype' use = 'required'/ >
</ xs:complexType>
<xs:element name = 'shiporder' type = 'shipordertype'/ >
</ xs:schema>
XML
Schema vine ca o alternativa si mai ales o completare a DTD-ului prin modul sau
de definire a tipurilor documentelor XML.
Multe din neajunsurile DTD-ului nu mai sunt intalnite in cadrul XML Schema si
in plus cu XML Schema se pot impune reguli de sintaxa mult mai fine. Un mare
avantaj este cel ca sintaxa de definire a schemelor este aceeasi cu XML. Totusi
cei care au in spate o oarecare perioada de scriere de DTD-uri vor intampina un
mic impediment. Scrierea acestor XML Schema printr-un editor de texte normal
este anevoioasa si uneori greu de urmarit. Un tool specializat in domeniul
interfete evoluate este Altova XMLSpy, software ce se poate descarca intr-o forma
Trial valabila 30 de zile.
In continuare va fii prezentata, in linii mari, realizarea unei XML Schema utilizand Altova XMLSpy : elementul radacina va fii persoana_fizica , ea avand urmatoarele elemente simple :
nume - de tip xs:String, lungimea de maxim 20, spatiile vor fi eliminate
prenume - de tip xs:String, lungimea de maxim 30 , spatiile vor fi pastrate
sex - de tip xs:String, poate avea doar valorile "F" si "M"
data_nasterii - de tip
xs:Date, poate lua valori doar intre
adresa - de tip xs :String
telefon - de tip xs :integer, avand lungimea fixa de 10 cifre
emai - de tip xs :String.
Figura 1 - Mediul Altova XMLSpy
Figura 2- Selectarea tipului de document utilizat
Figura 3- O schema XML vida
Figura 4- Atribuirea unui nume nodului radacina
Figura 5- Adaugarea descrierii nodului
Figura 6- Adaugarea unei secvente
Figura 7- Adaugarea subelementului nume
Figura 8- Setarea valorilor atributelor
Figura 9- Adaugarea elementului "data_nasterii"
Figura 10 - Validarea schemei finale
Figura 11 - Schema XML
Schema XML corespunzatoare :
<?xml version = '1.0' encoding = 'UTF-8'?>
<xs:schema xmlns:xs https:/ / www.w3.org/ 2001/ XMLSchema elementFormDefault qualified attributeFormDefault unqualified'>
<xs:element name persoana_fizica'>
<xs:annotation>
<xs:documentation> date personale </ xs:documentation>
</ xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name nume'>
<xs:simpleType>
<xs:restriction base xs:string'>
<xs:length value '/ >
<xs:whiteSpace value collapse'/ >
</ xs:restriction>
</ xs:simpleType>
</ xs:element>
<xs:element name prenume'>
<xs:simpleType>
<xs:restriction base xs:string'>
<xs:length value '/ >
<xs:whiteSpace value preserve'/ >
</ xs:restriction>
</ xs:simpleType>
</ xs:element>
<xs:element name data_nasterii'>
<xs:simpleType>
<xs:restriction base xs:date'>
<xs:minExclusive value '/ >
<xs:maxExclusive value '/ >
</ xs:restriction>
</ xs:simpleType>
</ xs:element>
<xs:element name sex'>
<xs:simpleType>
<xs:restriction base xs:string'>
<xs:enumeration value F'/ >
<xs:enumeration value M'/ >
</ xs:restriction>
</ xs:simpleType>
</ xs:element>
<xs:sequence>
<xs:annotation>
<xs:documentation> date de contact </ xs:documentation>
</ xs:annotation>
<xs:element name adresa type xs:string'/ >
<xs:element name telefon'>
<xs:simpleType>
<xs:restriction base xs:integer'>
<xs:minExclusive value '/ >
<xs:maxExclusive value '/ >
</ xs:restriction>
</ xs:simpleType>
</ xs:element>
<xs:element name email minOccurs '>
<xs:simpleType>
<xs:restriction base xs:string'>
<xs:whiteSpace value collapse'/ >
</ xs:restriction>
</ xs:simpleType>
</ xs:element>
</ xs:sequence>
</ xs:sequence>
</ xs:complexType>
</ xs:element>
</ xs:schema>
<?xml version = '1.0' encoding = 'ISO-8859-1'?>
<!--
Copyright 1999-2004 The Apache Software Foundation
Licensed under the Apache License, Version 2.0 (the 'License');
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https:/ / www.apache.org/ licenses/ LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an 'AS IS' BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!DOCTYPE web-app
PUBLIC '-/ / Sun Microsystems, Inc./ / DTD Web Application 2.2/ / EN'
'https:/ / java.sun.com/ j2ee/ dtds/ web-app_2_2.dtd'>
<web-app>
<servlet>
<servlet-name>
snoop
</ servlet-name>
<servlet-class>
SnoopServlet
</ servlet-class>
<!--
<init-param>
<param-name> foo </ param-name>
<param-value> bar </ param-value>
</ init-param>
-->
</ servlet>
<servlet>
<servlet-name>
servletToJsp
</ servlet-name>
<servlet-class>
servletToJsp
</ servlet-class>
</ servlet>
<servlet-mapping>
<servlet-name>
snoop
</ servlet-name>
<url-pattern>
/ snoop
</ url-pattern>
</ servlet-mapping>
<servlet-mapping>
<servlet-name>
snoop
</ servlet-name>
<url-pattern>
/ snoop/ *
</ url-pattern>
</ servlet-mapping>
<servlet-mapping>
<servlet-name>
snoop
</ servlet-name>
<url-pattern>
*.snp
</ url-pattern>
</ servlet-mapping>
<servlet-mapping>
<servlet-name>
servletToJsp
</ servlet-name>
<url-pattern>
/ servletToJsp
</ url-pattern>
</ servlet-mapping>
<taglib>
<taglib-uri>
https:/ / java.apache.org/ tomcat/ examples-taglib
</ taglib-uri>
<taglib-location>
/ WEB-INF/ jsp/ example-taglib.tld
</ taglib-location>
</ taglib>
<security-constraint>
<web-resource-collection>
<web-resource-name> Protected Area </ web-resource-name>
<!-- Define the context-relative URL(s) to be protected -->
<url-pattern> / jsp/ security/ protected/ * </ url-pattern>
<!-- If you list http methods, only those methods are protected -->
<http-method> DELETE </ http-method>
<http-method> GET </ http-method>
<http-method> POST </ http-method>
<http-method> PUT </ http-method>
</ web-resource-collection>
<auth-constraint>
<!-- Anyone with one of the listed roles may access this area -->
<role-name> tomcat </ role-name>
<role-name> role1 </ role-name>
</ auth-constraint>
</ security-constraint>
<!-- Default login configuration uses BASIC authentication -->
<!--
<login-config>
<auth-method> BASIC </ auth-method>
<realm-name> Example Basic Authentication Area </ realm-name>
</ login-config>
-->
<!-- Form-based login is enabled by default. If you wish to
try Basic authentication, comment out the <login-config>
section below and uncomment the one above. -->
<login-config>
<auth-method> FORM </ auth-method>
<realm-name> Example Form-Based Authentication Area </ realm-name>
<form-login-config>
<form-login-page> / jsp/ security/ login/ login.jsp </ form-login-page>
<form-error-page> / jsp/ security/ login/ error.jsp </ form-error-page>
</ form-login-config>
</ login-config>
</ web-app>
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2063
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved