Upload
tranlien
View
216
Download
0
Embed Size (px)
Citation preview
Java XML
Tehnologii Java XML
• Asigura persistenta datelor in diverse tipuri de aplicații si interoperabilitate intre
aplicații
• Tehnologii:
• JAXP: Java API for XML
• DOM - Document Object Model
• SAX - Simple API for XML
• JAXB: Java Architecture for XML Binding
XML
• XML este un standard pentru descrierea structurii documentelor folosind un
limbaj de descriere
• Caracteristici:
• Format text pentru descrierea datelor ceea ce-l face simplu de utilizat si
ușor editabil
• Standardizat. Exista API-uri specializate pentru parsare
• Aplicațiile care utilizează XML trebuie sa stabilească doar partea
semantica a reprezentării datelor
Elemente de structura XML
Taguri – conțin meta-informații legate de structura si semantica datelor
Sintaxa:
<tag> continut </tag>
sau
<tag continut />
Atribute - sunt definite prin perechi nume-valoare in interiorul unui tag
<point x=“72” y=“13” />
Un document XML incepe cu o declaratie:
<?xml version="1.0" encoding="UTF-8" ?>
Forma arborescenta:
Conține un element rădăcina
Conține alte elemente încuibate cuprinse intre 2 tag-uri pereche
DOM - Document Object Model
In tehnologia DOM, toate elementele unui document XML sunt considerate noduri.
Tipuri de noduri:
• Întregul document este un nod-document (clasa Document)
• Fiecare element XML este un nod-element (clasa Element)
• Textul XML din elementele XML sunt de tip nod-text (clasa Text)
• Comentariile sunt de tip nod-comentariu (clasa Comment)
• Atributele sunt de tip nod-atribut (clasa Attr)
DOM gestionează un arbore de noduri având ca rădăcina nodul Document.
Dezavantaj: consum de timp si de memorie
Structura ierarhica operează cu noțiunile de părinte (parent), fiu (children), frate
(siblings), astfel:
- nodul rădăcina este numit root
- fiecare nod cu excepția rădăcinii are un singur părinte
- un nod poate avea oricâți fii
DOM Api - ierarhia claselor de tip nod
DOM Api - Clase si interfete
public abstract class DocumentBuilderFactory extends Object; // Definește o clasa de tip
factory pentru crearea de parsere XML DOM
Metode
public static DocumentBuilderFactory newInstance(); // instanțierea unui obiect
DocumentBuilderFactory
public abstract DocumentBuilder newDocumentBuilder() throws
ParserConfigurationException; // crearea unui obiect DocumentBuilder
public abstract class DocumentBuilder extends Object; // Definește o clasă prin care se
poate obține referințele de tip Document asociate unui document XML
Metode
public Document parse(File f) throws SAXException,IOException; // obține obiectul
Document prin parsarea fișierului XML specificat
public abstract Document newDocument(); // creare obiect Document
public interface Node;// interfața la bază care modelează conceptul de nod
Metode
Node appendChild(Node newChild) throws DOMException; // Adăugarea unui nod
String getNodeName(); // Furnizează numele nodului
String getNodeValue() throws DOMException; // Întoarce valoarea nodului
short getNodeType(); // tipul nodului. Tipurile sunt definite ca si constante in interfața
Node. Exemplu: static final short ATTRIBUTE_NODE
Node getParentNode(); // nodul părinte
NodeList getChildNodes(); // lista fiilor
NamedNodeMap getAttributes(); // lista atributelor
public interface Document extends Node; // interfață care modelează conceptul de
document XML in viziune DOM
Metode
NodeList getElementsByTagName(String tagname); // întoarce elementele (din clasa
Element) asociate cu numele de tag specificat
Element createElement(String tagName) throws DOMException; // Creează un
nod de tip Element cu numele specificat
Attr createAttribute(String name) throws DOMException; //Creează un nod de tip
Attr (atribut) cu numele specificat
Comment createComment(String data); //Creează un nod de tip Comment cu
conținutul specificat
Text createTextNode(String data); //Creează un nod de tip Text cu conținutul
specificat
NodeList getElementsByTagName(String tagname); // Întoarce lista elementelor
din tagul specificat
Element getDocumentElement(); // Întoarce elementul rădăcina
public interface Element extends Node; // Interfață utilizata pentru implementarea
elementelor dintr-un arbore DOM. Elementele pot avea asociate atribute. Conține
metode de adăugare/consultare/ștergere atribute.
public abstract class Transformer extends Object; // Clasa Transformer este utilizata
pentru a crea un output XML pentru un arbore DOM. Instanțierea obiectelor se face prin
metode TransformerFactory
Metode
public abstract void setOutputProperty(String name, String value) throws
IllegalArgumentException; // Stabilirea unor proprietăți in procesul de transformare.
Parametrul name poate fi furnizat prin constante de tip String ale clasei OutputKeys.
Exemplu:TransformerFactory tFact=TransformerFactory.newInstance();
Transformer transf=tFact.newTransformer();
transf.setOutputProperty(OutputKeys.INDENT, "yes");
public abstract void transform(Source xmlSource, Result outputTarget)
throws TransformerException; // Transforma o reprezentare XML furnizata printr-un
obiect Source într-o reprezentare furnizata printr-un obiect Result
public abstract class TransformerFactory extends Object; // Clasa utilizata in crearea
obiectelor Transformer
Metode:
public static TransformerFactory newInstance() throws
TransformerFactoryConfigurationError; //Se creează o instanță TransformerFactory
public abstract Transformer newTransformer() throws
TransformerConfigurationException; // Creează o instanță Transformer
public class DOMSource extends Object implements Source; // Clasa utilizata pentru a
prezenta un arbore DOM ca un obiect sursa
Constructori:
public DOMSource(Node n) ; // Construire sursa după un arbore DOM cu n ca rădăcina
public DOMSource(); //Construire sursa fără specificarea arborelui DOM
Metode:
public void setNode(Node node); // Specificarea rădăcinii arborelui DOM
public Node getNode(); // Furnizarea rădăcinii
public class StreamResult extends Object implements Result; // Clasa
specializata in generarea unui output XML de tip Result in fisiere
Constructori
public StreamResult()
public StreamResult(OutputStream outputStream)
public StreamResult(Writer writer)
public StreamResult(File f)
Parametrii din constructori reprezinta diverse forme de a furniza fisierul output.
Metodele clasei furnizeaza acces la obiectele OutputStream, Writer sau File
utilizate ca output.
Salvarea datelor în fișiere Xml folosind DOM
public class StreamSource extends Object implements Source; // Clasa utilizata in
prezentarea sursei XML ca un fișier
Constructori
public StreamSource();
public StreamSource(InputStream inputStream);
public StreamSource(Reader reader);
public StreamSource(File f);
Parametrii de tip InputStream, Reader sau File arata diversele forme de furnizare a sursei.
Metodele clasei asigura acces la obiectele InputStream, Reader sau File.
public class DOMResult extends Object implements Result; // Clasă folosită in
prezentarea unui arbore DOM ca obiect Result
Constructori
public DOMResult(); // Nodul rădăcina este generat in procesul de creare a
obiectului Result. Acesta poate fi apoi accesat cu getNode()
public DOMResult(Node node); // Folosește node ca rădăcina a arborelui rezultat
Metode
public void setNode(Node node); // Specifica rădăcina Result-ului
public void setNextSibling(Node nextSibling); // Specifica următorul frate al
Result -ului
Restaurarea datelor din fișiere Xml folosind DOM
Colectii DOM
public interface NodeList; // definește o colecție de noduri fără criterii de
accesare
Metode
Node item(int index); // întoarce nodul de index specificat
int getLength(); //întoarce numărul de noduri
public interface NamedNodeMap; // definește o colecție de noduri care pot fi
accesate prin nume
Metode
Node item(int index); // întoarce nodul de index specificat
int getLength(); //întoarce numărul de noduri
Node getNamedItem(String name); // întoarce nodul cu numele specificat
JAXB
JAXB (Java Architecture for XML Binding) oferă o modalitate de conversie
între aplicații dezvoltate în limbajul de programare Java și scheme XML.
O aplicație JAXB poate executa doua sarcini:
- salvarea (marshalling) de obiecte Java in fișiere XML, cu posibilitatea de a
crea si fișierele de structura XSD (XML)
- construirea obiectelor Java din fișiere XML pe baza unei scheme XSD
(unmarshalling)
Pentru crearea/citirea schemelor se folosesc utilitarele schemagen si xjc
Structura unei aplicatii JAXB
Citirea unei scheme prin xjc
Sunt generate clasele Java pornind de la fișierul de descriere XSD. Etape:
1. Se copiază fișierul XSD in folderul proiectului
2. Se executa comanda prin utilitarul xjc
Exemplu. Destinația fișierelor sursa va fi folderul src. Pachetul va fi model.
xjc -d src -p model schema.xsd
Crearea schemelor
Prin utilitarul schemagen.
Exemplu. Fișierele class sunt in folderul bin. Fișierele sursă sunt in folderul src\model.
Clasa rădăcina este Personal descrisă in Personal.java. Numele implicit al schemei:
schema1.xsd
javac -d bin src\model\*.java
schemagen -cp bin src\model\Personal.java
Serializarea campurilor/proprietatilor
@XmlAccessorType - Este legată de serializarea câmpurilor/proprietăților. Poate fi aplicată
la nivel de pachet sau la nivel de clasă.
Valori:
@XmlAccessorType(XmlAccessType.FIELD); // Sunt serializate automat câmpurile non-
statice si non-transient. Proprietățile sunt serializate numai prin efectul altei adnotări
JAXB.
@XmlAccessorType(XmlAccessType. PROPERTY); // Serializare automata a
proprietăților non-statice si non-transient. Câmpurile numai prin efectul altei adnotări
JAXB.
@XmlAccessorType(XmlAccessType. PUBLIC_MEMBER); // Serializare automata a
câmpurilor/proprietăților publice. Celelalte numai prin efectul altei adnotări JAXB. Este
tipul implicit
@XmlAccessorType(XmlAccessType. NONE); // Serializare automată doar prin efectul
altor adnotări JAXB.
Adnotari de structura la nivel de clasa si atribute
@XmlRootElement; // definește elementul rădăcină din cadrul arborelui XML
Parametrii:
public abstract String name; // Numele elementului Xml. In lipsa este luat numele clasei
public abstract String namespace; // Numele de namespace Xml
@XmlType – Mapează o clasa la o schema Xml
Parametrii:
public abstract String name - Nume asociat cu proprietatea type a schemei XML in care este
mapată clasa. Default:"##default"
public abstract String[] propOrder - permite stabilirea structurii documentului XML prin
indicarea ordinii în care atributele clasei vor fi copiate
public abstract String namespace - numele de namespace asociat schemei. Implicit este
preluat de la pachet
public abstract Class factoryClass - numele clasei care creează instanțe. Implicit clasa
curenta (this)
public abstract String factoryMethod - numele metodei care creează instanțe
@XmlElement; // Mapează o proprietate/câmp la un element XML. Se aplică proprietăților
si/sau câmpurilor non-statice si non-tranzient
Parametrii:
public abstract String name; //numele elementului XML. In lipsa: numele
proprietății/câmpului
public abstract boolean nillable; // specifica daca o proprietate este asociata cu un element
nillable in schema (care poate avea valori null)
public abstract boolean required; // specifica daca este ceruta existenta cel puțin unei valori
pentru proprietatea respectiva (implicit: false)
@XmlElementWrapper ;// Generează un element de acoperire (încuibare) în jurul unei
reprezentări XML. Este utilizat în primul rând pentru evidențierea unei colecții.
public abstract String name; //numele acoperirii. In lipsa: numele proprietății/câmpului
public abstract boolean nillable;
public abstract boolean required;
JAXB Api
Crearea unui obiect JAXBContext
Un obiect JAXBContext constituie punctul de start într-o aplicație JAXB.
Obiectul JAXBContext conține informații de mapare XML-Java.
public static JAXBContext newInstance(Class... classesToBeBound) throws
JAXBException; // Este furnizata lista claselor recunoscute
Salvarea schemei XML
Salvarea schemei se poate face programatic prin intermediul unui obiect
SchemaOutputResolver.
public abstract class SchemaOutputResolver extends Object;
Metoda:
public abstract Result createOutput(String namespaceUri, String suggestedFileName)
throws IOException; // Decide locul in care va fi salvata schema XML si-l va întoarce sub
forma unui obiect Result
public class StreamResult extends Object implements Result; // Clasă utilizată
pentru generarea unor output-uri de tip XML, plain Text, HTML, sau alte
forme de descriere text de tip markup.
Constructori:
public StreamResult(File f);
public StreamResult(OutputStream outputStream);
public StreamResult(Writer writer);
Salvarea schemei se face prin metoda JAXBContext:
public void generateSchema(SchemaOutputResolver outputResolver)
throws IOException;
ExempluMarshaller msh = jaxbC.createMarshaller();
SchemaOutputResolver resolver = new SchemaOutputResolver() {
public Result createOutput(String namespaceUri, String
suggestedFileName)
throws IOException { return createResult("schema.xsd"); }
};
jaxbC.generateSchema(resolver);
}
...
public Result createResult(String suggestedFileName) throws
IOException {
File file = new File(suggestedFileName);
StreamResult result = new StreamResult(file);
return result;
}
Salvarea obiectelor in XML (marshalling)
Un obiect Marshaller salvează conținutul arborelui de obiecte într-un fișier XML.
Obiectul Marshaller se obține din JAXBContext:
public abstract Marshaller createMarshaller() throws JAXBException;
Serializarea arborelui in XML se face prin metoda:
void marshal(Object jaxbElement, File output) throws JAXBException;
Proprietăți marshalling:
void setProperty(String name, Object value) throws PropertyException; // Pot fi stabilite
anumite proprietăți de care sa se tina seama la salvare
Exemplu:
msh.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true/false); // Specifică
dacă se utilizează formatarea fișierului output (linii separate si indentare de linie).
Valoarea implicită este false.
Citirea fișierelor XML (unmarshalling)
Constă in deserializarea si constituirea arborelui de obiecte Java.
Sunt folosite obiecte Unmarshaller create prin JAXBContext:
public abstract Unmarshaller createUnmarshaller() throws JAXBException;
Citirea:
Object unmarshal(File f) throws JAXBException;