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

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 .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.

nu suportă spații de nume si validare. dar aduce sintaxa de accesare XML mai aproape de sintaxa de accesare JSON.• Standardul DOM este accesibil în majoritatea limbajelor de programare. completă și compatibilă cu standardul DOM – clasa SimpleXMLElement. Ex: • În loc de: nodparinte->firstChild->nodeValue • Primul nod fiu se va putea accesa prin sintaxa obiectuala: nodparinte->nodfiu Detalii DOM . varianta simplificată . Ex: în PHP exista numeroase biblioteci de funcții DOM. dintre care 2 sunt frecvent folosite: – clasa DOMDocument. dar poate fi însoțit de variante optimizate sintactic.

CharacterData. entități. notații. Comments.• Node – oferă majoritatea proprietăților și este moștenită de o serie de clase mai specializate. ce adaugă metode specifice tipurilor de noduri: Element.e vorba de cele care permit manipularea nodurilor speciale sau mai rar utilizate din XML (instrucțiuni de procesare. DocumentFragment • Document – oferă o serie de proprietăți la nivel de document • DOMImplementation – oferă proprietăți legate de detectarea versiunii DOM • NodeList – proprietăți pt lucrul cu colecții ordonate de noduri (ex: vectorul fiilor) • NamedNodeMap – pt lucrul cu colecții neordonate de noduri (ex: vectorul atributelor) • Mai exista o serie de clase auxiliare (extensii) care nu sunt disponibile în toate implementările . secțiuni CData) Clase XML DOM . Attr.

prefixul vocabularului) – localName (numele neprefixat al nodului) . 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 conține nodul curent) • Care oferă informatii despre noduri relativ la vocabular: – URInamespace (identificatorul global. valoare este conținutul textual. numele este marcatorul. este read-only. de tip URL. pt atribute este numele atributului. al vocabularului) – Prefix (identificatorul local. • Pt noduri de tip text. nu poate fi modificat decât prin ștergerea nodului!) • Pt noduri de tip element. – nodeName (numele nodului. valoarea este null! • Pt un nod de tip text sau atribut.Proprietăți ale instanțelor Node • Care oferă informații despre noduri: – nodeType (vezi codurile alocate cu 2 slideuri inainte) – nodeValue (valoarea unui nod) • Pt un nod de tip element.

care pot să apară în urma unor ștergeri de elemente) .Proprietăți ale instanțelor Node • Care permit parcurgerea arborelui DOM: – childNodes (vectorul fiilor) – attributes (vectorul atributelor) – parentNode (nodul părinte) – firstChild/lastChild (primul/ultimul fiu) – nextSibling/previousSibling (următorul/precedentul frate) • Care permit editarea arborelui: – appendChild (adaugă un nod nou în nodul curent) – insertBefore (inserează un nod nou în nodul curent. în scopul copierii în altă poziție a arborelui) – normalize (concatenează noduri adiacente de tip text. la poziția indicată) – replaceChild (înlocuiește un nod) – removeChild (șterge un nod) – cloneNode (clonează un nod.

) .Clasa Document • Clasa Document moștenește clasa Node dar oferă proprietăți suplimentare. createAttribute. createTextNode (metode de creare a unor noduri în RAM. fără a li se indica poziția în arbore => vor trebui ulterior inserate în arbore cu replace/append/setAttribute/nodeValue etc. apelabile de la nivelul rădăcinii: – getElementById (cu condiția ca documentul să fie validat și vocabularul să prevadă tipul ID pt atributul folosit!) – getElementsByTagName – documentElement (referință directă la elementul radacină) – createElement.

) $string=“<a>ddd</a><b>fff</b>” $fragment->appendChild($nod) $fragment->appendXML ($string) $doc->documentElement->appendChild($fragment) . în scopul alipirii la un arbore DOM cândva în viitor.DocumentFragment • Instanțele DocumentFragment sunt utile când se dorește construirea dinamică a unei “bucăți” de document XML (deci XML care nu e nici complet format și nici nu e un element temporar). dar fără ca fragmentul în sine să fie considerat nod!): $fragment=$doc->createDocumentFragment() $nod=$doc->createElement(…. – cu alte cuvinte e o colecție temporară de frați ce urmează să fie incluși într-un alt nod • Moștenește proprietățile clasei Node (deci fragmentului i se vor putea adăuga conținut și elemente.fragmentul acceptă bucăți de cod XML concatenate cu appendXML . ci componentele fragmentului .appendChild nu va adăuga fragmentul.

Clasa Element Moștenește clasa Node și adaugă proprietăți specifice elementelor: • getAttribute/setAttribute/removeAttribute – manipularea atributelor • tagName – returnează eticheta marcatorului • getElementsByTagName – căutare de marcatori (dar limitată la subarborele elementului curent) .

Clasa Attr • Moștenește clasa Node și îi adaugă proprietăți specifice atributelor: – ownerElement (returnează elementul ce conține atributul curent) – name/value (înlocuiesc proprietățile nodeName/nodeValue la atribute) .

insertData. replaceData. appendData. deleteData. splitText .Clasa Character Data si Comments • Ofera proprietăți specifice procesării de stringuri (pt conținutul textual sau comentarii): – length. substring.

NodeList și NamedNodeMap • NodeList – oferă proprietăți pt lucru cu colecții ordonate de noduri. ce pot fi parcurse prin indice (ex:childNodes): – length (nr. de noduri din colecție) – item[n] (returnează nodul n din vector) • NamedNodeMap – oferă proprietăți pt lucru cu colecții de noduri ce se pot accesa prin nume (ex:attributes): – getNamedItem/setNamedItem/removeNamedItem (citește / modifică /șterge un nod din colecție) => dacă e vorba de atribute. au același efect cu getAttribute/setAttribute/removeAttribute .

forms[0].noduri. – Unele atribute se pot accesa prin sintaxa obiectuală element. document. – getElementById funcționează pe IDuri HTML dar nu și pe IDuri XML (decât dacă sunt validate de un vocabular. setAttribute() etc.body.rows[]. tabel.comentarii) si children (vectorul fiilor de tip element). ce oferă acces la funcționalitățile browserului). replaceChild. document.links[].Diferente HTML DOM – XML DOM • HTML DOM oferă o serie de facilități optimizate pt codul XHTML. document. ceea ce XHR nu face) – Conținutul elementelor poate fi manipulat cu innerHTML (în XML suntem nevoiți să apelăm la metodele standard (nodeValue. insertBefore) – Prescurtări oferite (ne scutesc de unele operații de cautare in arbore): document. document.elements[]. document.forms[]. removeChild.anchors[]. appendChild. tabel.rows[1].atribut (XMLDOM permite doar getAttribute().) – Obiectul document e fiu al obiectului window (deci arborele DOM e conținut în arborele BOM.cells[] .images[]. aceste facilități NU sunt accesibile la cod XML generic (în AJAX nu vom putea folosi metodele de mai jos pt a procesa răspunsul XML venit de la server): – Se face diferența intre childNodes (vectorul fiilor indiferent de tip – elemente.

• Transformat cu Sarissa (un framework AJAX orientat pe procesarea de răspunsuri XML.standardul XSL. NU se lucrează la fel de ușor ca și cu arborele DOM al paginii HTML! (o mulțime de metode nu sunt disponibile). cu un rol similar cu cel pe care îl are Prototypen pentru arborele HTML DOM). – În AJAX.. acesta poate fi: • Formatat cu CSS. • Pentru a facilita procesarea răspunsului de la server.Implicații asupra AJAX • Cu arborele DOM al unui document XML primit de la server. . adesea se preferă formatul JSON în loc de XML. dacă răspunsul serverului e de tip XML. convertit în HTML). • Transformat cu XSLT (de ex. • Există totuși o serie de facilități ce ajută la manipularea codului XML generic .

ci citește documentul caracter cu caracter până când întâlnește caracterele < . face economie de memorie. cei care sunt încă deschiși la momentul curent). • Dezavantaj major: dacă marcatorii se referă între ei (ID->IDREF) iar IDul este după IDREF va fi necesară reluarea parcurgerii de la început. • Fiecare astfel de eveniment va apela o funcție responsabilă cu procesarea stringului detectat între etichete. endElement. </ . • La întâlnirea acestora caractere se declanșează evenimente precum startElement. – Variabile contor care vor număra nivelul curent în arbore (câți marcatori s-au deschis fără să se închidă încă). cei care s-au închis. • Nu încarcă tot documentul în RAM. sau a conținutului textual al unui marcator. true pt. • În timpul parcurgerii documentului vor mai fi necesare: – Variabile booleene de control (flag-uri) care vor indica toți marcatorii prin care s-a trecut deja (false pt. de sfârșit.Procesarea XML prin SAX • Alternativă la DOM. avantaj de performanță. characters prin care se indică apariția unei etichete de început. /> sau > (deschiderea sau închiderea unui marcator). .

Sign up to vote on this title
UsefulNot useful