Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Utilizarea unui parser DOM

Xml



+ Font mai mare | - Font mai mic



     Utilizarea unui parser DOM

      

               Pentru fisierul XML anterior cu lista de preturi, dar scris tot pe o singura linie si fara spatii albe, arborele DOM arata astfel:

                

               priceList

              
 


               computer computer

              
 


               name price name price

 




CDC 540 SDS 495

 

               De fapt, orice arbore DOM mai are un nivel radacina (nefigurat aici) care corespunde intregului document XML (nod cu numele "#document" si valoarea null).

               Fiecare nod dintr-un arbore DOM are un nume, o valoare si un tip. Tipurile sunt numere intregi, dar exista si nume mnemonice pentru aceste tipuri. Exemple de constante din interfata Node:

 

public static final short ELEMENT_NODE = 1;

public static final short ATTRIBUTE_NODE = 2;

public static final short TEXT_NODE = 3;

 

Nodurile cu text au toate acelasi nume ("#text"), iar valoarea este sirul de caractere ce reprezinta textul. In exemplul anterior cele 4 noduri terminale sunt noduri text (cu valorile "CDC","540","SDS","495"). Parserul DOM creeaza noduri text si pentru grupuri de spatii albe (blancuri sau terminator de linie inainte sau dupa un marcaj). Pentru fisierul XML cu 10 linii si indentare numarul de noduri din arborele DOM este 20 : 1 pe nivelul 1, 5 pe nivelul 2, 10 pe nivelul 3 si 4 pe nivelul 4. Dintre aceste noduri sunt 9 noduri text cu spatii albe (3 pe nivelul 2 si 6 pe nivelul 3).

Nodurile pentru elemente au numele marcajului si valoarea null. In arborele de mai sus am scris numele nodurilor de pe primele 3 niveluri (de tip 1) si valorile nodurilor de pe ultimul nivel (de tip 3).

               Modelul DOM defineste mai multe interfete Java :

- Interfata Node contine metode de acces la un nod de arbore DOM si la succesorii sai, dar si metode pentru crearea si modificarea de noduri de arbore DOM. Exemple:

 

public String getNodeName(); // numele acestui nod

public String getNodeValue() throws DOMException; // valoarea acestui nod

public void setNodeValue(String nodeValue) throws DOMException;

public short getNodeType(); // tipul acestui nod

public NodeList getChildNodes(); // lista succesorilor acestui nod

public Node getFirstChild(); // primul succesor al acestui nod

public Node getNextSibling(); // urmatorul succesor al acestui nod

               public Node removeChild(Node oldChild) throws DOMException;

               public Node appendChild(Node newChild) throws DOMException;

 

               - Interfata NodeList contine metode pentru acces la lista de succesori a unui nod:

public Node item(int index); // nodul cu numarul "index"

public int getLength(); // lungime lista de noduri

 

- Interfetele Document, Element, Attr, CharacterData, Text, Comment, extind direct sau indirect interfata Node cu metode specifice acestor tipuri de noduri.

Clasele care implementeaza aceste interfete fac parte din parserul DOM, iar numele si implementarea lor nu sunt cunoscute utilizatorilor; ele constituie un bun exemplu de separare a interfetei de implementare si de programare la nivel de interfata. Clasa care implementeaza interfata Node (si extinde implicit clasa Object) contine si o metoda "toString", cu numele si valoarea nodului intre paranteze.

Afisarea sau prelucrarea unui arbore DOM se face de obicei printr-o functie statica recursiva care prelucreaza nodul curent (primit ca argument) si apoi se apeleaza pe ea insasi pentru fiecare succesor. Parcurgerea listei de succesori se poate face in doua moduri:

- Folosind metodele "getFirstChild" si "getNextSibling" ;

- Folosind metoda "getChildNodes" si metode ale interfetei NodeList.

Exemplu pentru prima solutie a functiei recursive:

 

public static void printNode(Node node)

}

 

Exemplu pentru a doua solutie a functiei recursive:

      

public static void printNode(Node node)

 

Daca operatiile efectuate la fiecare nod depind de tipul nodului, atunci functia recursiva va contine o selectie dupa tipul nodului (un bloc switch).

     O aplicatie DOM creeaza mai intai un obiect parser (printr-o fabrica de obiecte) si apoi apeleaza metoda "parse" pentru acest obiect, cu specificarea unui fisier XML.

Metoda "parse" are ca rezultat un obiect de tip Document, care este arborele creat pe baza documentului XML, conform modelului DOM.

Exemplul urmator foloseste o functie recursiva pentru afisarea tuturor nodurilor dintr-un arbore DOM (cu nume si valoare), pornind de la radacina.

 

 

import javax.xml.parsers.*;

import java.io.*;

import org.w3c.dom.*;

// afisare nume si valori noduri din arbore DOM (Java 1.4)

class DomEcho

}

public static void main (String arg[]) throws Exception

}

 

Pentru afisarea unui arbore DOM sub forma unui arbore JTree se poate crea un arbore Swing cu datele din arborele DOM, sau se poate stabili o corespondenta nod la nod intre cei doi arbori sau se poate folosi o clasa adaptor.

Clasa adaptor primeste apeluri de metode din interfata TreeeModel si le transforma in apeluri de metode din interfata Node (DOM) . Exemplu:

 

class NodeAdapter implements TreeNode

public String toString()

public int getIndex(TreeNode child)

return -1; // nu ar trebui sa se ajunga aici.

}

public TreeNode getChildAt(int i)

public int getChildCount()

public TreeNode getParent()

public boolean isLeaf()

public boolean getAllowsChildren()

public Enumeration children ()

}

Clasa enumerator putea fi si o clasa inclusa anonima:

class CEnum implements Enumeration

public Object nextElement ()

public boolean hasMoreElements ()

}

}

 

Utilizarea clasei adaptor se va face astfel:

 

public static void main(String argv[ ]) throws Exception {

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

Document doc = builder.parse( new File(argv[0]) );

JFrame frame = new JFrame(argv[0]);

JTree tree = new JTree(new DefaultTreeModel(new NodeAdapter(doc)));

frame.getContentPane().add ( new JScrollPane(tree) );

frame.setSize(500,480); frame.setVisible(true);

 



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 12409
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved