Sunteți pe pagina 1din 15

Modele de procesare a codului XML

DOM
Reprezinta documentul ca un arbore Arborele este integral incarcat in RAM (mare consumator de memorie) Nodurile arborelui pot fi de multiple tipuri: radacina, element, atribut, text, comentariu etc.

SAX
Reprezinta documentul ca un string brut Nu incarca tot documentul in memorie, ci doar un subsir al acestuia care e analizat in scopul detectarii marcatorilor La detectarea unui marcator se declanseaza evenimente ce trebuie tratate

Tipuri de noduri DOM


Cod Tip 1 2 3 4 5 6 7 8 9 10 11 12 Nume Constanta ELEMENT_NODE ATTRIBUTE_NODE (atributele sunt noduri, dar nu fac parte din categoria nodurilor fiu, au un vector separat, attributes!) TEXT_NODE CDATA_SECTION_NODE ENTITY_REFERENCE_NODE ENTITY_NODE PROCESSING_INSTRUCTION_NODE COMMENT_NODE DOCUMENT_NODE nodul document DOCUMENT_TYPE_NODE nodul ce invoc DTDul DOCUMENT_FRAGMENT_NODE NOTATION_NODE

Standardul DOM este accesibil n majoritatea limbajelor de programare, dar poate fi nsoit de variante optimizate sintactic. Ex: n PHP exista numeroase biblioteci de funcii DOM, dintre care 2 sunt frecvent folosite:
clasa DOMDocument, complet i compatibil cu standardul DOM clasa SimpleXMLElement, varianta simplificat - nu suport spaii de nume si validare, dar aduce sintaxa de accesare XML mai aproape de sintaxa de accesare JSON. Ex:
n loc de: nodparinte->firstChild->nodeValue Primul nod fiu se va putea accesa prin sintaxa obiectuala: nodparinte->nodfiu

Detalii DOM

Node ofer majoritatea proprietilor i este motenit de o serie de clase mai specializate, ce adaug metode specifice tipurilor de noduri: Element, Attr, CharacterData, Comments, DocumentFragment Document ofer o serie de proprieti la nivel de document DOMImplementation ofer proprieti legate de detectarea versiunii DOM NodeList proprieti pt lucrul cu colecii ordonate de noduri (ex: vectorul fiilor) NamedNodeMap pt lucrul cu colecii neordonate de noduri (ex: vectorul atributelor) Mai exista o serie de clase auxiliare (extensii) care nu sunt disponibile n toate implementrile - e vorba de cele care permit manipularea nodurilor speciale sau mai rar utilizate din XML (instruciuni de procesare, entiti, notaii, seciuni CData)

Clase XML DOM

Proprieti ale instanelor Node


Care ofer informaii despre noduri: nodeType (vezi codurile alocate cu 2 slideuri inainte) nodeValue (valoarea unui nod) Pt un nod de tip element, valoarea este null! Pt un nod de tip text sau atribut, valoare este coninutul textual; nodeName (numele nodului, este read-only, nu poate fi modificat dect prin tergerea nodului!) Pt noduri de tip element, numele este marcatorul, pt atribute este numele atributului; Pt noduri de tip text, numele este #text; attributes (vectorul atributelor nodului) hasChildNodes (returneaz valoare boolean ce indic dac nodul are fii) isElementContentWhitespace (true dac e nod invizibil) ownerDocument (nodul document ce conine nodul curent) Care ofer informatii despre noduri relativ la vocabular: URInamespace (identificatorul global, de tip URL, al vocabularului) Prefix (identificatorul local, prefixul vocabularului) localName (numele neprefixat al nodului)

Proprieti ale instanelor Node


Care permit parcurgerea arborelui DOM: childNodes (vectorul fiilor) attributes (vectorul atributelor) parentNode (nodul printe) firstChild/lastChild (primul/ultimul fiu) nextSibling/previousSibling (urmtorul/precedentul frate) Care permit editarea arborelui: appendChild (adaug un nod nou n nodul curent) insertBefore (insereaz un nod nou n nodul curent, la poziia indicat) replaceChild (nlocuiete un nod) removeChild (terge un nod) cloneNode (cloneaz un nod, n scopul copierii n alt poziie a arborelui) normalize (concateneaz noduri adiacente de tip text, care pot s apar n urma unor tergeri de elemente)

Clasa Document
Clasa Document motenete clasa Node dar ofer proprieti suplimentare, apelabile de la nivelul rdcinii:
getElementById (cu condiia ca documentul s fie validat i vocabularul s prevad tipul ID pt atributul folosit!) getElementsByTagName documentElement (referin direct la elementul radacin) createElement, createAttribute, createTextNode (metode de creare a unor noduri n RAM, fr a li se indica poziia n arbore => vor trebui ulterior inserate n arbore cu replace/append/setAttribute/nodeValue etc.)

DocumentFragment
Instanele DocumentFragment sunt utile cnd se dorete construirea dinamic a unei buci de document XML (deci XML care nu e nici complet format i nici nu e un element temporar), n scopul alipirii la un arbore DOM cndva n viitor;
cu alte cuvinte e o colecie temporar de frai ce urmeaz s fie inclui ntr-un alt nod

Motenete proprietile clasei Node (deci fragmentului i se vor putea aduga coninut i elemente, dar fr ca fragmentul n sine s fie considerat nod!):
$fragment=$doc->createDocumentFragment() $nod=$doc->createElement(.) $string=<a>ddd</a><b>fff</b> $fragment->appendChild($nod) $fragment->appendXML ($string) $doc->documentElement->appendChild($fragment) - appendChild nu va aduga fragmentul, ci componentele fragmentului - fragmentul accept buci de cod XML concatenate cu appendXML

Clasa Element
Motenete clasa Node i adaug proprieti specifice elementelor: getAttribute/setAttribute/removeAttribute manipularea atributelor tagName returneaz eticheta marcatorului getElementsByTagName cutare de marcatori (dar limitat la subarborele elementului curent)

Clasa Attr
Motenete clasa Node i i adaug proprieti specifice atributelor:
ownerElement (returneaz elementul ce conine atributul curent) name/value (nlocuiesc proprietile nodeName/nodeValue la atribute)

Clasa Character Data si Comments


Ofera proprieti specifice procesrii de stringuri (pt coninutul textual sau comentarii):
length, appendData, deleteData, replaceData, insertData, substring, splitText

NodeList i NamedNodeMap
NodeList ofer proprieti pt lucru cu colecii ordonate de noduri, ce pot fi parcurse prin indice (ex:childNodes):
length (nr. de noduri din colecie) item[n] (returneaz nodul n din vector)

NamedNodeMap ofer proprieti pt lucru cu colecii de noduri ce se pot accesa prin nume (ex:attributes):
getNamedItem/setNamedItem/removeNamedItem (citete / modific /terge un nod din colecie) => dac e vorba de atribute, au acelai efect cu getAttribute/setAttribute/removeAttribute

Diferente HTML DOM XML DOM


HTML DOM ofer o serie de faciliti optimizate pt codul XHTML; aceste faciliti NU sunt accesibile la cod XML generic (n AJAX nu vom putea folosi metodele de mai jos pt a procesa rspunsul XML venit de la server): Se face diferena intre childNodes (vectorul fiilor indiferent de tip elemente,noduri,comentarii) si children (vectorul fiilor de tip element); Unele atribute se pot accesa prin sintaxa obiectual element.atribut (XMLDOM permite doar getAttribute(), setAttribute() etc.) Obiectul document e fiu al obiectului window (deci arborele DOM e coninut n arborele BOM, ce ofer acces la funcionalitile browserului); getElementById funcioneaz pe IDuri HTML dar nu i pe IDuri XML (dect dac sunt validate de un vocabular, ceea ce XHR nu face) Coninutul elementelor poate fi manipulat cu innerHTML (n XML suntem nevoii s apelm la metodele standard (nodeValue, replaceChild, appendChild, removeChild, insertBefore) Prescurtri oferite (ne scutesc de unele operaii de cautare in arbore): document.body, document.links[], document.anchors[], document.images[], document.forms[], document.forms[0].elements[], tabel.rows[], tabel.rows[1].cells[]

Implicaii asupra AJAX


Cu arborele DOM al unui document XML primit de la server, NU se lucreaz la fel de uor ca i cu arborele DOM al paginii HTML! (o mulime de metode nu sunt disponibile); Pentru a facilita procesarea rspunsului de la server, adesea se prefer formatul JSON n loc de XML; Exist totui o serie de faciliti ce ajut la manipularea codului XML generic - standardul XSL;
n AJAX, dac rspunsul serverului e de tip XML, acesta poate fi:
Formatat cu CSS; Transformat cu XSLT (de ex., convertit n HTML); Transformat cu Sarissa (un framework AJAX orientat pe procesarea de rspunsuri XML, cu un rol similar cu cel pe care l are Prototypen pentru arborele HTML DOM).

Procesarea XML prin SAX


Alternativ la DOM, face economie de memorie, avantaj de performan; Nu ncarc tot documentul n RAM, ci citete documentul caracter cu caracter pn cnd ntlnete caracterele < , </ , /> sau > (deschiderea sau nchiderea unui marcator); La ntlnirea acestora caractere se declaneaz evenimente precum startElement, endElement, characters prin care se indic apariia unei etichete de nceput, de sfrit, sau a coninutului textual al unui marcator; Fiecare astfel de eveniment va apela o funcie responsabil cu procesarea stringului detectat ntre etichete; n timpul parcurgerii documentului vor mai fi necesare: Variabile booleene de control (flag-uri) care vor indica toi marcatorii prin care s-a trecut deja (false pt. cei care s-au nchis; true pt. cei care sunt nc deschii la momentul curent); Variabile contor care vor numra nivelul curent n arbore (ci marcatori s-au deschis fr s se nchid nc); Dezavantaj major: dac marcatorii se refer ntre ei (ID->IDREF) iar IDul este dup IDREF va fi necesar reluarea parcurgerii de la nceput.

S-ar putea să vă placă și