Sunteți pe pagina 1din 73

Sabin Corneliu Buraga

Introducere în
Tehnologii XML

2005
În loc de prefaţă…

Acest material realizează o prezentare generală a meta-limbajului XML (Extensible


Markup Language). Se evidenţiază aspectele privitoare la modul de concepere a documen-
telor XML, principalele caracteristici referitoare la familia XML şi manierele de procesare
a datelor XML în limbajele de programare Perl şi PHP. De asemenea, se prezintă o serie
de exemple de documente XML şi diverse propuneri de proiecte pentru a fi implementa-
te de cititor. Cele două anexe oferă exemple de documente şi procesări XML efectuate în
limbaje precum JavaScript şi Java.

Pentru aprofundarea familiei de limbaje XML, cititorul este încurajat să consulte resur-
sele bibliografice disponibile la finalul acestei lucrări. Mai mult, poate vizita situl autoru-
lui: http://www.infoiasi.ro/~busaco/. Aşteptăm reacţii şi opinii la adresa e-mail
busaco@infoiasi.ro.

2
1. Preambul

Spaţiul World-Wide Web funcţionează în practică datorită:

• unei scheme consistente de identificare a resurselor, prin intermediul identificatori-


lor universali de resurse (URI);
• unui mecanism flexibil de transfer de date, reprezentat de protocolul HTTP;
• unei descrieri logice a structurii documentelor hipertext, prin intermediul limbajelor
de adnotare (marcare) HTML şi XHTML.

În prezent, Web-ul a devenit fără îndoială „universul informaţiilor accesibile în reţea”,


conform definiţiei anticipative date de creatorul acestuia, Tim Berners-Lee. Spaţiul
WWW s-a achitat de această promisiune într-o manieră spectaculoasă, din două motive.
Primul dintre ele este reprezentat de flexibilitatea şi independenţa faţă de conţinut a pro-
tocolului HTTP – care se poate adapta pentru a putea transfera orice format de docu-
ment – şi, în plus, de existenţa identificatorilor universali de resurse (URI) capabili de a
reprezenta legături către orice format de document. Un al doilea motiv este faptul că se-
lecţia naturală pare să fi favorizat câteva formate care au fost dezvoltate pentru Web în
mod explicit. În peisajul de o prolifică variaţie a sintaxei, stilului, structurii şi semanticii do-
cumentelor Web, observăm adoptarea preferenţială a limbajelor SGML, CSS, HTML şi
XML. Fiecare dintre acestea aduce o strategie evolutivă lentă, favorizând codările declara-
tive faţă de formatele binare (de cele mai multe ori proprietare), stilurile de afişare sepa-
rabile de conţinutul propriu-zis faţă de formatarea directă, marcarea declarativă faţă de
cea procedurală şi semantica bine definită faţă de comportamentul operaţional.

Evoluţia Web-ului se poate remarca mai ales în direcţiile următoare:

ƒ evoluţia sintaxei spre formate declarative;


ƒ evoluţia stilului (prezentării): de la formatare la foi de stiluri;
ƒ evoluţia structurii;
ƒ evoluţia semanticii;
ƒ evoluţia elementelor programabile.

Fiecare dintre aceste aspecte vor fi detaliate în continuare.

3
1.1 Evoluţia sintaxei spre formate declarative

Primul compromis se face în privinţa optării între limbajul maşină (binar) şi limbajul na-
tural (textual). La o primă vedere, codificarea specifică maşinii pare mai puţin costisitoare
datorită faptului că ea reflectă direct datele în memorie. Totuşi, transformarea datelor în
format binar poate fi prea fragilă pentru a fi folosită pe platforme eterogene (de exemplu,
reprezentarea numerelor) şi în versiuni de software multiple. Codificarea binară poate, de
asemenea, necesita mai mult spaţiu şi timp pentru împachetare şi despachetare. Fişierele
text pot fi la fel de eficiente, în plus formatele textuale (chiar şi cele în forme parţial lizibi-
le) sunt mai uşor de editat, corectat şi extins.
Al doilea compromis este legat de amalgamul dintre formatele declarative şi cele pro-
cedurale. Poate fi mai uşor de elaborat un analizor pentru un program care calculează
numărul π, decât de transmis un miliard de cifre ale sale. Limbajul TeX, bazat pe marcaje,
este un exemplu edificator privind puterea oferită de formatele procedurale pentru con-
ceperea şi procesarea documentelor, faţă de editoarele de texte folosind formate binare
proprietare (e.g.: Word).
În fine, există un compromis între formatele specifice şi cele generice. În măsura în
care refolosirea informaţiei este o preocupare majoră, o importanţă chiar mai mare decât
aceasta o are promovarea unei familii de gramatici înrudite. Puterea meta-limbajelor
SGML şi XML este reflectată de flexibilitatea în gestionarea documentelor de toate tipu-
rile, de la manuale şi comunicate de presă până la contracte legale şi specificaţii de proiec-
te, şi de posibilitatea de reutilizare a acestora în vederea producerii de cărţi, rapoarte şi
ediţii electronice (pentru CD-ROM/DVD-ROM, Web, dispozitive mobile etc.) pornind
de la acelaşi (aceleaşi) fişier(e) sursă, folosind marcaje declarative similare.

4
Tehnologiile XML la confluenţa a trei domenii aparent distincte:
Internetul, procesarea documentelor şi bazele de date

Există o dilemă fundamentală în privinţa optării între performanţa, costul şi capacita-


tea de utilizare a strategiilor de codificare uşor lizibile de către maşină şi, respectiv, de că-
tre om. Abordarea XML stabileşte un echilibru rezonabil între cele două. Facila lizibilitate
pentru om implică robusteţe, iar descifrarea rapidă de către maşină implică validitate; am-
bele calităţi adaugă valoare informaţiei şi facilitează evoluţia documentelor în timp.

1.2 Evoluţia stilului (prezentării): de la formatare la foi de stiluri

De când au apărut documentele, există autori şi proiectanţi care şi-au concentrat efortul
de perfecţionare tehnică şi stilistică pentru fiecare atingere de peniţă, fiecare fragment de
corp de literă, fiecare imagine plasată. În măsura în care stilul generic al unei prezentări
poate fi captat în vederea reutilizării ulterioare, cu atât mai multă valoare capătă design-ul
şi documentul în sine. Istoria evoluţiei formatelor de documente pentru Web favorizează
formatarea externă în detrimentul directivelor încapsulate tocmai cu scopul ca informaţia
să poată fi reprezentată independent de stil şi viceversa.
Pe parcursul istoriei procesării computerizate a datelor au existat numeroase abordări
ale reprezentărilor orientate spre formatări interne, de la comenzile troff sau groff
din Unix la directivele formatului RTF (Rich Text Format) şi la marcajele pentru fonturi
din HTML (a se vedea, de exemplu, marcatorul <font>). Aproape inevitabil, acestea au

5
fost completate cu „scurtături” de formatare reutilizabile: pachete de macro-uri, rigle şi
parametri pentru afişarea în navigator etc. Clădite pe această experienţă, formatele actuale
de documente Web – HTML şi XML – permit ca formatarea datelor să poată fi realizată
extern, prin foi de stiluri. Foile de stiluri în cascadă – CSS (Cascading Style Sheets) – merg
mai departe şi permit compunerea unor stiluri separate, cum ar fi proprietăţile de culoare
şi font, seturile de caractere, grafica şi prezentarea. Mai mult, controlul formatării este
divizat între autor şi cititor, acesta din urmă putându-şi interpune propria sa înlănţuire de
foi de stiluri, deci contribuind la prezentarea datelor, în funcţie de dorinţele sale individu-
ale.

Prezentarea datelor, cu reprezentările lor RTF şi XHTML

Stilurile nu sunt limitate la domeniul vizual – ele pot controla redarea conţinutului
pentru monitoare, hârtie, audio, medii Braille, terminale mobile şi multe altele. Acest as-
pect este preţios îndeosebi dacă se doreşte adaptarea prezentării documentului pentru
utilizatorii cu handicapuri fizice, dislexie sau pentru analfabeţi – ca şi în cazul a diverse
privaţiuni de circumstanţă (utilizatori care vorbesc la telefon sau lucrează într-un mediu

6
zgomotos). Fluxurile audio pot fi transcrise pe Web ca text – via limbajul standardizat
VoiceXML propus de Consorţiul Web – pentru persoanele cu deficienţe de auz; naviga-
toarele audio (precum Web Galaxy, Vox Portal sau WIRE) oferă facilitatea de a citi pagi-
nile Web pentru utilizatorii care nu le pot parcurge în mod direct, în conformitate cu foile
de stiluri aurale.
Cu toate că tehnologia Web actuală suportă atât formatarea internă, cât şi pe cea prin
intermediul foilor de stiluri, sistemele pentru gestionarea unor cantităţi mari de informaţie
de tip hipertext necesită de cele mai multe ori formatarea externă pentru ca informaţia să
rămână uşor navigabilă şi facil de prelucrat. Se recomandă deci separarea datelor de mo-
dul lor de prezentare.

Relaţiile dintre structură, conţinut şi format

1.3 Evoluţia structurii

Să considerăm următorul exemplu: În activitatea de documentare, un cercetător realizea-


ză o listă de referinţe bibliografice cuprinzând informaţii despre publicaţiile (electronice
sau nu) regăsite. Structura fiecărui articol ştiinţific include un titlu, numele autorului, cor-
pul articolului şi subsolul.
Diversele formate punând la dispoziţie structuri concurente (e.g.: SGML) de documen-
te încearcă să surprindă această structură în cadrul reprezentării lor. Unele descriu frag-
mente din document în termeni legaţi de prezentarea datelor: proprietăţi precum italic,
indentat, stabilirea unui anumit corp de literă (font) şi aşa mai departe. La cealaltă extremă,
alte formate folosesc termeni declarativi: titlu, adresă, intrare de la tastatură etc. Multe alte
formate se află undeva între aceste două extreme, precum marcajele XHTML <em> şi
<font>, în comparaţie cu <address> sau <abbr>.

7
Alt tip de structuri declarative pentru aplicaţiile SGML şi XML sunt definiţiile de ti-
puri de documente – DTD (Document Type Definition) –, care impun documentelor valide
să includă mai multe elemente (marcaje) într-o ordine precizată (de exemplu, „fiecare
apariţie a lui <oraş> trebuie să fie precedată de marcajul <adresă> şi urmată de
<cod_poştal>”). În prezent, declaraţiile DTD sunt înlocuite de schemele XML.
Luarea unei decizii finale de-a lungul acestei axe aduce după sine compromisuri între
precizie şi comprehensibilitate: semanticile orientate spre prezentare, mai lejere, sunt în
mod universal mai bine înţelese decât cele declarative. Marcajul <address> a devenit
parte din repertoriul HTML, însă <abstract> (desemnând marcarea rezumatului unei
lucrări) nu. Marcarea declarativă, indicând în mod clar rolul diverselor părţi de document,
are avantajul de a putea fi refolosită mai târziu. De exemplu, motoarele de căutare (e.g.:
Google) pot atribui ponderi termenilor dintr-un rezumat într-un mod mai semnificativ
sau pot extrage automat numele reporterilor dintr-un set de „tăieturi din ziare” folosind
un instrument de captare a informaţiei.
Vom opta pentru descrierea structurii unui document mai degrabă după funcţia sa de-
cât după formă. Aceasta conduce la asigurarea unui suport pentru un set extensibil de
marcaje, ceea ce HTML şi CSS nu pot oferi. Evoluţia centralizată a HTML împiedică în-
tocmirea unei liste exhaustive de marcaje răspunzând tuturor idiomurilor dorite de poten-
ţialii autori de pagini Web. Un marcaj nou are în mod potenţial o sintaxă ambiguă, o se-
mantică ambiguă şi o prezentare ambiguă (mai ales fără adăugiri de foi de stil).
Comunităţile de interese de pe Web au nevoie să-şi publice propriile definiţii uşor,
proces facilitat de folosirea meta-limbajului XML. Aceste noi definiţii pot chiar să meargă
mai departe de specificarea rolului fiecărui marcaj, pentru a include interpretări şi com-
portamente; adică pentru a suporta noi semantici. De altfel, navigatoarele Web actuale ofe-
ră un tot mai bun suport pentru documentele XML (a se vedea cele descrise în următorul
capitol).

1.4 Evoluţia semanticii

Testul suprem pentru ca un format de document să „supravieţuiască” pe Web este măsu-


ra în care conţinutul său suportă diversele tipuri de utilizări. Documentele există ca arte-
facte ale unor procese mai largi, precum achiziţionarea, raportarea sau dezvoltarea sof-
tware-ului, iar aceste utilizări ataşează componente semantice diferitelor părţi ale documentu-
lui.
Suportul pentru semantică al unui anumit format se referă începând de la comporta-
mentul operaţional codificat hard în procesele care manipulează conţinutul şi ajungând până
la a fi bine definit, adică a da definiţii larg disponibile şi documentate ale conţinutului.
Să considerăm un fişier text constând dintr-o listă cu acţiuni planificate pentru perioa-
da de timp imediat următoare. Acest fişier poate fi folosit drept mini-agendă de activităţi

8
descrise în limbaj natural de către un utilizator. O versiune HTML cuprinzând termene-
limită pentru fiecare activitate ar putea fi analizată de un program care procesează conţi-
nutul şi alertează utilizatorul (eventual printr-un mesaj pe telefonul mobil) în preajma
acestor termene. Mai mult, o a treia variantă a acestui fişier, în format XML, ar putea de-
clara o clasă de documente care să definească în mod explicit un marcator <agenda>
pentru datele dorite. Doar ultimul dintre formate poate pretinde că are o semantică bine
definită, legată de documentul însuşi prin intermediul oricărei aplicaţii separate – deoare-
ce, în acest caz, datele poartă cu ele însele „inteligenţă” şi nu aplicaţiile care le-ar putea
prelucra. Această semantică poate fi încapsulată în alte documente XML şi interschimbată
cu alte comunităţi de utilizatori, păstrându-şi totuşi neambiguitatea.
Limbajul XML suportă eficient ontologii ocazionale prin intermediul definiţiilor tipu-
rilor de documente (DTD) sau al schemelor care pot fi compuse în mod dinamic şi refe-
rite prin identificatori uniformi de resurse, în acest fel descentralizând, şi prin urmare ac-
celerând ciclul publicării şi adoptării noilor formate de documente.
În mod fundamental, ontologiile – reprezentând specificări ale unor conceptualizări –
întruchipează principiul peren care afirmă faptul că sistemele autoreprezentative sau
autodescriptive reduc costul unui articol. Prin stabilirea unei adrese Web (dată sintactic
printr-un URI) pentru un fragment de cunoştinţe conţinând programe şi/sau informaţii,
şi apoi prin partajarea acelei adrese cu alţii, autorii pun în practică procesul democratic
următor: orice persoană aparţinând comunităţii Web poate arăta că informaţiile respecti-
ve sunt interesante („bune”) prin crearea unei legături către această resursă, pentru o
eventuală folosire ulterioară. Utilizatorii nu copiază documentul iniţial, eventual operând
mici modificări, pentru că ar fi prea costisitor; cel mai ieftin mod de a accesa şi propaga
ideile conţinute de respectivul document este prin intermediul adresei Web, realizându-se
o legătură hipertext către acel fragment de informaţie. Aceasta alimentează ciclul selecţiei
naturale în reprezentarea cunoştinţelor: utilizarea determină comunitatea, care rafinează la
rândul ei, permanent, ontologia comună.
Un alt exemplu, relativ mai complex, este următorul. Să presupunem că în timp ce
parcurge această lucrare cititorul întâlneşte următoarea referinţă bibliografică, scrisă astfel:
„PHP, programare obiectuală şi XML”, Sabin Buraga, NET Report, 11
(03): 38-43 (2001)
Folosindu-şi intuiţia, cititorul ar putea stabili înţelesul acestei referinţe, pe când un ana-
lizor digital e posibil să nu fie capabil să o facă. Mai mult, din cauza diverselor convenţii
de publicare, alt editor ar putea formata referinţa în maniera următoare:
S. Buraga, „PHP, programare obiectuală şi XML”, NET Report, 2001,
Vol. 11, Nr. 03, pp. 38-43

9
Până şi diferenţele minore de punctuaţie şi de notaţie pot încurca un program de cal-
culator care încearcă să analizeze referinţa; drept rezultat, automatizarea conversiilor între
diversele formate reprezentând acelaşi tip de cunoştinţe este tentantă. Utilizarea unei sin-
taxe fragile, având doar o sintaxă de formatare şi una operaţională, deşi are destulă semni-
ficaţie pentru un utilizator uman, furnizează puţine informaţii pentru maşină.
Prin reformatarea referinţei utilizând marcarea prezentaţională a limbajului XHTML,
referinţa devine mai accesibilă, deşi regulile reale, tacite („cuvintele scrise italic reprezintă
publicaţia”) sunt invizibile:
<p>”PHP, programare obiectuală şi XML”,
Sabin Buraga,
<i>NET Report</i>,
<b>11</b> (03): 38--43 (2001)</p>

Deşi construcţiile XHTML permit autorului o oarecare precizare a structurii, impun în


acelaşi timp atât autorului, cât şi cititorului să cadă de acord asupra înţelesului atributelor,
al valorilor şi al modului lor de marcare. Această structură (ambiguă) bazată pe elementele
de prezentare a datelor permite autorului şi cititorului să scoată în evidenţă ceea ce este
important, dar reprezintă doar un stadiu incipient pe drumul către o marcare structurală
mai semnificativă.
Prin reformatarea referinţei utilizând marcarea structurală (destul de precară şi ea) a
limbajului XHTML, regulile reale de interpretare devin ceva mai clare („caracterele inclu-
se într-un element <cite> reprezintă un titlu de referinţă” şi „conţinutul elementului
<h3> referă numele unei publicaţii”):
<cite>PHP, programare obiectuală şi XML</cite>
<h3>NET Report</h3>
<h4>Sabin Buraga</h4>
<ul>
<li>11 (03)</li>
<li>38--43</li>
<li>2001</li>
</ul>

Utilizarea structurii de mai sus în referinţele bibliografice poate îmbunătăţi şi modul de


formatare a informaţiilor. Putem aminti aici şi pe unul dintre mecanismele precursoare,
reprezentat de sistemul BibTeX.
Mergem mai departe prin reformatarea referinţelor bibliografice utilizând un docu-
ment XML particularizat pentru astfel de referinţe. Astfel, regulile reale de interpretare
devin precise (mai ales dacă utilizăm spaţii de nume XML):
<bibliografie>
<titlu>PHP, programare obiectuală şi XML</titlu>
<revista>NET Report</revista>
<autor>

10
<prenume>Sabin</prenume>
<nume>Buraga</nume>
</autor>
<volum>11</volum>
<numar>3</numar>
<an>2001</an>
<pagini prima="38" ultima="43" />
</bibliografie>

Documentul din acest exemplu este bine formatat chiar în lipsa unei definiţii DTD sau
a unei scheme XML. Cititorul uman poate înţelege semantica, iar maşinile pot manevra
informaţiile marcate în XML foarte bine (de exemplu, se pot afişa toate revistele prin
parcurgerea marcajelor şi selectarea caracterelor din interiorul fiecărui element <revis-
ta>).
Acest tip de marcare permite modelului informaţional să fie mai descriptiv, astfel încât
o maşină să poată analiza lucrurile pe care o comunitate umană le înţelege de la sine. Pro-
blemele sintactice – precum codificarea caracterelor şi punctuaţia – sunt definite utilizând
adnotări structurate; manipularea documentelor – de exemplu restructurarea şi filtrarea –
pot fi automatizate, iar fiecare componentă a unui document poate fi identificată în mod
precis.
Putem continua rafinarea marcării datelor, stabilind un spaţiu de nume pentru marca-
jele definind referinţe bibliografice (în vederea evitării ambiguităţilor), în plus ataşând me-
ta-date – recurgând eventual la aserţiuni RDF (Resource Description Framework), un cadru
menit a descrie resursele – fiecărei informaţii (de exemplu, specificând faptul că Sabin
Buraga este autorul acelui articol, iar drepturile de proprietate intelectuală asupra publica-
ţiei sunt deţinute de altcineva etc.):
<rdf:Description
rdf:about="http://www.infoiasi.ro/~busaco/phpxml.pdf">
<bib:titlu>PHP, programare obiectuală şi XML</bib:titlu>
<bib:autor>
<rdf:Description
rdf:about="mailto:busaco@infoiasi.ro">
<bib:prenume>Sabin</bib:prenume>
<bib:nume>Buraga</bib:nume>
</rdf:Description>
</bib:autor>
</rdf:Description>

Această manieră de marcare face posibilă reprezentarea cunoştinţelor pentru:


- descoperirea resurselor prin furnizarea unor indicii utile motoarelor de căutare;
- catalogarea computerizată a conţinutului şi relaţiilor sale cu alte date, în vederea
constituirii bibliotecilor digitale;

11
- evaluarea conţinutului pentru agregare şi filtrare;
- codificarea, partajarea şi schimbul de cunoştinţe, într-o manieră inteligentă.
Meta-limbajul XML reprezintă principala speranţă şi totodată componenta de bază
pentru Web-ul semantic. Prin intermediul unor mecanisme de descriere în XML a resurselor
şi relaţiilor dintre acestea, se va oferi cadrul necesar pentru interoperabilitatea între diver-
se aplicaţii care realizează schimburi inteligente de informaţii.

Nodurile şi legăturile au asociate descrieri semantice

Conform creatorului spaţiului WWW, Sir Tim Berners-Lee, Web-ul semantic reprezin-
tă o pânză consistentă şi logică a tuturor resurselor de pe Web, accentul punându-se pe
interpretarea datelor de către maşină şi nu pe reprezentarea lor. Trebuie să menţionăm
aici faptul că o serie de companii de renume – precum Adobe, Hewlett-Packard, IBM,
Nokia şi Oracle, pentru a da numai câteva exemple – contribuie deja la realizarea de in-
frastructuri şi/sau aplicaţii software destinate Web-ului semantic.

12
Formatul de
Sintaxa Stilul Structura Semantica
document

ASN.1 (Abstract Tip-lungime- Dependentă de


Binară
Syntax Notation) valoare aplicaţie

ASCII,
Text Linii Limbaj natural
Unicode,...

Directive
troff Text lizibil Secţiuni, pagini Compunere
interne

Program li-
TeX LaTeX Secţiuni, pagini Compunere
zibil

PS Limbaj de
Pagini Desenare
(PostScript) programare

RTF
Directive Caractere, para-
(Rich Text For- Text opac
extensibile grafe
mat)

Formatare
HTML
Directive
(HyperText Text lizibil Prezentaţională
imbricate
Markup
Language)

Fixă
Structură
Text lizibil CSS Declarativă (e.g.:
HTML
<address>)

XML
(Extensible
Text lizibil CSS, XSL Declarativă Extensibilă
Markup
Language)

Scheme pentru
RDF
meta-date,
(Resource
Text XML Declarativă suport pentru
Description
descrieri seman-
Framework)
tice

Comparaţie între diverse formate de documente în evoluţia Web-ului

13
1.5 Evoluţia elementelor programabile

Evoluţia către formatele declarative (vezi tabelul de mai sus) poate fi constatată nu numai
în domeniul documentelor, ci şi în tendinţele comunităţii programatorilor. Aceleaşi forţe
par să acţioneze şi în dezvoltarea succesivă a limbajelor de programare de tipul mai mult
declarativ şi mai puţin operaţional: de exemplu, de la cod-maşină evoluţia a condus la
limbajul de asamblare, apoi spre Pascal, C, C++, Perl, Java, Python, Pike şi C#.

De asemenea, Web-ul – prin evoluţia continuă a limbajelor bazate pe XML – poate fi


considerat un veritabil sistem hipermedia distribuit, utilizând ca infrastructură Internet-ul.
Prin popularea acestei infrastructuri cu seturi de componente orientate-obiect şi găsirea
de modalităţi (semantice) de integrare a acestora, Web-ul poate fi privit ca un mediu ete-
rogen pentru dezvoltarea şi exploatarea de sisteme obiectuale distribuite menite a mani-
pula componente multimedia.

Interacţiunile dintre server, client şi utilizator din prisma unei aplicaţii Web

Iniţial, spaţiul WWW era compus din pagini (documente) statice – incluzând text şi
imagini, apoi elemente multimedia –, interconectate prin intermediul legăturilor hipertext.
Aplicaţii de tip client (precum navigatoarele Web) erau folosite pentru accesarea – via
adrese (URI) – a reprezentării acestor resurse, stocate pe servere Web. Programe supli-
mentare (plug-in-uri), incluse în navigatoarele Web, erau menite să redea tipuri de conţinu-
turi nestandardizate, ca fişiere Word, PostScript, PDF (Portable Document Format), Flash
etc. Pentru a oferi conţinut dinamic utilizatorilor, sunt adoptate diverse modalităţi pro-
gramatice, reprezentate pe partea de server de programe CGI (Common Gateway Interface),
servere de aplicaţii precum PHP (PHP: Hypertext Processor), JSP (Java Server Pages), ASP
(Active Server Pages) sau ASP.NET, iar pe partea de client de programe JavaScript sau
applet-uri Java.

14
De remarcat faptul că o serie de elemente programabile funcţionează drept componen-
te middleware (generând de fapt o arhitectură 3-tier ori N-tier), reprezentând interfeţe pen-
tru accesarea unor servicii aflate la distanţă (e.g.: sisteme relaţionale de baze de date).

Modelul client/server pe care se bazează Web-ul nu oferă suport suficient pentru dez-
voltarea de aplicaţii distribuite pe scară largă, lipsind o serie de facilităţi precum
scalabilitatea, serviciile de bază (i.e. servicii de nume, servicii de regăsire a resurselor etc.)
sau securitatea. Programele CGI nu sunt scalabile deoarece fiecare instanţă a acestora ne-
cesită un proces separat, executat pe serverul Web pentru a procesa cererile solicitate de
un client particular. Serviciile sunt limitate deseori la accesarea unuia sau mai multor sis-
teme de gestiune a bazelor de date, uzual tranzacţiile efectuându-se necriptat. Aceeaşi si-
tuaţie persistă chiar în cazul unor soluţii mai recente, orientate-obiect, bazate pe infras-
tructuri precum CORBA/IIOP sau OLE/DCOM ori pe medii (framework-uri) de pro-
gramare Java şi .NET.

Continua dezvoltare a unor metodologii şi instrumente obiectuale orientate spre Web


prezintă o serie de avantaje principale, precum: extensibilitatea, interoperabilitatea pe di-
verse platforme, analiza, proiectarea şi dezvoltarea de componente programabile, reutili-
zarea componentelor software, oferirea de servicii distribuite (ca de exemplu, servicii pri-
vind numirea, transparenţa, replicarea, regăsirea etc.), mai buna utilizare a resurselor de
sistem.

În strânsă legătură cu familia de limbaje XML şi cu metodologiile obiectuale, unul din-


tre paşii importanţi ai evoluţiei spaţiului WWW îl reprezintă serviciile Web bazate pe XML.
Serviciile Web permit ca elemente programabile să fie plasate pe siturile Web, alţi pro-
gramatori/aplicaţii putând accesa funcţionalităţile acestor programe, în manieră distribui-
tă şi directă, pentru orice potenţial număr de sisteme independente, prin folosirea unor
standarde precum XML şi HTTP. O posibilă definiţie a conceptului de serviciu Web este
aceea că acesta reprezintă un sistem software proiectat pentru a suporta interacţiunea ma-
şină-maşină la nivel de Web, având o interfaţă de programare descrisă într-un format pro-
cesabil de către calculator. Un serviciu Web reprezintă o colecţie de funcţii împachetate,
considerate ca fiind o singură entitate şi publicate în spaţiul WWW cu scopul de a fi folo-
site de alte programe. Serviciile Web sunt cărămizile pentru crearea de sisteme distribuite
deschise, permiţând organizaţiilor şi dezvoltatorilor independenţi să-şi facă disponibile pe
Web bunurile digitale într-un mod rapid şi facil. Aceasta va conduce la adoptarea unei
alte viziuni privind programarea Web şi la construirea unei infrastructuri complexe pe
baza căreia să se dezvolte diverse aplicaţii specifice, precum serviciile Web semantice şi
agenţii Web, în domenii ca economia digitală, cercetarea ştiinţifică sau divertismentul in-
teractiv.

15
Calculatoarele sunt şi vor fi incluse în diferite tipuri de dispozitive, pe diverse scale,
precum telefoane celulare, palmtop-uri, notebook-uri, laptop-uri şi alte viitoare dispozitive
portabile. Aceasta implică adoptarea unor noi mijloace de interacţiune şi comunicare atât
între maşini, cât şi între calculatoare şi utilizatori, cercetările concentrându-se în prezent
pe studierea comunicaţiilor fără fir (wireless), în medii distribuite precum Web-ul,
folosindu-se diverse paradigme (peer-to-peer, sisteme de agenţi etc.).

Identificatorii uniformi de resurse, protocolul HTTP şi limbajul (X)HTML au reuşit să


îndeplinească practic scopurile principale ale Web-ului:

ƒ independenţa de dispozitiv (aceleaşi informaţii pot fi accesate via o multitudine de dis-


pozitive ca mainframe-urile, calculatoarele personale, dispozitivele mobile etc.),
ƒ independenţa de software (forme diferite de software – clienţi (navigatoare, roboţi Web
etc.) şi servere Web – oferă şi extrag informaţii într-o manieră universală, fără ca
nici un produs-program să reprezinte o componentă critică pentru spaţiul WWW,
deoarece Web-ul nu reprezintă un program, ci un set de protocoale şi specificaţii
standardizate, deschise, redactate de Consorţiul Web),
ƒ scalabilitatea (dezvoltarea exponenţială a Web-ului este un exemplu interesant al
efortului uman depus de comunitatea utilizatorilor Internet-ului, independent de
resursele hardware şi software disponibile),
ƒ multimedia (documentele, regăsite şi sub denumirea de pagini, disponibile pe Web
pot integra surse de informaţie multiple, în diverse forme, de la date discrete –
text, imagini statice precum fotografii, scheme, diagrame etc. – până la cele conti-
nue – animaţii, audio şi video).

Drept concluzie finală, Consorţiul Web – forţa motrice din spatele XML-ului – consi-
deră că misiunea sa este aceea de a conduce evoluţia Web-ului. Deşi a împărtăşit mai multe
idei comune Internetului – precum „software-ul gratuit se răspândeşte mai repede”, „sis-
temele ASCII proliferează mai rapid decât cele binare” şi „protocoalele proaste imită;
protocoalele bune fură” – a impus o strategie inovatoare: „autodescrierea”. Web-ul poate fi
construit peste el însuşi. Identificatorii universali de resurse, formatele de date uşor de proce-
sat de către maşină şi specificaţiile capabile de a fi interpretate de calculatoare pot fi îm-
pletite într-un sistem extensibil care asimilează orice concurenţă. În esenţă, apariţia limba-
jului XML în spectrul formatelor de date pentru Web pune capăt luptei asupra structură-
rii documentelor în vederea realizării viziunii originare a creatorilor Web-ului. La ora ac-
tuală, XML reprezintă unica modalitate existentă pentru adnotarea complexă a datelor.

16
2. O introducere în XML

2.1 Preliminarii

Ca şi SGML, din care se trage, XML (Extensible Markup Language) reprezintă un


standard internaţional pentru descrierea de marcaje (markups) ale textelor electronice dis-
ponibile pe Web. În fapt, XML reprezintă un meta-limbaj, o descriere formală a unui lim-
baj, în acest caz, un limbaj de adnotare (de marcare) a datelor. Specificaţiile XML au fost
dezvoltate începând cu 1996 în cadrul Consorţiului Web, de un grup de cercetare condus
de Jon Bosak de la Sun Microsystems, la care au aderat ulterior o serie de grupuri de ex-
perţi din comunităţile academice (Text Encoding Initiative, NCSA, James Clark) şi indus-
triale (Sun, IBM, Netscape, Oracle, Adobe etc.). Prima versiune a specificaţiei XML a
fost standardizată în 1998 de către Consorţiul Web, fiind revizuită în 2000, apoi în anul
2004.

XML reprezintă o metodă de descriere universală a informaţiei astfel încât atât compu-
terele, cât mai ales oamenii să o poată înţelege. Scopurile limbajului au fost cele legate de
utilizarea lui în Internet, suportând o varietate de aplicaţii, păstrând compatibilitatea cu
vechiul SGML, dar fiind mult mai flexibil decât HTML.

XML trebuie să asigure o prelucrare facilă a documentelor, în termeni concişi şi clari,


numărul de opţiuni facultative fiind redus la minim, ideal nul. Documentele XML trebuie
să fie uşor de conceput şi de înţeles de către un cititor uman.

2.2 Ce este XML?

Deşi tehnologiile XML şi HTML (HyperText Markup Language) au drept strămoş co-
mun meta-limbajul SGML, ele sunt complet diferite. Limbajul HTML este simplu de în-
văţat şi poate fi utilizat pe multe platforme, fiind considerat universal. Foarte bun în a
afişa informaţii pe Web, HTML nu reprezintă soluţia potrivită pentru a le descrie. Din
acest motiv, s-a ajuns la XML: o metodă universală pentru a reprezenta, a descrie infor-
maţii hipertext. Din acest punct de vedere, XML poate fi văzut ca o tehnologie comple-
mentară limbajului HTML, nu ca o înlocuire a sa.

De exemplu, dacă am considera un fragment de document HTML utilizat pentru a


stoca informaţii dintr-o listă privitoare la colegii de grupă, acesta ar putea avea forma:
<p>Coleg:</p>
<p>Nume: <b>Stefan Ciprian Tanasa</b></p>
<p>Adresa: <i>Str. Berthelot, 16 - Iaşi</i></p>
<p>Telefon: 032-201090</p>
<p>E-mail: <tt>stanasa@infoiasi.ro</tt></p>

17
Din perspectiva unui calculator (a unei aplicaţii de prelucrare a acestor informaţii), nu
există nici o indicaţie asupra faptului că informaţia ar fi structurată. În schimb, conside-
rând aceeaşi informaţie reprezentată prin XML, fragmentul de document ar putea fi:
<coleg>
<nume>Stefan Ciprian Tanasa</nume>
<adresa>Str. Berthelot, 16 - Iaşi</adresa>
<telefon>032-201090</telefon>
<email>stanasa@infoiasi.ro</email>
</coleg>

Dacă fragmentul de document HTML de mai sus indică mai mult modalităţile de afişa-
re a datelor (forma), documentul XML descrie structura datelor (putem afirma că este
vorba de un coleg, pentru el memorând numele şi diverse maniere de contact). Cunos-
când structura datelor, se pot executa diferite operaţii asupra acestora (e.g. afişarea doar a
numelor colegilor, trimiterea de felicitări tuturor colegilor din Iaşi, generarea unui tabel
conţinând numerele de telefon etc.).

2.3 Trăsături principale ale XML

1. Subset simplificat al SGML


o foarte puternic, dar uşor de implementat
o fără limite în ceea ce priveşte complexitatea structurilor care pot fi defini-
te
o îndeajuns de compact pentru a fi suportat de navigatoarele Web
2. Oferă suport pentru uzul internaţional
o marcajele şi conţinutul pot fi reprezentate în Unicode
o uneltele de dezvoltare XML pot suporta orice codificări
3. Meta-limbaj
o conceput pentru a suporta definirea unui număr nelimitat de limbaje spe-
cializate, oferind suport de extinderi
o portabilitate

2.4 Familia XML

Limbajul XML oferă mai mult decât o sintaxă comodă pentru reprezentarea datelor
structurate sau semi-structurate. XML consistă dintr-o familie de limbaje bazate pe XML
pentru reprezentarea datelor şi relaţiilor dintre ele.

Această familie de limbaje, menite a adapta conceptele curente de publicare a docu-


mentelor la Internet, este compusă din:

18
• XML (Extensible Markup Language) - subset al specificaţiei SGML, conceput
pentru o implementare mai uşoară.

• XLL (Extensible Linking Language) - set al mecanismelor hipertext bazate pe


standardele HyTime şi Text Encoding Initiative, concretizat în două componente
majore:

o XLink - conceput pentru descrierea legăturilor dintre obiectele Internet;

o XPointer - compus dintr-o serie de termeni de localizare relativi la alte lo-


caţii.

• XSL (Extensible Stylesheet Language) - limbaj standard al foilor de stil, per-


miţând transformarea documentelor XML în alt tip de documente (XML,
XHTML, MathML etc.). XSL este recomandare a Consorţiului Web din luna oc-
tombrie 2001.

De asemenea, există o multitudine de aplicaţii bazate pe XML, dintre care se pot enu-
mera limbaje pentru:

• reprezentarea expresiilor matematice (MathML),

• descrierea resurselor Internet (RDF - Resource Description Framework) - baza pentru


Web-ul semantic,

• crearea de ilustraţii (conţinuturi grafice) vectoriale (SVG - Scalable Vector Graphics);

• realizarea de prezentări multimedia sincronizate (SMIL - Synchronized Multimedia


Integration Language),

• reprezentarea şi interschimbarea informaţiilor referitoare la afaceri pe Web


(BRML - Business Rules Markup Language),

• transferul de date în medii mobile (WML - Wireless Markup Language),

• descrierea serviciilor Web (WSDL - Web Services Description Language).

2.5 Structura documentelor XML

Un document XML este format din marcaje (reprezentate de tag-uri) şi date caracter.
Termenul de marcaj (markup) a fost folosit iniţial pentru a descrie anumite adnotări, note
marginale în cadrul unui text cu intenţia de a indica tehnoredactorului cum trebuie forma-
tat ori listat un anumit pasaj. Generalizând, putem defini marcajul drept orice acţiune de a
interpreta explicit o porţiune de text. Un marcaj este un şir de caractere delimitat de ca-
racterele "<" şi ">". Datele caracter reprezintă conţinutul propriu-zis al marcajelor.

În XML, spre deosebire de HTML, marcajele nu sunt folosite pentru afişarea datelor
conţinute, ci au alte scopuri printre care se pot enumera următoarele:

19
• Asigură o sintaxă simplă şi standardizată pe care analizoarele (procesoarele) XML
o pot folosi pentru a utiliza informaţia stocată;

• Oferă o metodă de a descrie structura ierarhică a conţinutului prin divizarea in-


formaţiei (datele caracter) în părţi numite elemente care pot avea ataşate proprietăţi
particulare desemnate de atribute. Structura ierarhică a întregului document este
pusă în evidenţă prin utilizarea marcajelor.

Un document XML poate fi împărţit în trei secţiuni generale de colecţii de marcaje:

• Prolog

• Declaraţia tipului de document

• Elementul rădăcină

Fiecare dintre aceste secţiuni poate fi mai departe divizată în structuri mai detaliate.

Există mai multe tipuri de marcaje care pot fi folosite într-un document XML, cele mai
importante fiind: tag-ul de început şi tag-ul de sfârşit ale unui element, atributele unui ele-
ment, comentariile, referinţele la entităţi şi declaraţia tipului de document.

Elementele reprezintă blocurile de bază ale unui document XML (sau SGML). Pot fi fo-
losite atât pentru a conţine informaţii, cât şi pentru definirea structurii. Un element înce-
pe cu un tag de start şi se termină cu un tag de sfârşit. Tag-ul de început este desemnat de un
singur cuvânt - numele elementului - delimitat de caracterele "<" şi ">" (nu sunt permise
spaţiile albe). De exemplu, în HTML <h1> este tag de start al elementului h1, iar </h1>
reprezintă tag-ul de sfârşit al acestuia.

Spre deosebire de HTML, limbajul XML este case sensitive (literele minuscule diferind
de cele majuscule), din acest motiv următoarele exemple fiind greşite:
<tag>exemplu</TAG> sau <Tag>exemplu</tag>. De asemenea, numele unui ele-
ment nu poate începe cu un număr şi nici nu poate conţine spaţii.

Elementele nu sunt folosite doar pentru a conţine informaţii, ci şi pentru a pune în


evidenţă structura documentelor XML, după cum se poate remarca din următorul exem-
plu:
<colegi>
<coleg>
<nume>Stefan Ciprian Tanasa</nume>
<adresa>
<localitate>Iaşi</localitate>
<strada>Berthelot</strada>
<numar>16</numar>
</adresa>
<telefon>032-201090</telefon>

20
<email>stanasa@infoiasi.ro</email>
</coleg>
</colegi>

Prin utilizarea acestor elemente imbricate, datele sunt mai bine organizate, facilitând
eventualele operaţii de căutare, afişare sau sortare a datelor. În XML pot fi folosite şi
elementele vide (care nu conţin nimic), dar care au o sintaxă aparte. Dacă, de exemplu, o
persoană nu are număr de telefon, putem scrie <telefon></telefon> sau <telefon />,
ambele variante fiind corecte. Este respectată astfel regula cu privire la faptul că în XML
fiecare tag deschis trebuie obligatoriu închis.

Atributele au rolul de a descrie elementele. Putem face o analogie între atribute (descri-
ind elemente) şi adjective (care descriu substantive). Atributele sunt localizate în tag-ul de
start al unui element, imediat după numele elementului (acum este evident de ce nu pot
exista spaţii albe în numele unui element), sunt urmate de "=", apoi de valoarea atributu-
lui, scrisă între ghilimele. Dacă valoarea unui atribut nu este specificată între ghilimele va
fi semnalată o eroare, la fel ca şi în cazul în care pentru un atribut nu ar fi ataşată şi valoa-
rea acestuia. Pentru un element pot exista oricâte atribute, atât timp cât sunt declarate
corect.

Un exemplu incorect este <localitate codpostal=6600> în care valoarea atributului nu


este dată între ghilimele. Varianta corectă este <localitate codpostal="6600">.

Comentariile se specifică la fel ca şi în HTML, apărând între "<!--" şi "-->".

Un exemplu de comentariu:
<!-- Cel mai bun coleg -->

Construcţia "--" nu trebuie să apară în interiorul comentariilor. Nu există limite în ceea


ce priveşte lungimea comentariilor.

O altă utilitate a comentariilor este de a include în interiorul lor elemente pe care dorim
ca procesorul XML să le ignore.

Referinţele la entităţi sunt de fapt pointeri către entităţi. În XML, entităţile reprezintă uni-
tăţi de text, unde o unitate poate fi orice, de la un singur caracter la un întreg document
sau chiar o referinţă la un alt document.

Sintaxa referinţelor la entităţi este: &nume_entitate; (caracterul "&", urmat de nume-


le entităţii, apoi de caracterul ";"). Una dintre cele mai frecvente utilizări ale referinţelor
la entităţi este atunci când se doreşte folosirea unor caractere care ar duce la apariţia unor
confuzii pentru analizorul XML şi deci care nu ar trebui să apară în forma lor normală în
text. În momentul în care se întâlneşte referinţa la o entitate în document, aceasta se va

21
substitui cu datele pe care le referă şi se va returna documentul cu înlocuirile făcute (simi-
lar macro-urilor din limbajul C).

Tabelul de mai jos ilustrează entităţile predefinite de specificaţia XML:

Entitate Referinţa la entitate

< &lt;

> &gt;

& &amp;

' &apos;

" &quot;

Entităţile predefinite de XML

Sintetizînd, structura completă a unui document XML este:

• Prolog
o Comentarii
o Instrucţiuni de procesare
• Declaraţia tipului de document (opţională)
o Comentarii
o Instrucţiuni de procesare
o Declaraţii
ƒ Elemente
ƒ Atribute
ƒ Entităţi
ƒ Notaţii
• Element rădăcină
o Comentarii
o Instrucţiuni de procesare
o Elemente
ƒ Atribute
ƒ PCDATA
ƒ Referinţe la entităţi
o Referinţe la entităţi
o Secţiuni CDATA

22
Exemple

Documentele XML pot stoca informaţii structurate sau semi-structurate care ulterior
se pot prelucra într-o manieră comodă.

Astfel, o bază de date simplă poate fi memorată ca fişier XML astfel (desigur, această
abordare nu este unică):
<tabela>
<inregistrare id="0001">
<camp1 tip="numar">valoarea 1-1</camp1>
<camp2 tip="caracter">valoarea 1-2</camp2>
<!-- mai multe campuri -->
</inregistrare>
<inregistrare id="0002">
<camp1 tip="numar">valoarea 2-1</camp1>
<camp2 tip="caracter">valoarea 2-2</camp2>
</inregistrare>
<!-- mai multe inregistrari -->
</tabela>

La fel, documentele XML pot fi utilizate cu succes ca fişiere de configuraţie pentru di-
verse aplicaţii:
<config logdir="/var/log/app/"
debugfile="/tmp/app.debug">
<server name="odin" osname="solaris"
osversion="2.6">
<address>193.30.121.101</address>
</server>
<server name="fenrir" osname="linux"
osversion="2.4.2">
<address>193.30.121.197</address>
</server>
<server name="thor" osname="linux"
osversion="2.4.2">
<address>193.30.121.224</address>
<address>193.30.121.225</address>
</server>
</config>

Un alt exemplu priveşte specificarea cuprinsului unei cărţi. Acest document XML ar
putea avea structura următoare:
<?xml version="1.0" ?>
<!-- Un alt exemplu de marcare a datelor in XML (un cuprins de carte)

Autor: Sabin-Corneliu Buraga - busaco@infoiasi.ro

23
Versiune: 1.0 / 2004
Ultima modificare: 09 octombrie 2004
-->
<cuprins
titlu="Site-uri Web la cheie. Solutii profesionale de implementare"
editura="Polirom" an="2004">
<capitol>
<nume>Prefata</nume>
<autor>Sabin Buraga</autor>
<descriere></descriere>
</capitol>
<capitol>
<nume>Romania in Flash</nume>
<autor>Andrei Croitoru</autor>
<descriere>O scurta descriere a mediului Flash MX si a limbajului
ActionScript, reprezentarea unui sablon de prelucrare a fisierelor
XML folosind aceasta tehnologie, cu exemplificare concreta prin pris-
ma a doua module constituiente ale aplicatiei "Romania in Flash", vor
reusi sa va convinga de usurinta si "libertatea de exprimare" in ceea
ce priveste programarea si design-ul Web, utilizand doar produsul
oferit de Macromedia - Flash MX. </descriere>
</capitol>
<capitol>
<nume>De la Flash la PHP. Dezvoltarea unui forum Web</nume>
<autor>Cosmin Varlan</autor>
<descriere>Capitolul va prezenta maniera de inter-operabilitate
dintre Flash si serverul de aplicatii PHP, precum si realizarea de
pagini Web dinamice.</descriere>
</capitol>
<capitol>
<nume>Portaluri educationale</nume>
<autor>Bogdan Manolache</autor>
<descriere>Capitolul de fata incepe cu o prezentare generala a
portalurilor, urmata de o incursiune in lumea portalurilor
educationale. Cea mai importanta parte a capitolului este dedicata
prezentarii modului de implementare in PHP a unei biblioteci virtuale
continand resurse multimedia. Aceasta biblioteca on-line ofera o
interfata Web de tip portal in interactiunea cu vizitato-
rii.</descriere>
</capitol>
<capitol>
<nume>Modelarea si reprezentarea relatiilor intre tabele</nume>
<autor>Sorin Bahmata</autor>
<descriere>Aplicatia DataR reprezinta un sit Web dezvoltat in
limbajul PHP ce ofera posibilitatea de a modela si reprezenta
metadatele asociate structurii bazelor de date relationale (mai

24
exact, a bazelor de date MySQL), aici incluzand si detalii despre
relatiile intre tabele. Modelarea relatiilor se realizeaza via
functiile PHP, iar reprezentarea acestora prin intermediul limbajului
Resource Description Framework (RDF).</descriere>
</capitol>
<capitol>
<nume>Noua provocare in grafica 2D - SVG</nume>
<autor>Catalin Bulancea</autor>
<descriere>Acest capitol descrie aplicatia RelVis, un sit Web ca-
re realizeaza vizualizarea unor baze de date relationale (tabelele si
relatiile dintre ele, plus informatii despre campuri si inregistrari)
prin intermediul limbajului SVG (Scalable Vector Graphics), standard
al Consortiului Web si alternativa de succes la formatul proprietar
Macromedia ShockWave Flash.</descriere>
</capitol>
<capitol>
<nume>FindMyHome, o solutie e-business in domeniul imobili-
ar</nume>
<autor>Viorel Atofani</autor>
<descriere>Capitolul de fata prezinta o privire de ansamblu asu-
pra unei idei de afaceri on-line, prin detalierea unei solutii prac-
tice de e-business, reprezentata de un portal Web in domeniul imobi-
liar. Din punct de vedere al implementarii, capitolul ofera o modali-
tate de procesare a fisierelor CSV (Comma Separated
Values).</descriere>
</capitol>
<capitol>
<nume>Managementul blog-urilor in Perl</nume>
<autor>Sabin Buraga</autor>
<descriere>Acest capitol descrie fenomenul Weblogging si maniera
de implementare si de exploatare a unui sistem rapid si flexibil de
Weblog-uri. Aplicatia - ruland ca o suita de programe CGI - este
scrisa in limbajul Perl.</descriere>
</capitol>
<capitol>
<nume>Hattrick - simularea meciurilor de fotbal pe Web</nume>
<autor>Daniel Puiu, Marian Bostan</autor>
<descriere>In cadrul acestui capitol este prezentata o modalitate
de simulare a unui meci de fotbal dintre doua echipe virtuale. Pe
langa descrierea detaliata a algoritmilor utilizati, se insista si
asupra tehnologiilor folosite, expunandu-se inter-operabilitatea lim-
bajului C# cu Microsoft SQL Server si XML.</descriere>
</capitol>
<capitol>
<nume>De la desktop la dispozitive wireless</nume>
<autor>Adrian Lazariuc</autor>

25
<descriere>Prezentul capitol expune modul de creare a unor
aplicatii pentru dispozitivele mobile, astfel incat acestea sa comu-
nice cu platforma desktop cat mai eficient. Pentru inceput, se
prezinta principalele caracteristici ale platformei Palm OS, urmand
apoi o incursiune in expunerea pasilor de realizare - folosind
ASP.NET si limbajul C - a unei aplicatii, exemplificandu-se intregul
proces de dezvoltare de software dedicat dispozitivelor handheld.
</descriere>
</capitol>
<capitol>
<nume>Anexa 1: ShockWave Flash (.SWF) versus
Scalable Vector Graphics (.SVG)</nume>
<autor>Andrei Croitoru, Catalin Bulancea</autor>
</capitol>
<capitol>
<nume>Anexa 2: PHP versus ASP.NET</nume>
<autor>Bogdan Manolache, Sabin Buraga</autor>
</capitol>
<capitol>
<nume>Bibliografie generala</nume>
</capitol>
</cuprins>

Alte exemple sunt furnizate în anexa A a lucrării de faţă.

Declaraţia tipului de document

Declaraţia tipului de document reprezintă un marcaj special care poate fi inclus în documente-
le XML cu rolul de a specifica existenţa şi locaţia definiţiei tipului de document (DTD - Docu-
ment Type Definition). Declaraţia tipului de document şi definiţia tipului de document sunt
noţiuni diferite. DTD-ul însumează un set de reguli formale care definesc structura unui
document XML, spre deosebire de declaraţia tipului de document care are rolul de a indi-
ca analizorului ce DTD trebuie să folosească pentru verificare şi validare. DTD-urile sunt
o reminiscenţă a SGML-ului şi în prezent tind a fi înlocuite de schemele XML.

Pentru a putea fi procesate, documentele XML trebuie să fie măcar documente bine
formatate. Documentele bine formatate sunt documentele corecte din punct de vedere sintac-
tic. Spre deosebire de HTML, XML este mai strict în ceea ce priveşte sintaxa. Regulile
care trebuie respectate pentru ca un document să fie bine formatat sunt:

• Faţă de HTML şi SGML, XML este case sensitive. Greşelile de scriere a elementelor
şi atributelor sunt destul de greu de detectat, mai ales când nu se foloseşte un edi-
tor XML specializat.

26
• Fiecare tag deschis trebuie închis, în caz contrar analizorul XML va semnala eroa-
re.

• Primul tag deschis trebuie să fie ultimul care este închis. tag-urile trebuie închise
exact în ordinea inversă a deschiderii lor, altfel va fi semnalată eroare (construcţia
<client><adresa>...</client></adresa> este incorectă).

• Nu sunt acceptate elementele vide. Elementele vide au sintaxa modificată: <ele-


ment />.

Un document XML valid este acel document bine formatat a cărui structură este con-
formă cu DTD-ul ataşat (pot fi valide doar documentele care au ataşat un DTD).

Un analizor XML efectuează două nivele de verificare a unui document XML. După
verificarea corectitudinii sintactice, analizorul poate verifica dacă documentul este con-
form setului de reguli specificate de DTD-ul ataşat. Dacă sunt respectate aceste reguli,
atunci spunem despre documentul XML că este valid. Procesul de verificare dacă un do-
cument este valid se numeşte validare.

Sintaxa declaraţiei tipului de document diferă în funcţie de tipul DTD-ului: intern sau
extern.

• DTD-ul intern se declară imediat după declaraţia XML sau, dacă această declara-
ţie nu există, el va fi primul element exceptând comentariile, spaţiile de nume sau
instrucţiunile de procesare. DTD-ul intern se declară utilizând cuvântul cheie
DOCTYPE în modul următor:
<!DOCTYPE element_rădăcină [
declaraţii de elemente
declaraţii de atribute
declaraţii de entităţi,
declaraţii de instrucţiuni de procesare
declaraţii de notaţii
]>

• DTD-ul extern este definit într-un alt fişier text care trebuie să se afle la o adresă
specificată. Declaraţia este asemănătoare, dar intervin cuvintele cheie SYSTEM
sau PUBLIC:
<!DOCTYPE colegi
SYSTEM "http://undeva.ro/colegi.dtd">
<!DOCTYPE colegi
PUBLIC "parteneri" "http://undeva.ro/colegi.dtd">

Fişierul colegi.dtd aflat la adresa specificată în declaraţie conţine definiţiile elementelor


care vor apare în document. Elementul <colegi> trebuie să apară în DTD-ul specificat.

27
Un exemplu de document DTD este furnizat în continuare:
<!-- DTD definind tipul de document 'cuprins' -->
<!ELEMENT cuprins (coordonator?,capitol+)>
<!ELEMENT coordonator ANY>
<!ELEMENT capitol (nume,autor*,descriere?)>
<!ELEMENT nume (#PCDATA)>
<!ELEMENT autor (#PCDATA)>
<!ELEMENT descriere (#PCDATA)>

<!-- declararea unei entitati


(cu utilizarea entitatilor predefinite) -->
<!ENTITY busaco "Sabin Buraga &lt;busaco@infoiasi.ro&gt;">

<!ATTLIST cuprins
titlu CDATA #REQUIRED
editura CDATA #IMPLIED
an (2004|2005) "2004"
>
<!ATTLIST capitol
numar CDATA #REQUIRED
>
<!ATTLIST autor
email CDATA #IMPLIED
>

Se observă definirea elementelor cuprins, coordonator, capitol, nume, autor şi descrie-


re. Elementul cuprins (care e element rădăcină) va putea cuprinde elementele coordona-
tor (apariţia acestuia e opţională, aspect indicat de „?”) şi capitol (operatorul „+” indică
măcar o singură apariţie). Elementele vor apărea în secvenţă, lucru specificat de caracterul
virgulă. Elementul capitol va putea include elementele nume, autor şi descriere. Elemen-
tul autor poate apărea de 0, 1 sau mai multe ori, deoarece a fost specificat operatorul „*”.
Conţinuturile elementelor nume, autor şi descriere sunt şiruri de caractere (indicate de
#PCDATA), iar conţinutul elementului coordonator poate fi oricare (s-a folosit ANY).
Pentru elementul cuprins se specifică lista de atribute titlu, editura şi anul. Atributul titlu
are drept valoare un şir de caractere (CDATA) şi e obligatoriu (#REQUIRED), pe când
atributul editura este opţional (#IMPLIED). Atributul an are drept valori o enumerare de
valori, implicit fiind considerată valoarea 2004. Similar şi pentru celelalte.

Se specifică şi o entitate (numită „busaco”) care cuprinde un şir de caractere.

Documentul XML care trebuie validat conform acestui DTD va putea fi:
<!DOCTYPE cuprins SYSTEM "cuprins.dtd">
<!-- pentru validare se foloseste un DTD extern -->
<cuprins

28
titlu="Aplicatii Web la cheie. Studii de caz implementate in PHP"
editura="Polirom" an="2003">
<coordonator>&busaco;</coordonator>
<capitol numar="4">
<nume>E-Pizza - de la browser la WAP</nume>
<autor email="angel@infoiasi.ro">Cristian Neghita</autor>
<autor>Marius Ropota</autor>
<autor>Iavi Rotberg</autor>
<descriere>Aplicatia E-Pizza este o solutie completa pentru
managementul informatiilor referitoare la activitatea unei pizzerii,
incluzand comandarea on-line de produse, rezervarea de mese in
restaurant si administrarea facila prin intermediul unei interfete
Web. De asemenea, se descrie si o solutie de accesare - via
dispozitive WAP - a sitului, utilizandu-se limbajul WML.</descriere>
</capitol>
<capitol numar="7">
<nume>Accesul la baze de date prin servicii Web</nume>
<autor>Silvana Solomon</autor>
<descriere>Acest capitol prezinta principalele trasaturi ale
protocolului XML-RPC, prin care e posibila apelarea de proceduri la
distanta, mesajele schimbate fiind scrise in format XML, in vederea
implementarii de servicii Web bazate pe XML. Exemplificam utilizarea
tehnologiei XML-RPC pentru gestiunea unei baze de date Web indiferent
de platformele folosite.</descriere>
</capitol>
</cuprins>

29
Verificarea validităţii unui document XML în cadrul editorului Kate oferit de mediul KDE sub Linux

2.6 Spaţii de nume XML

În unele situaţii pot apare confuzii atunci când se folosesc date din diverse surse (do-
cumente) XML care pot avea elemente cu acelaşi nume, dar cu semnificaţii diferite. Pen-
tru evitarea acestor ambiguităţi sunt folosite spaţiile de nume, astfel încât numele de elemen-
te vor fi identificate în mod unic, iar validarea se va realiza fără probleme.

30
Necesitatea folosirii spaţiilor de nume se poate remarca din exemplul următor, în care
avem două documente XML, primul cu informaţii despre colegii de grupă, al doilea des-
pre numele prietenilor:
<!-- colegi -->
<colegi>
<coleg>
<nume>Stefan Ciprian Tanasa</nume>
<adresa>Str. Berthelot, nr. 16 - Iaşi</adresa>
</coleg>
...
</colegi>

<!-- prieteni -->


<prieteni>
<prieten adresa="mailto:mihaela@infoiasi.ro">
<nume>Mihaela Brut</nume>
</prieten>
...
</prieteni>

Documentul (stocînd persoanelor invitate la un party) care le utilizează pe precedentele


şi foloseşte spaţii de nume pentru evitarea ambiguităţilor ar putea fi următorul:
<invitatie xmlns:c="http://www.undeva.ro/colegi.dtd">
<coleg>
<c:nume>Stefan Ciprian Tanasa</c:nume>
<c:adresa>Str. Berthelot, nr. 16 - Iaşi</c:adresa>
</coleg>
<p:prieten
xmlns:p="http://www.altundeva.ro/prieteni.dtd"
p:adresa="mailto:vcosmin@infoiasi.ro">
<nume>Cosmin Vârlan</nume>
</p:prieten>
</invitatie>

Atributul „xmlns” este folosit pentru declararea spaţiilor de nume, iar valoarea lui tre-
buie să fie un URI.

Spaţiile de nume se pot declara explicit (ca prefix sau substitut pentru numele complet
al unui spaţiu de nume) sau implicit (un spaţiu de nume pentru toate elementele domeniu-
lui lui de vizibilitate). În exemplul anterior s-au folosit ambele modalităţi de declarare.

După cum s-a văzut în exemplul de mai sus, fiecare element şi atribut XML poate fi
prefixat de identificatorul spaţiului de nume căruia îi aparţine.

31
Exerciţii

1. Să se organizeze în format XML datele referitoare la proprietăţile imobiliare ale


unei persoane, în vederea realizării ulterioare de programe pentru determinarea tu-
turor imobilelor unei persoane, listarea persoanelor dintr-un imobil, situaţia imobi-
lelor dintr-un cartier etc.

2. Să se marcheze în XML datele privitoare la medicamentele dintr-o farmacie: nume-


le medicamentului, producătorul, furnizorul, cantitatea, preţul, indicaţiile şi contra-
indicaţiile, valoarea livrărilor dintr-o lună etc.

3. Să se imagineze un set de documente XML care sa stocheze informaţii relative la


mersul trenurilor (orar, staţii intermediare, tipuri de trenuri) şi la rezervarea locuri-
lor si eliberarea de bilete la anumite trenuri. Se vor specifica spaţii de nume şi
DTD-uri pentru fiecare document în parte.

32
3. Procesarea documentelor XML

3.1 Modelul DOM

Consorţiul Web a propus pentru prelucrarea sofisticată a documentelor XML şi/sau


HTML un model obiectual denumit Document Object Model (DOM). Acest model reprezin-
tă o interfaţă de programare a aplicaţiilor destinate să prelucreze documentele HTML şi
XML, independentă de platformă şi de limbaj, definind structura logică a documentelor şi
modalităţile de accesare şi de modificare a lor.

Structura logică a documentelor este o structură arborescentă, obiectuală, documentele


fiind modelate utilizând obiecte, iar modelul nu furnizează doar o vizualizare structurată a
documentului, ci şi o modalitate de specificare a comportamentului lui şi a obiectelor
componente. Fiecare element al unui document poate fi privit, aşadar, ca un obiect, fieca-
re obiect având identitate şi propriile sale funcţii.

Consorţiul Web a structurat DOM pe mai multe nivele (stadii) de specificare a mode-
lului. Nivelul 0 (pentru HTML) a fost nivelul de funcţionalitate a versiunilor 3 ale naviga-
toarelor Netscape şi Internet Explorer. Nivelul 1 este recomandare standardizată din
1998, iar în anul 2000 a fost standardizat DOM - nivelul 2. Parţial, nivelul 3 al modelului
DOM s-a standardizat în cursul anului 2004.

DOM nu este o specificaţie binară şi nu defineşte nici o formă de interoperabilitate la


nivel binar, în contrast cu alte tehnologii. DOM reprezintă un model care specifică inter-
feţe şi nu este un set de structuri de date (abstracte). De asemenea, nu defineşte semanti-
ca detaliată a documentelor HTML sau XML.

DOM reprezintă documentele ca o ierarhie de obiecte-nod. Anumite tipuri de noduri


pot avea noduri copii (descendenţi) de diverse tipuri. Altele pot fi noduri frunză, lipsite
de descendenţi. Tipurile fundamentale de noduri sunt cele din următorul tabel:

33
Tip Descendenţi
Element, ProcessingInstruction, Comment,
Document
DocumentType

Element, ProcessingInstruction, Comment,


DocumentFragment
Text, CDATASection, EntityReference

DocumentType -
Element, ProcessingInstruction, Comment, Text,
EntityReference
CDATASection, EntityReference

Element, Text, Comment, ProcessingInstruction,


Element
CDATASection, EntityReference

Attr Text, EntityReference

ProcessingInstruction -

Comment -

Text -

CDATASection -

Notation -
Element, ProcessingInstruction, Comment,
Entity
Text, CDATASection, EntityReference

Tipurile de noduri DOM şi descendenţii lor

Pentru fiecare tip de nod, DOM oferă o interfaţă care desemnează constantele, variabi-
lele şi metodele ce vor putea fi folosite de programator într-o implementare efectivă a
modelului. Există o serie de interfeţe fundamentale (e.g. Document, DocumentFragment,
Node, NodeList sau Attr), plus diverse interfeţe extinse pentru a suporta implementări
având în vedere procesarea documentelor HTML.

Drept exemplificare, vom considera următorul document:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<html>
<head></head>
<body>
<ul>
<li>Secţiunea 1</li>
<li>Secţiunea 2</li>

34
<li>Secţiunea 3</li>
</ul>
<hr>
<!-- Sfârşit -->
</body>
</html>

Arborele de noduri-obiect asociat acestui document XHTML este ilustrat de figura


următoare:

Arborele de obiecte-noduri asociat unui document XHTML

În prezent, există implementări pentru DOM în majoritatea limbajelor de programare


(ActionScript, C/C++, C#, Java, JavaScript, Object Pascal, Perl, PHP etc.).

Inspectarea arborelui DOM se poate realiza direct în navigatorul Mozilla Firefox, via
componentei DOM Inspector. O captură-ecran edificatoare este dată mai jos.

35
Folosirea componentei DOM Inspector pentru vizualizarea arborelui DOM
asociat unui document XHTML

3.2 Procesarea XML prin SAX

Pentru documente de dimensiuni mari, modelul DOM este ineficient, deoarece înainte
de a se realiza prelucrarea, documentul respectiv trebuie încărcat complet în memorie. Ca
alternativă la implementările DOM, există o interfaţă simplă de programare destinată ma-
nipulării documentelor XML, însă nu atât de completă precum DOM. Această interfaţă
este denumită Simple API for XML (SAX).

Majoritatea celor care se ocupă de prelucrarea documentelor XML văd structura unui
document în formă arborescentă, iar modelul DOM oferă din plin posibilitatea de a ma-
nipula informaţiile în această manieră. Din punctul de vedere al implementatorilor această
abordare are numeroase deficienţe (maniera de stocare internă a arborelui de obiecte,
parcurgerea lui etc.). Unul dintre beneficiile utilizării interfeţei SAX este că arborele nu
mai trebuie construit, dându-i-se programatorului o altă cale de analiză a documentului
XML. Mai mult, SAX poate ajuta la convertirea datelor din formatul arborescent DOM

36
în alt format mai comod, iar pentru procesare nu este necesar a se memora întreaga in-
formaţie XML, ci numai părţile dorite.

Actualmente, biblioteci de procesare SAX sunt disponibile pentru orice limbaj de pro-
gramare: C/C++, Java, Perl, PHP, Python etc.

3.3 Analizoare XML

Pentru a nu reinventa de fiecare dată roata, pentru prelucrarea documentelor XML


vom trebui să recurgem la un analizor XML deja implementat în limbajul nostru preferat.
Analizoarele XML pot fi de două tipuri:

• analizoare fără validare care vor procesa un document XML verificând dacă acesta
este bine-formatat (adică respectă regulile privind sintaxa şi modul de imbricare a
tag-urilor);
• analizoare cu validare care vor realiza procesarea documentului XML prin verifica-
rea regulilor formale descrise de un DTD sau o schemă ataşate acestuia (aceste
analizoare sunt mai complexe, putând realiza, de exemplu, şi expandarea entităţi-
lor).

Unul dintre cele mai cunoscute analizoare fără validare este Expat, procesor XML ela-
borat de James Clark. Expat se află inclus şi în navigatorul Mozilla/Firefox şi este utilizat
şi de Perl sau de serverul de aplicaţii PHP. De asemenea, pot fi utilizate analizoarele
XML4C şi XML4J de la IBM (pentru limbajele C şi Java, respectiv), JAXP (Sun),
MSXML (Microsoft) sau Xerces (Apache). De asemenea, se pot menţiona şi libxml (parte
a proiectului GNOME) ori JDOM.

Pentru validarea documentelor XML se pot utiliza chiar şi navigatoarele Web actuale.

De exemplu, fie documentul XHTML eronat:


<?xml version="1.0"?>
<html xmlns:html="http://www.w3.org/1999/xhtml">
<table width=600 align=center>
</table>

Vom obţine mesajul de eroare din capturile-ecran de mai jos:

37
Validarea documentelor XML folosind navigatoarele Web

38
3.4 Procesarea documentelor XML în limbajul Perl

În cadrul acestui subcapitol vom urmări să prelucrăm documentele XML via script-urile
Perl, în vederea transformării lor în pagini Web.

Transformarea unui document XML în pagină Web


prin intermediul unui script Perl

Utilizarea analizorului Expat

Una dintre cele mai facile modalităţi de a prelucra documentele XML este cea a utiliză-
rii analizorului Expat dezvoltat de James Clark, a cărui funcţionalitate este încapsulată de
modulul XML::Parser. Acest modul va pune la dispoziţie obiectele XML::Parser şi
XML::Parser::Expat.

Analiza XML este bazată pe evenimente, fiecare tip de nod al arborelui asociat docu-
mentului XML declanşându-se un anumit eveniment care va trebui tratat de o rutină Perl
specificată de programator. Astfel, după iniţializarea analizorului, va trebui să folosim me-
toda setHandlers pentru a stabili ce funcţii vor fi apelate pentru fiecare tip de eveni-
ment.

Cele mai importante evenimentele generate de procesorul XML sunt:

• Start - indică apariţia tag-ului de început al unui element;

• End - desemnează apariţia tag-ului de sfârşit al unui element;

• Char - indică apariţia conţinutului text al unui element (caracterele de text


neprocesat dintre tag-ul de început şi cel de sfârşit);

• Comment - indică apariţia unui comentariu.

Într-un prim exemplu de utilizare a modulului XML::Parser vom asocia pentru eveni-
mentele Start, End şi Char câte o subrutină care va fi apelată la fiecare apariţie a eveni-
mentului în cauză.

Documentul XML biblio.xml care urmează stochează informaţii despre împrumu-


turile dintr-o bibliotecă:

39
<?xml version="1.0" ?>
<imprumuturi>
<imprumut>
<carte autor="J.P. Sartre" an="1999">
Zidul
</carte>
<client adresa="mituc@ac.tuiasi.ro">
Victor Tarhon-Onu
</client>
</imprumut>
<imprumut>
<carte autor="H. Hesse" an="1998">
Jocul cu margelele de sticla
</carte>
<client adresa="stanasa@infoiasi.ro">
Stefan Ciprian Tanasa
</client>
</imprumut>
</imprumuturi>

Dorim să generăm un tabel XHTML cu aceste informaţii, prin transformarea docu-


mentului XML de mai sus. Vom scrie următorul script Perl, în care vom substitui fiecare
element XML cu elementele XHTML corespunzătoare (aceste substituţii vor fi stocate în
tablouri asociative):
#!/usr/bin/perl
# utilizam modulul XML
use XML::Parser;

# definim tablourile hash de inlocuire a tag-urilor


# definim substitutiile de tag-uri de inceput
%start = (
"imprumuturi" => "<table border=\"1\">",
"imprumut" => "<tr>",
"carte" => "<td><b>",
"client" => "<td align=\"center\">"
);

# definim substitutiile de tag-uri de sfirsit


%sfirsit = (
"imprumuturi" => "</table>\n",
"imprumut" => "</tr>",
"carte" => "</b></td>",
"client" => "</td>"
);

# instantiem analizorul XML

40
my $parser = new XML::Parser(ErrorContext => 2);
# setam functiile de prelucrare
# a elementelor si continutului lor
$parser->setHandlers(
Start => \&procesare_start,
# functia de procesare tag-uri de inceput
End => \&procesare_sfirsit,
# functia de procesare tag-uri de sfirsit
Char => \&procesare_continut
# functia de procesare a continutului
);
# afisam antetul HTTP
print "Content-type: text/html\n\n";
# incarcam fisierul si il analizam
$parser->parsefile("biblio.xml");

# definim subrutinele pentru prelucrarea


# elementelor XML si continutului lor
sub procesare_start
{
# primul argument este instanta procesorului XML
my $procesor = shift;
# al doilea argument este numele elementului
# corespunzator tag-ului de inceput
my $element = shift;
# afisam codul HTML, folosind tabloul hash
print $start{$element};
}
sub procesare_sfirsit
{
# primul argument este instanta procesorului XML
my $procesor = shift;
# al doilea argument este numele elementului
# corespunzator tag-ului de sfirsit
my $element = shift;
# afisam codul HTML, folosind tabloul hash
print $sfirsit{$element};
}
# rutina de afisare a continutului
sub procesare_continut
{
# am preluat argumentele furnizate
my ($procesor, $data) = @_;
# afisam datele
print $data;
}

41
Funcţiile asociate evenimentelor de procesare XML vor primi drept argumente instan-
ţa procesorului Expat şi numele elementului curent (pentru evenimentele Start şi End)
sau conţinutul dintre tag-urile de început şi de sfârşit (pentru evenimentul Char).

Ieşirea script-ului prezentat mai sus este:


Content-type: text/html

<table border="1">
<tr>
<td><b>
Zidul
</b></td>
<td align="center">
Victor Tarhon-Onu
</td>
</tr>
<tr>
<td><b>
Jocul cu margelele de sticla
</b></td>
<td align="center">
Stefan Ciprian Tanasa
</td>
</tr>
</table>

Analizorul Expat oferă programatorului funcţionalităţi multiple, denumite stiluri de pro-


cesare. Stilul implicit a fost utilizat în script-ul precedent. Mai pot fi folosite:

• stilul de depanare Debug,

• stilul de analiză cu subrutine Subs în care fiecare apariţie a unui tag dis-
tinct va fi tratată de o subrutină purtând acelaşi nume cu elementul corespunzător
acelui tag, iar pentru tratarea tag-urilor de sfârşit va fi invocată o subrutină având
numele elementului urmat de caracterul "_" (vezi mai jos),

• stilul de analiză arborescentă Tree, în care procesorul va returna arborele


de analiză al documentului XML, fiecare nod al arborelui fiind de forma (nume
de tag, conţinut).

Stabilirea stilului de procesare se va face la iniţializarea analizorului, prin intermediul


opţiunii Style. Constructorul respectiv va putea avea drept argumente şi alte atribute de
procesare precum:

• protocolul de codificare a documentului XML: ProtocolEncoding (pot


fi specificate valori, e.g. UTF-8, ISO-8859-1 sau UTF-16);

42
• modalitatea de raportare a erorilor: ErrorContext a cărui valoare este
numărul de linii care vor fi afişate la apariţia unei erori de analiză XML (de obicei,
se preferă valoarea 2);

• funcţiile asociate evenimentelor generate de procesorul Expat: Handlers


(este un tablou asociativ având drept chei nume de evenimente şi drept valori re-
ferinţe la subrutinele de tratare a evenimentului respectiv);

În continuare, vom utiliza stilul de procesare Subs pentru a putea prelucra comod şi
valorile atributelor unui element particular. Folosind biblio.xml ne propunem să afi-
şăm atât titlul cărţilor împrumutate, cât şi autorul şi data apariţiei (acestea se regăsesc ca
atribute ale elementului <carte>). Pentru fiecare element al documentului, va trebui să
scriem o rutină de tratare a apariţiei tag-ului de început al acestuia. La fel, va trebui să
concepem o rutină de tratare a fiecărei apariţii a tag-ului de sfârşit. Tot în cadrul acestui
exemplu vom vedea cum putem accesa valorile atributelor unui element, prin utilizarea
unui tablou asociativ.

Codul sursă al script-ului este:


#!/usr/bin/perl

# utilizam modulul XML


use XML::Parser;

# numarul de rinduri de tabel


$rinduri = 0;
# instantiem analizorul XML
my $parser = new XML::Parser(
Style => 'Subs',
# apelare de subrutine pentru fiecare tag
ErrorContext => 2);
# setam functiile de prelucrare
# a elementelor si continutului lor
$parser->setHandlers(
Char => \&procesare_continut
# functia de procesare a continutului
);

# afisam antetul HTTP


print "Content-type: text/html\n\n";
# incarcam fisierul si il analizam
$parser->parsefile("biblio.xml");

# rutina de afisare a continutului


sub procesare_continut

43
{
# am preluat argumentele furnizate
my ($procesor, $data) = @_;
# afisam datele
print $data;
}
# rutinele care vor fi apelate pentru
# fiecare aparitie a unui tag de inceput
sub imprumuturi
{
print "<!-- Generat de Perl -->\n";
print "<table align=\"center\" border=\"1\">";
}

sub imprumut
{
$rinduri++;
# rindurile pare vor avea fundal diferit
if ($rinduri % 2 == 0) {
print "<tr bgcolor=\"#CCCCCC\">";
}
else {
print "<tr>";
}
}
sub carte
{
my $procesor = shift;
my $element = shift;
# preluam atributele si le memoram
# intr-un tablou asociativ
while (@_) {
my $atribut = shift;
my $valoare = shift;
$atribute{$atribut} = $valoare;
}
# preluam atributele care ne intereseaza
my $autor = $atribute{'autor'};
my $aparitie = $atribute{'an'};
print "<td> $autor ($aparitie) <b>";
}
sub client
{
print "<td align=\"center\">";
}
# rutinele care vor fi apelate pentru

44
# fiecare aparitie a unui tag de sfirsit
sub imprumuturi_
{
print "</table>\n";
print "<!-- Final de generare -->\n";
}
sub imprumut_
{
print "</tr>";
}
sub carte_
{
print "</b></td>";
}
sub client_
{
print "</td>";
}

Utilizarea modelului DOM

Pentru a beneficia de interfeţele puse la dispoziţie de DOM (vezi cele descrise mai
sus), vom recurge la modulul XML::DOM care extinde o serie din funcţionalităţile proce-
sorului Expat.

Modulul oferă obiectul XML::DOM::Parser care este derivat din XML::Parser. Vom
putea procesa documentele XML conform specificaţiilor DOM - nivelul 1 descrise de
Consorţiul Web. Un document va fi regăsit în DOM ca instanţă a clasei Document. Un
obiect de tip Document va fi compus din obiecte de tipul Node. Un obiect Document va
putea include noduri de tip Element, Text Comment şi CDATASection, iar un Element
va putea avea noduri Attr, Element, Text, Comment sau CDATASection. Alte tipuri de
noduri nu vor avea nici un descendent.

Un exemplu, în care vom afişa toţi autorii cărţilor împrumutate din bibliotecă (vom fo-
losi tot biblio.xml):
#!/usr/bin/perl

use XML::DOM;

# instantiem analizorul
my $parser = new XML::DOM::Parser;

# incarcam fisierul XML


my $doc = $parser->parsefile("biblio.xml");

45
# afisam toate atributele 'autor' ale elementelor <carte>

# preluam lista noduri element <carte>


my $noduri = $doc->getElementsByTagName("carte");
# numarul de noduri gasite
my $nr = $noduri->getLength;
# pentru fiecare nod gasit,
# preluam valoarea atributului
for (my $i = 0; $i < $nr; $i++)
{
my $nod = $noduri->item ($i);
my $autor = $nod->getAttribute("autor");
print $autor->getValue . "\n";
}

După cum se observă, datorită faptului că modulul este derivat din XML::Parser, pu-
tem utiliza metodele parsefile() sau parse() pentru a încărca un document XML în
vederea procesării.

Modulul XML::DOM oferă câteva metode noi care nu sunt specificate de recomanda-
rea DOM a Consorţiului Web. Se pot enumera:

• isValidName() verifică dacă numele unui element sau atribut este valid
conform specificaţiei XML;

• setTagCompression () stabileşte maniera de afişare a elementelor de-


clarate vide. Sunt acceptate trei stiluri:

• stilul 0 va conduce la afişarea în forma <vid/> sau


<vid atr="val"/>;

• stilul 1 va afişa elementele vide astfel: <vid></vid> sau <vid


atr="val"></vid>;

• stilul 2 este similar cu stilul 0, dar se va adăuga încă un spaţiu îna-


inte de "/>" (util pentru a genera cod XHTML spre a fi interpretat de na-
vigatoarele mai vechi).

Implicit, stilul de afişare este stilul 0.

• dispose() elimină referinţele circulare dintr-o listă NamedNodeMap sau


NodeList;

• setTagName() stabileşte numele unui element;

• getEntity() returnează o entitate, programatorul trebuind să specifice


numele acesteia;

46
• getValue() furnizează valoarea unei entităţi.

Alte module

Comunitatea programatorilor Perl are la dispoziţie o sumedenie de module utile pentru


diverse procesări asupra documentelor XML. În cele ce urmează vom descrie câteva din-
tre aceste module:

• XML::Simple oferă o interfaţă foarte simplă pentru citirea şi scrierea de


documente XML (indicat a fi utilizat pentru procesarea fişierelor de configuraţie,
a tabelelor de date de mici dimensiuni etc.);

• XML::Twig permite procesarea rapidă a documentelor XML de dimensi-


uni considerabile;

• XML::XSLT implementează funcţionalităţile specificaţiei XSLT, fiind ba-


zat pe XML::DOM;

• XML::Checker verifică validitatea documentelor XML sau a arborilor


DOM;

• XML::RSS permite crearea sau modificarea fişierelor RSS (Rich Site


Summary) bazate pe RDF (aceste documente sunt folosite pentru crearea de des-
crieri folosite de Netscape Netcenter sau Meerkat (O'Reilly), putând fi regăsite pe
situri precum Slashdot ori Freshmeat);

• XML::Writer oferă posibilitatea de a crea documente XML, într-un mod


asemănător modulului CGI;

• XML::RegExp adaugă extensii XML la expresiile regulate Perl.

Alte detalii sunt disponibile în volumul S. Buraga et al., Programare Web în bash şi Perl,
Polirom, Iaşi, 2002: http://www.infoiasi.ro/~cgi/.

3.5 Procesarea documentelor XML în PHP

Pentru a procesa documentele XML în cadrul programelor PHP, va trebui să avem la


dispoziţie un analizor XML instalat pe server, de exemplu un procesor SAX sau DOM.

Utilizarea lui Expat

După cum am văzut mai sus, analiza XML este bazată pe evenimente, fiecare tip de
nod al arborelui asociat documentului XML declanşând un anumit eveniment care va
trebui tratat de o funcţie definită de programator. Pentru a ataşa funcţii evenimentelor
XML, ne vom folosi de o serie de funcţii PHP predefinite:

47
• xml_set_element_handler() stabileşte funcţiile care vor fi apelate
pentru procesarea elementelor XML (pentru tag-urile de început şi de sfârşit);

• xml_set_character_data_handler() stabileşte funcţia care va fi ape-


lată atunci când analizorul întâlneşte un nod de tip CDATA (text);

• xml_set_processing_instruction_handler() defineşte funcţia care


va fi executată la apariţia unei instrucţiuni de procesare.

Alte funcţii importante puse la dispoziţie sunt:

• xml_parser_create() iniţializează analizorul XML şi returnează


o instanţă a sa;

• xml_parser_free() eliberează memoria alocată analizorului;

• xml_set_object() stabileşte adresele funcţiilor care vor fi utilizate de


analizor pentru a realiza procesarea documentului XML dorit;

• xml_parser_set_option() se foloseşte la setarea unor opţiuni de ana-


liză XML (e.g. modul de tratare a scrierii cu majuscule sau minuscule
a tag-urilor);

• xml_get_error_code() furnizează codul de eroare în urma


eşecului procesării.

Pot fi amintite, de asemeni, funcţiile dând mai multe amănunte despre erorile survenite
în timpul analizei: xml_error_string() şi xml_get_current_line_number(). Func-
ţia xml_parse() returnează, în caz de eşec, o serie de coduri de eroare ale căror constan-
te simbolice predefinite pot fi consultate în manualul PHP.

Vom defini o clasă pe care o vom folosi ulterior la procesarea documentelor XML
(vom salva acest cod în fişierul parseXML.php).
<?php

// o clasă pentru prelucrarea documentelor XML


class parseXML {
var $xml_parser; /* instanţa analizorului XML */
var $xml_file; /* numele fişierului XML */
var $html_code; /* codul HTML generat */
var $open_tags; /* mulţimea tag-urilor de început */
var $close_tags; /* mulţimea tag-urilor de sfârşit */

// constructor
function parseXML() {
$this->xml_parser = "";
$this->xml_file = "";

48
$this->html_code = "";
$this->open_tags = array();
$this->close_tags = array();
}
// destructor
function destroy() {
if ($this->xml_parser)
xml_parser_free($this->xml_parser);
}
// metode
// setează tag-urile de început
function set_open_tags($tags) {
$this->open_tags = $tags;
}
// setează tag-urile de sfârşit
function set_close_tags($tags) {
$this->close_tags = $tags;
}
// setează numele fişierului XML
function set_xml_file($file) {
$this->xml_file = $file;
}

// furnizează codul HTML generat


function get_html_code() {
return $this->html_code;
}
// tratarea evenimentului de
// apariţie a unui tag de început
function start_element($parser, $name, $attrs) {
if ($format = $this->open_tags[$name])
$this->html_code .= $format;
}
// tratarea evenimentului de
// apariţie a unui tag de sfârşit
function end_element($parser, $name) {
if ($format = $this->close_tags[$name])
$this->html_code .= $format;
}
// tratarea evenimentului de
// apariţie a unui element de tip CDATA
function character_data($parser, $data) {
$this->html_code .= $data;
}
// tratarea evenimentului de
// apariţie a unei instrucţiuni de procesare

49
function processing_instruction($parser, $target, $data) {
switch (strtolower($target)) {
case "php": eval($data);
break;
}
}
// funcţia de analiză propriu-zisă
function parse() {
// instanţiază procesorul XML
$this->xml_parser = xml_parser_create();

// înregistrează funcţiile de analiză


xml_set_object($this->xml_parser, &$this);

// seteaza opţiunile de analiză


// (tag-urile nu sunt rescrise cu caractere mari)
xml_parser_set_option($this->xml_parser,
XML_OPTION_CASE_FOLDING, false);

// setează funcţiile de procesare a elementelor XML


xml_set_element_handler($this->xml_parser,
"start_element", "end_element");
xml_set_character_data_handler($this->xml_parser,
"character_data");
xml_set_processing_instruction_handler($this->xml_parser,
"processing_instruction");

// deschide fişierul XML


if (!($fp = fopen($this->xml_file, "r")))
die("could not open XML source");
// procesează fişierul
while ($data = fread($fp, 4096)) {
if (!xml_parse($this->xml_parser, $data, feof($fp))) {
// eroare de procesare
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($this->xml_parser)),
xml_get_current_line_number($this->xml_parser)));

}
} /* while */
} /* parse() */
} /* class */
?>

50
Folosind această clasă, putem transforma un document XML în cod HTML, după
cum se poate remarca din exemplul de mai jos, unde va fi prelucrat fişierul cu impresii
despre un anumit sit Web şi va fi generat un tabel HTML.

Documentul XML conţinând impresii privitoare la un sit Web are structura de mai jos:
<impresie data="01 Nov 2005, 11:33"
client="fenrir.infoiasi.ro (193.231.30.197)">
<nume email="socrate@tuiasi.ro">Radu Filip</nume>
<ocupatia>Student</ocupatia>
<virsta>18-25</virsta>
<text>
Salut!...
Ce mai faci?
</text>
</impresie>
<impresie data="02 Nov 2005, 18:42"
client="localhost (127.0.0.1)">
<nume email="luminish@infoiasi.ro">Luminiţa Chiran</nume>
<ocupaţia>Cadru didactic</ocupaţia>
<virsta>25-35</virsta>
<text>
Îmi place, însă cred că ar fi trebuit să pui şi ceva
referitor la adnotarea lingvistică (e.g. TEI).
Luminiţa
</text>
</impresie>

Codul-sursă PHP este dat în continuare:


<?php
// necesită prezenţa clasei definite mai sus
require("parseXML.php");

// substituţia tag-urilor XML cu cod HTML


// se folosesc două tablouri asociative
$open_tags = array(
"impresii" => "\n<!-- generat de parseXML -->\n" .
"<table cellpadding=\"5\" align=\"center\" border=\"1\">",
"impresie" => "<tr align=\"center\">",
"nume" => "<td><h4>",
"ocupatia" => "<td><p style=\"color: blue\">",
"virsta" => "<td><p><i>",
"text" => "<td bgcolor=\"#EEEEEE\"><p align=\"justify\">");
$close_tags = array(
"impresii" => "</table>\n" .
"<!-- sfârşitul generării parseXML -->\n",

51
"impresie" => "</tr>",
"nume" => "</h4></td>",
"ocupatia" => "</p></td>",
"virsta" => "</i></p></td>",
"text" => "</p></td>");

// instanţiază şi iniţializează analizorul


$parser = new parseXML();
$parser->set_xml_file("impresii.xml");
$parser->set_open_tags($open_tags);
$parser->set_close_tags($close_tags);
// rulează analizorul
$parser->parse();
// afişează rezultatul
echo $parser->get_html_code();
// distruge obiectul
$parser->destroy();
?>

Clasa definită este suficient de generală pentru a putea fi utilizată pentru orice tip de
document XML. Tag-urile netratate de programul nostru vor fi ignorate.

De multe ori însă ar fi de dorit să realizăm anumite prelucrări asupra datelor stocate de
fişierele XML. Putem încă să ne slujim de parseXML. De exemplu, am dori ca utilizatorul
(sau autorul sitului) să poată trimite mesaje celor care şi-au lăsat impresiile. Pentru aceasta
vom defini o clasă derivată din clasa parseXML şi vom redefini funcţiile
start_element() şi end_element():

<?php
require("parseXML.php");

// folosirea moştenirii pentru a defini


// un alt comportament
class parseXML2 extends parseXML {

// indică dacă există atributul "email"


var $is_email = 0;

// redefinirea metodelor
function start_element($parser, $name, $attrs) {
// apelează metoda din clasa de bază
parseXML::start_element($parser, $name, $attrs);
// pune şi link spre adresa e-mail
if (!strcmp($name, "nume")) {
if ($attrs["email"]) {
$format = "<a title=\"Trimite mesaj la " .
$attrs["email"] .

52
"\" href=\"mailto:" . $attrs["email"] . "\">";
$this->html_code .= $format;
$this->is_email = 1;
}
else
$this->is_email = 0;
}
}

function end_element($parser, $name) {


// închide
if (!strcmp($name, "nume")) {
if ($this->is_email) {
$format = "";
$this->html_code .= $format;
}
}
// apelează metoda din clasa de bază
parseXML::end_element($parser, $name);
}
}
?>

Noul membru de tip dată is_email este folosit pentru a putea închide corect tag-urile
elementului <a> (se poate întâmpla ca atributul email să nu apară). Restul codului rămâ-
ne acelaşi, în loc de $parser = new parseXML() trebuind fi scrisă linia
$parser = new parseXML2().

O posibilă rulare a scriptului PHP de mai sus poate avea ca efect


pagina Web din cadrul capturii-ecran următoare:

53
Afişarea datelor XML prin utilizarea procesorului expat

Desigur, dacă facem numai prelucrări asupra documentelor XML, ne putem dispensa
de definirea celor două tablouri asociative open_tags[] şi close_tags[], iar în funcţii-
le startElement() şi endElement() putem insera orice cod dorim.

O altă metodă de procesare e descrisă în capitolul 4 al cărţii S. Buraga (coord.), Aplicaţii


Web la cheie. Studii de caz implementate în PHP, Polirom, Iaşi, 2003.

PHP şi libxml

PHP include analizorul libxml elaborat de Daniel Veillard şi integrat în motorul PHP
de Uwe Steinman pentru a putea realiza procesări XML via modelul DOM.

Arborele abstract asociat unui document XML va putea fi creat de una dintre funcţiile:

• xmldoc() - va genera arborele pornind de la un şir de caractere reprezen-


tând un document XML;

• xmldocfile() - va încărca un document XML de pe disc şi va construi


arborele;

• new_xmldoc() - va genera un arbore vid.

54
Arborele DOM va fi reprezentat în PHP printr-un obiect aparţinând clasei speciale
"DOM document" având proprietăţile doc (resursă), version (şir de caractere,
"1.0" în prezent) şi type (întreg lung). Sunt puse la dispoziţie următoarele metode:

• root() - returnează nodul rădăcină al arborelui DOM;

• addroot() - adaugă un nod rădăcină la un arbore vid creat de


new_xmldoc();

• dtd() - returnează un obiect aparţinând clasei DTD, care nu posedă me-


tode, ci numai membrii-dată name (numele elementului rădăcină al documentului
XML), sysid (conţine un identificator sistem al DTD-ului asociat documentului,
e.g. impresii.dtd) şi extid (reprezintă un identificator extern);

• dumpmem() - converteşte în şir de caractere reprezentarea internă a arbo-


relui DOM.

Un script PHP care va genera documentul XML:


<?xml version="1.0" ?>
<nume>Sabin-Corneliu Buraga</nume>

va fi următorul:
// un nou arbore DOM
$doc = new_xmldoc("1.0");
// inserează nodul-rădăcină
$root = $doc->add_root("nume");
// adaugă nodului un conţinut
$root->content = "Sabin-Corneliu Buraga";
// afişează documentul XML generat
print (htmlspecialchars($doc->dumpmem()));

După cum se poate remarca, putem foarte uşor construi prin program documente sau
fragmente de documente XML, ceea ce nu se putea cu expat.

După cum am văzut, în cadrul modelului DOM orice componentă a unui document
XML va fi reprezentată prin intermediul unui nod al arborelui asociat. Un obiect de tip
nod va avea metodele:

• parent() - desemnează nodul părinte al nodului curent;

• children() - returnează nodurile copii ale nodului curent;

• attributes() - furnizează atributele asociate unui nod de tip element;

• new_child() - generează un nod copil;

• getattr() - returnează valoarea unui atribut, dacă există;

55
• setattr() - modifică valoarea unui atribut.

Sunt disponibile şi următorii membri-dată:

• type - desemnează tipul de nod; pentru o manevrare mai facilă a tipurilor


nodurilor sunt predefinite constantele de mai jos:

Constantă Valoare

XML_ELEMENT_NODE 1

XML_ATTRIBUTE_NODE 2

XML_TEXT_NODE 3

XML_CDATA_SECTION_NODE 4

XML_ENTITY_REF_NODE 5

XML_ENTITY_NODE 6

XML_PI_NODE 7

XML_COMMENT_NODE 8

XML_DOCUMENT_NODE 9

XML_DOCUMENT_TYPE_NODE 10

XML_DOCUMENT_FRAG_NODE 11

XML_NOTATION_NODE 12

Constantele predefinite desemnând tipurile de noduri DOM

Aceste constante se pot folosi şi în programele C folosind biblioteca libxml.

• name - reprezintă numele nodului (e.g. numele unui element XML);

• content - desemnează conţinutul unui anumit nod (dacă există).

Pentru a parcurge întreg arborele de noduri sau numai părţi din el ne putem folosi de
xmltree(), funcţie care va analiza documentul XML dat ca parametru (sub formă de şir
de caractere) şi va returna o structură de obiecte PHP reprezentând acel document.
Această structură nu va putea fi însă modificată.

56
Exemplu

Un exemplu complet de procesare DOM a unui document XML este furnizat în con-
tinuare. Intenţionăm să procesăm conţinutul unui fişier XML referitor la proiectele pro-
puse spre implementare studenţilor urmând disciplina „Reţele de calculatoare”. Acest
document, numit projects.xml, va avea structura (evident, e oferit aici doar un frag-
ment):
<!-- Document XML continind informatii despre proiectele propuse
la "Retele de calculatoare" (fragment)

Autor: Sabin-Corneliu Buraga - busaco@infoiasi.ro


Versiune: 1.6 / 2002-2004
Ultima actualizare: 04 noiembrie 2004
-->
<p:projects xmlns:p="urn:infoiasi.ro:projects"
update="04 noiembrie 2004">

<project class="B">
<title>HangmanS</title>
<desc>
Sa se implementeze un server care sa permita...
</desc>
<stud>1</stud>
<url></url>
</project>

<project>
<title>ShopNetServ</title>
<desc>
Sa se implementeze partea de server a unui magazin virtual...
</desc>
<stud>1</stud>
<url></url>
</project>

<project class="A">
<title>NetChatS</title>
<desc>
Sa se conceapa un server de chat.
</desc>
<stud>2</stud>
<url>http://www.infoiasi.ro/~busaco/gaen/</url>

57
</project>

<project class="A">
<title>NetChatC</title>
<desc>
Sa se conceapa un client de chat, utilizat in conjunctie cu
NetChatS.
</desc>
<stud>1</stud>
<url>http://www.infoiasi.ro/~busaco/gaen/</url>
</project>

<project class="A">
<title>Super Proiect</title>
<desc>
Un super proiect pentru niste super studenti!
</desc>
<stud>3</stud>
<url>http://www.super.org/</url>
</project>

<!-- si altele... -->


</p:projects>

Pentru procesarea datelor, vom putea implementa următorul script PHP:


<?php
/* Un program PHP care proceseaza un document XML folosind DOM
Functioneaza pentru PHP versiunea 4.x

Autor: Sabin-Corneliu Buraga - busaco@infoiasi.ro (c)2001, 2004


Ultima actualizare: 04 noiembrie 2004
*/
// locul unde sunt stocate fisierele
define ("PATH", '');
# De exemplu, pentru Windows cu Apache2Triad instalat in 'apache2':
# define ("PATH", 'c:\\apache2\\htdocs\\php-examples\\');

// variabila globala indicind daca documentul a fost modificat


$modified = 0;

// incarcam documentul XML


if (!$doc = domxml_open_file(PATH . "projects.xml")) {
echo "<p>A aparut o eroare la procesarea documentului!</p>\n";
exit;
}

58
// radacina documentului
$root = $doc->document_element();

// afisam informatii generale despre document


echo "<p>Elementul radacina este &lt;" .
$root->node_name() . "&gt;.</p>";

// afisam informatii privitoare la proiecte


$projs = $root->get_elements_by_tagname("project");
foreach ($projs as $proj) {
// preluam nodurile <title>
$titles = $proj->get_elements_by_tagname("title");
foreach ($titles as $title) {
echo "<p>Proiect: " . $title->get_content();
}
// verificam care e clasa proiectului
if ($proj->has_attribute("class")) {
echo " de clasa " . $proj->get_attribute("class") . "</p>";
}
else {
echo " de clasa necunoscuta.</p>";
// nu exista atributul "class", il cream
// implicit, proiectul e de clasa D
$attr = $proj->set_attribute("class", "D");
// marcam documentul ca fiind modificat
$modified = 1;
}
}

// daca documentul a fost modificat, il afisam


if ($modified) {
$xmldoc = $doc->html_dump_mem();
echo "<pre>" . htmlentities($xmldoc) . "</pre>";
}
?>

59
În cadrul anexei B sunt puse la dispoziţie şi alte exemple de programe menite a ilustra
modul de procesare a documentelor XML.

Alte detalii privitoare la procesarea documentelor XML sau la realizarea de aplicaţii


Web recurgând la stocarea datelor în format XML sunt disponibile în volumele:

ƒ S. Buraga (coord.), Aplicaţii Web la cheie. Studii de caz implementate în PHP, Polirom,
Iaşi, 2003: http://www.infoiasi.ro/~phpapps/

ƒ S. Buraga (coord.), Situri Web la cheie. Soluţii profesionale de implementare, Iaşi, 2004:
http://www.infoiasi.ro/~busaco/books/webapps/

ƒ S. Buraga, Tehnologii Web, Matrix Rom, Bucureşti, 2001:


http://www.infoiasi.ro/~busaco/books/web.html

60
4. Teme propuse

1. Să se modele ca documente XML informaţiile privitoare la cursele aeriene furni-


zate de o anumită companie şi apoi să se realizeze o aplicaţie Web care să le proceseze.

2. Să se stocheze ca document(e) XML informaţiile incluse de o agendă de birou,


permiţându-se realizarea de adnotări pe zile, săptămâni, luni, includerea de legături Web,
programarea de întâlniri etc. Să se implementeze aplicaţia Web care să proceseze aceste
informaţii, folosindu-se atât modelul DOM, cât şi interfaţa SAX.

3. Să se realizeze un sit Web pentru vizualizarea şi trimiterea de ilustrate electronice,


pe diverse teme (peisaje, oraşe celebre, figuri de personalităţi, opere de artă etc.). Infor-
maţiile vor fi stocate exclusiv în documente XML.

4. Să se realizeze un studiu comparativ al manierelor de procesare (SAX şi DOM) a


aceluiaşi document XML, pe mai multe platforme (e.g., Linux şi Windows), recurgându-
se la mai multe limbaje de programare (de exemplu, Perl şi PHP). O posibilă statistică va
putea lua în calcul numărarea elementelor unui document XML având structura:
<doc><element atribut=”valoare” /></doc>, unde <element> va putea apărea
de zece mii, zece sute de mii şi, respectiv, zece milioane de ori.

5. Să se implementeze o aplicaţie pentru stocarea în manieră distribuită a diferitelor


tipuri de teste de cunoştinţe care pot fi folosite în regim de testare sau auto-testare la di-
verse discipline. Pe baza autentificării, titularii de curs vor putea gestiona colecţia de teste
de la discipline diferite (accesare întrebări şi răspunsuri, realizare de teste prin alegerea
întrebărilor după diverse criterii sau aleatoriu etc.). Studenţii vor putea avea acces la mo-
dule de auto-testare pe diverse domenii, contra-cronometru sau nu (demo-uri ale unor tes-
te reale în regim de examen). Testele vor putea fi de mai multe tipuri (single/multiple choice,
cu diferite modalităţi de acordare a punctajelor, cu întrebări dependente una de cealaltă
etc.), bazate sau nu pe cronometrare. Aplicaţia va putea oferi rapoarte privitoare la presta-
ţia unui anumit student la o disciplină, eventual diferite statistici – numerice şi grafice –
referitoare la gradul de cunoştinţe ale studenţilor (e.g., numărul răspunsurilor eronate,
timpul realizat, întrebările la care n-a răspuns nici unul dintre studenţii testaţi etc.).

Se vor oferi posibilităţi de căutare de teste pe diverse criterii – domeniu de interes (i.e.
limbajul PHP), cuvinte cheie (e.g., moştenire multiplă), grad de dificultate etc. – şi de res-
tricţionare a accesului (de exemplu, doar studenţii înscrişi la cursul de programare Web
vor beneficia de (auto-)testare la acest obiect).

Toate informaţiile vor fi stocate în cadrul unor documente XML.

6. Să se creeze o aplicaţie Web care să ofere accesul la conţinut documentar, struc-


turat pe teme şi sub-teme de interes (e.g., Programare :: Limbaje :: Scripting :: Perl ori IA ::

61
Recunoaştere forme :: Reţele neurale :: Auto-învăţare). Se va avea în vedere faptul că documenta-
ţiile:

ƒ pot fi stocate în diverse formate (proprietare sau nu), în manieră distribuită (pe
mai multe maşini),

ƒ vor putea fi accesibile în limbi multiple (e.g. engleză şi/sau română),

ƒ vor putea fi de un anumit tip (carte, manual de referinţă, specificaţie, tutorial


etc.), într-un anumit stadiu (ciornă, propus pentru standardizare, final etc.).

Pentru fiecare resursă, se vor reţine cel puţin următoarele date:

ƒ autor(i);

ƒ titlu;

ƒ tip (carte, articol, raport tehnic, referat etc.);

ƒ editor (e.g., Springer Verlag, Prentice-Hall,...);

ƒ an al apariţiei;

ƒ loc al apariţiei;

ƒ rezumat;

ƒ cuvinte cheie (i.e. Web, XML, căutare structurată, DOM);

ƒ legătură spre documentul complet (dacă există) sau spre o oglindire locală.

Acest sit va putea oferi statistici privind cele mai accesate documente, localizarea clien-
ţilor şi va oferi posibilitatea de a fi administrat via Web, de la distanţă. Soluţiile de stocare
a datelor vor recurge la tehnologiile XML.

62
Anexa A Exemple de documente XML

Exemplul 1

<!-- Document XML privitor la rezultatele primului feedback anonim


dat la "Tehnologii Web" (foloseste spatii de nume si
referinte la entitati)
-->
<feedback xmlns="urn:infoiasi.ro:busaco:feedbacks"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
type="results" xml:id="feedback1-2005" version="0.1">
<meta>
<author uri="http://www.infoiasi.ro/~busaco/">
Sabin-Corneliu Buraga
</author>
</meta>
<issue xml:id="i2">
<question xml:lang="ro">
Care din aspectele propuse spre expunere va stirnesc cel mai mult
interesul?
</question>
<response xml:lang="ro">
<rdf:Seq>
<rdf:li>Baze de date native XML &amp; XQuery</rdf:li>
<rdf:li>Proiectarea siturilor Web, in special SEO</rdf:li>
<rdf:li>Securitatea siturilor</rdf:li>
<rdf:li>Programarea Web</rdf:li>
<rdf:li>Limbajul SVG</rdf:li>
<rdf:li>Cookie-uri &amp; sesiuni</rdf:li>
</rdf:Seq>
</response>
</issue>
<issue xml:id="i3">
<question xml:lang="ro">
Ce alte subiecte ati dori sa fie prezentate?
</question>
<response xml:lang="ro">
<rdf:Seq>
<rdf:li>Compararea diverselor tehnologii actuale</rdf:li>
<rdf:li>Programarea pe partea client in JavaScript</rdf:li>
<rdf:li>JSP, J2EE,...</rdf:li>
<rdf:li>PHP</rdf:li>
<rdf:li>Flash, ActionScript</rdf:li>
<rdf:li>Tehnologii WAP</rdf:li>

63
<rdf:li>Animatii pentru Web</rdf:li>
<rdf:li>Noutati din domeniu</rdf:li>
<rdf:li>VoIP</rdf:li>
<rdf:li>Modul de functionare a lui Google Maps</rdf:li>
<rdf:li>E-business</rdf:li>
</rdf:Seq>
</response>
</issue>
</feedback>

64
Exemplul 2

<!-- Exemplu de document XML folosit in cadrul


Windows XP Build 2600.xpsp_xpsp2 de catre instrumentul
Search Companion (locatia originala este
c:\windows\srchasst\mui\0409\inetpref.xml)

Autor: Microsoft (c)2001

Acest document specifica o interfata-utilizator utilizata pentru


cautare pe Internet, folosind diverse motoare de cautare, si
foloseste sectiunile CDATA pentru a inhiba prelucrarea continutului
de catre procesorul XML
-->
<SimpleDialog xmlns:sc="urn:valid-sc-xml-file">
<Title>
<Text><![CDATA[Internet Search Behavior]]></Text>
</Title>
<Label TopMargin="5">
<Text>
<![CDATA[How do you want to search the Internet?]]>
</Text>
</Label>
<Radio Id="5310" Checked="1" Height="13" TopMargin="5" Group="1">
<Text>
<![CDATA[&With Search Companion - provides task suggestions
and automatically sends your search to other search engines]]>
</Text>
</Radio>
<Radio Id="5311" Height="13" TopMargin="5" BottomMargin="2">
<Text><![CDATA[With &Classic Internet search]]></Text>
</Radio>
<Label TopMargin="8" Group="1">
<Text><![CDATA[&Select the default search engine:]]></Text>
</Label>
<ListBox Id="5309" TopMargin="5">
<Item>
<Name><![CDATA[MSN]]></Name>
<Value>
<![CDATA[http://search.msn.com/results.asp?FORM=sCPN&RS=CHECKED&un=do
c&v=1&q=]]>
</Value>
</Item>
<Item>

65
<Name><![CDATA[AltaVista]]></Name>
<Value>
<![CDATA[http://www.altavista.com/cgi-bin/query?q=]]>
</Value>
</Item>
<Item>
<Name><![CDATA[Google]]></Name>
<Value>
<![CDATA[http://www.google.com/search?q=]]>
</Value>
</Item>
<Item>
<Name><![CDATA[Ask Jeeves]]></Name>
<Value>
<![CDATA[http://www.askjeeves.com/main/askjeeves.asp?ask=]]>
</Value>
</Item>
<Item>
<Name><![CDATA[AlltheWeb]]></Name>
<Value>
<![CDATA[http://www.alltheweb.com/search?cat=web&query=]]>
</Value>
</Item>
<Item>
<Name><![CDATA[Teoma]]></Name>
<Value><![CDATA[http://s.teoma.com/search?q=]]></Value>
</Item>
<Item>
<Name><![CDATA[Excite]]></Name>
<Value>
<![CDATA[http://search.excite.com/search.gw?c=web&search=]]>
</Value>
</Item>
<Item>
<Name><![CDATA[Overture]]></Name>
<Value>
<![CDATA[http://www.overture.com/d/search/?type=home&mkt=us&Keywords=
]]>
</Value>
</Item>
<Item>
<Name><![CDATA[Yahoo]]></Name>
<Value>
<![CDATA[http://search.yahoo.com/bin/search?p=]]>
</Value>
</Item>

66
<Item>
<Name><![CDATA[Encarta]]></Name>
<Value>
<![CDATA[http://encarta.msn.com/encnet/refpages/SRPage.aspx?search=]]
>
</Value>
</Item>
</ListBox>
</SimpleDialog>

67
Anexa B Exemple de programe pentru procesarea

informaţiilor stocate în documente XML

Exemplul 1 Procesarea datelor XML direct în navigatorul Web

<!-- Exemplu de document HTML care foloseste JScript pentru


procesarea DOM a unui document XML adnotind informatii
despre cuprinsul unei carti.
A se vizualiza cu Internet Explorer 6.

Autor: Sabin-Corneliu Buraga - busaco@infoiasi.ro (c)2000-2004


Ultima actualizare: 04 noiembrie 2004
-->
<html>
<head>
<title>DOM in navigator</title>
<script language="JavaScript" type="text/javascript">
/* functie care incarca un document XML si afiseaza elementul
radacina, in caz de succes (documentul e bine-formatat) */
function listeaza() {
// instantiaza analizorul XML (obiect ActiveX)
var xml = new ActiveXObject("microsoft.xmldom");
// inhiba încarcarea asincrona
xml.async = false;
// incarca datele XML
xml.load("cuprins.xml");
// verificam ce cod de eroare am obtinut
if (xml.parseError.errorCode != 0) {
var eroare = xml.parseError;
alert("A aparut eroarea " + eroare.reason + " la linia "
+ xml.parseError.line);
return 'Eroare!';
}

var msg = '';


// preluam lista de noduri care corespund elementului 'nume'
var capitole = xml.getElementsByTagName('nume');
// iteram lista de noduri
for (i = 0 ; i < capitole.length ; i++) {
// preluam numele tag-ului
var nume = capitole[i].nodeName;
msg += '&lt;' + nume + '&gt;';
// verificam daca are noduri copil

68
if (capitole[i].hasChildNodes == true) {
// preluam continutul dintre tag-uri
msg += capitole[i].firstChild.nodeValue;
}
msg += '&lt;/' + nume + '&gt;<br />';
} // for
// returnam sirul de valori

// afisam si URI-ul cu detalii despre carte


var detalii = xml.getElementsByTagName('detalii');
var adr = detalii[0].firstChild.nodeValue;
var atr = xml.getElementsByTagName('cuprins').item(0).attributes;
msg += '<br />Detalii despre <i>' + atr.item(0).value +
'</i> la <a href="' + adr + '">' + adr + '</a>.';

return msg;
}
</script>
<body>
<h4>Cuprins:</h4>

<script type="text/javascript">
document.write('<div>' + listeaza() + '</div>');
</script>

<hr />
</body>
</html>

69
Exemplul 2 Procesarea SAX în limbajul Java

/* Program Java care proceseaza prin SAX un document XML privitor


la proiectele propuse la o disciplina

Autor: Sabin-Corneliu Buraga (c) 2004


Ultima actualizare: 31 decembrie 2004
*/
import java.util.Stack;
import java.io.IOException;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

// clasa de tratare a evenimentelor de procesare SAX


class ProiecteSAX extends DefaultHandler {
private Stack stiva = new Stack (); // stiva de elemente

// metoda de tratare a evenimentului 'inceput de tag'


public void startElement (String uri, String local, String qName,
Attributes atts) throws SAXException {
stiva.push (new String(qName)); // introducem in stiva

if (qName.equals ("project")) { // afisam daca e de clasa A


System.out.print ("<proiect");
String clasa;
clasa = atts.getValue ("class");
if (clasa.equals ("A")) {
System.out.print (" clasa='A'");
}
System.out.print (">");
}
}

// metoda de tratare a evenimentului 'final de tag'


public void endElement (String uri, String local, String qName)
throws SAXException {
if (qName.equals ("project"))
System.out.println ("</proiect>");
stiva.pop (); // eliminam elementul din stiva
}

// metoda de tratare a evenimentului 'continut text'

70
public void characters (char buf [], int offset, int length)
throws SAXException {
Object top = stiva.peek (); // preluam virful stivei
if (!top.equals ("title")) // nu e element 'title'
return;
// afisam continutul text
for (int i = 0; i < length; i++)
System.out.print (buf[offset + i]);
}
}

// clasa de procesare SAX


public class SAX {
// argv[0] reprezinta URI-ul documentului XML
public static void main (String argv []) {
XMLReader prod; // producatorul SAX
ProiecteSAX cons; // consumatorul SAX

if (argv.length != 1) {
System.err.println
("Proceseaza XML prin SAX.\nSintaxa: SAX <fisier.xml>");
return;
}
// instantiem procesorul SAX
try {
prod = XMLReaderFactory.createXMLReader ();
} catch (SAXException e) {
System.err.println ("Eroare de creare a procesorului SAX: "
+ e.getMessage ());
return;
}

try {
// consumam toate evenimentele SAX
cons = new ProiecteSAX ();
// stabilim maniera de tratare a continutului
prod.setContentHandler (cons);
// stabilim maniera de raportare a erorilor
prod.setErrorHandler (cons);
} catch (Exception e) { // exceptie
System.err.println ("Exceptie :" + e.getMessage ());
return;
}

// startam procesarea SAX (producerea de evenimente)


try {

71
prod.parse (argv [0]);
} catch (IOException e) { // tratam exceptiile
System.err.println ("Eroare I/O: ");
e.printStackTrace ();
} catch (SAXException e) {
System.err.println ("Eroare de procesare: ");
e.printStackTrace ();
}
}
}

Un posibil rezultat al rulării ar putea fi:


jdk1.5.0/sax>../bin/java SAX projects.xml
<proiect>RFCnetS</proiect>
<proiect>RFCnetC</proiect>
<proiect clasa='A'>NetChatS</proiect>
<proiect clasa='A'>NetChatC</proiect>
<proiect clasa='A'>CVSnet</proiect>
<proiect>SBiblionet</proiect>
<proiect>CBiblionet</proiect>
<proiect clasa='A'>Super Proiect</proiect>

72
Resurse bibliografice
(în ordinea relevanţei)

1. S. Buraga, Tehnologii Web, Matrix Rom, Bucureşti, 2001:


http://www.infoiasi.ro/~busaco/books/web.html

2. S. Buraga (coord.), Aplicaţii Web la cheie. Studii de caz implementate în PHP, Polirom,
Iaşi, 2003: http://www.infoiasi.ro/~phpapps/

3. S. Buraga (coord.), Situri Web la cheie. Soluţii profesionale de implementare, Polirom,


Iaşi, 2004: http://www.infoiasi.ro/~busaco/books/webapps/

4. S. Buraga et al., Programare Web în bash şi Perl, Polirom, Iaşi, 2002:


http://www.infoiasi.ro/~cgi/

5. S. Buraga, Proiectarea siturilor Web (ediţia a II-a), Polirom, Iaşi, 2005:


http://www.infoiasi.ro/~design/

6. Ş. Trăuşan-Matu et al., Prelucrarea documentelor folosind XML şi Perl, Matrix Rom,


Bucureşti, 2001

7. Ş. Tanasă et al., Java de la 0 la expert, Polirom, Iaşi, 2003

8. C. Vârlan, Macromedia Flash, Polirom, Iaşi, 2004:


http://www.infoiasi.ro/~flash/

9. * * *, XML.org: http://www.xml.org/

10. * * *, XML Software: http://www.xmlsoftware.com/

11. * * *, XML Standards Library: http://xmlstds.xemantics.com/

12. * * *, Consorţiul Web: http://www.w3.org/

13. * * *, ZVON: http://www.zvon.org/

14. * * *, XML Hack: http://www.xmlhack.com/

15. * * *, Cafe con Leche XML News, and Resources: http://www.ibiblio.org/xml/

73