28
Java XML

Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

Embed Size (px)

Citation preview

Page 1: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

Java XML

Page 2: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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

Page 3: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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

Page 4: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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

Page 5: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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

Page 6: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

DOM Api - ierarhia claselor de tip nod

Page 7: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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

Page 8: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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

Page 9: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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.

Page 10: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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

Page 11: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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

Page 12: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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.

Page 13: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

Salvarea datelor în fișiere Xml folosind DOM

Page 14: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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.

Page 15: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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

Page 16: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

Restaurarea datelor din fișiere Xml folosind DOM

Page 17: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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

Page 18: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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

Page 19: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

Structura unei aplicatii JAXB

Page 20: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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

Page 21: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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.

Page 22: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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

Page 23: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

@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;

Page 24: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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

Page 25: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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;

Page 26: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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;

}

Page 27: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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.

Page 28: Java XMLip.ase.ro/JavaIE10.pdf · 2018-05-27 · între aplicațiidezvoltate în limbajul de programare Java șischeme XML. O aplicațieJAXB poate executa doua sarcini: - salvarea

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;