XML Schema - I
Per la descrizione di XML schema, far
riferimento a XML Schema Part 0:
Primer
W3C Recommendation, 2 May 2001
http://www.w3.org/TR/xmlschema-0/
(copia cartacea disponibile in
biblioteca)
Laboratorio di Servizi Web - XML2 Ardissono
1
XML Schema - II
Sintassi per specifica di struttura di documenti
XML (documenti, strutture dati, ontologie, ...)
• più recente di DTD, specifica grammatica per
rappresentazione di documenti XML
– specifica struttura dei dati
– specifica tipo del contenuto dei dati
• DTD specifica struttura dati, ma non contenuto
– <!ELEMENT price (#PCDATA)>
– <price>6.90</price>
– <price>ciao</price>
Laboratorio di Servizi Web - XML2 Ardissono
OK!!!!
PCDATA!!!!
2
XML Schema - III
• definizione struttura di elementi dei documenti
– tipi semplici (tipi XML built-in e derivati)
– tipi complessi (definiti combinando tipi semplici)
• permette di specificare elementi del documento
necessari, opzionali, …
• XML schema è un documento XML, di estensione
.xsd (W3C) o .xml (Microsoft)
• Es: coffeeOrder.xsd definisce struttura di
documenti XML che descrivono ordini di caffè
• NB: esistono proposte di standard di
rappresentazione da parte di Microsoft, W3C e
altri. Noi vediamoW3C
Laboratorio di Servizi Web - XML2 Ardissono
3
address.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name=“billTo" type=“Address"/>
<xsd:complexType name="Address">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="country" type="xsd:string"/>
</xsd:complexType>
<?xml version="1.0"?>
<billTo country="Italy">
<name>Paolo Bianchi</name>
<street>123 via Po</street>
<city>Torino</city>
</billTo>
<billTo country="Italy">
<street>123 via Po</street>
<name>Paolo Bianchi</name>
<city>Torino</city>
</billTo>
Laboratorio di Servizi Web - XML2 Ardissono
4
Esempio di documento - coffeeOrd.xml
<?xml version="1.0"?>
<coffeeOrder orderDate="1999-10-20">
<billTo country="Italy">
<name>Paolo Bianchi</name>
<street>123 via Po</street>
<city>Torino</city>
</billTo>
<items>
<item partNum="242-NO" >
<coffeeName>Lavazza Oro</coffeeName>
<quantity>5</quantity>
<price>19.99</price>
</item>
<item partNum="242-MU" >
<coffeeName>Nescafe</coffeeName>
<quantity>3</quantity>
<price>19.98</price>
</item>
</items>
</coffeeOrder>
Laboratorio di Servizi Web - XML2 Ardissono
5
coffeeOrder.xsd - I
XML namespace
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
Dichiarazione elemento XML
<xsd:element name="coffeeOrder" type="CoffeeOrderType"/>
Dichiarazione di tipo
di dati complesso:
sequenza di elementi
fissa, simile a record
dei linguaggi di
programmazione
<xsd:complexType name="CoffeeOrderType">
<xsd:sequence>
<xsd:element name="billTo" type="Address"/>
<xsd:element name="items" type="Items"/>
<xsd:element name=”comment" type=”xsd:string” minOccurs= ”0"/>
</xsd:sequence>
<xsd:attribute name="orderDate" type="xsd:date"/>
</xsd:complexType>
Dichiarazione attributo di
elementi di tipo CoffeeOrderType
Laboratorio di Servizi Web - XML2 Ardissono
6
coffeeOrder.xsd - II
<xsd:complexType name="Address">
<xsd:sequence>
<billTo country="Italy">
<xsd:element name="name" type="xsd:string"/>
<name>Paolo Bianchi</name>
<xsd:element name="street" type="xsd:string"/>
<street>123 via Po</street>
<city>Torino</city>
<xsd:element name="city" type="xsd:string"/>
</billTo>
</xsd:sequence>
<xsd:attribute name="country" type="xsd:string"/>
</xsd:complexType>
• elementi del complexType sono obbligatori
• elementi devono apparire nei documenti nell’ordine
specificato dal complexType
• complexType definibili a partire da simpleType e altri
complexTypes (es: CoffeeOrderType usa Address, date, ...)
• attributi possono solo essere di tipo simpleType
Laboratorio di Servizi Web - XML2 Ardissono
7
coffeeOrder.xsd - III
Sequenza di elementi
variabile: contiene
almeno un item
<xsd:complexType name="Items">
<xsd:sequence>
<xsd:element name="item" minOccurs="1" maxOccurs="unbounded">
Dichiarazione anonymous
tipo di dato complesso
<xsd:complexType>
di un
<xsd:sequence>
<xsd:element name="coffeeName" type="xsd:string"/>
<xsd:element name="quantity">
<xsd:simpleType>
<item partNum="242-MU" >
<xsd:restriction base="xsd:positiveInteger"> <coffeeName>Nescafe</coffeeName>
<xsd:maxExclusive value="100"/>
<quantity>3</quantity>
</xsd:restriction>
<price>19.98</price>
</xsd:simpleType>
</item>
</xsd:element>
<xsd:element name="price" type="xsd:decimal"/>
</xsd:sequence>
<xsd:attribute name="partNum" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
Laboratorio di Servizi Web - XML2 8
</xsd:schema>
Ardissono
coffeeOrder.xsd - IV
<xsd:complexType>
<xsd:sequence>
<xsd:element name="coffeeName" type="xsd:string"/>
<xsd:element name="quantity">
Dichiarazione anonymous
di tipo di dato semplice
<xsd:simpleType>
<xsd:restriction base="xsd:positiveInteger">
<xsd:maxExclusive value="100"/>
Dichiarazione di
</xsd:restriction>
attributo necessario
</xsd:simpleType>
</xsd:element>
<xsd:element name="price" type="xsd:decimal"/>
</xsd:sequence>
<xsd:attribute name="partNum" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
Laboratorio di Servizi Web - XML2 Ardissono
9
Vincoli di occorrenza di elementi e attributi
• specificano min e max occorrenze di elementi. Es:
<xsd:complexType name=”AnnotatedOrder">
<xsd:sequence>
Elemento opzionale
...
<xsd:element name=”comment" type=”xsd:string” minOccurs= ”0"/>
</xsd:sequence>
<xsd:attribute name="orderDate" type="xsd:date"/>
</xsd:complexType>
• Se non specificati, minOccurs=maxOccurs=1
•
<xsd:element name=”comment" type=”xsd:string” minOccurs= ”0”
maxOccurs= ”3"/>
• Per attributi, minOccurs >= 0; maxOccurs =1
Laboratorio di Servizi Web - XML2 Ardissono
10
Attributi: Valori di default
• Specificano valore assunto da attributo quando non
specificato in documento XML. Es:
<xsd:complexType name="Address">
….
<xsd:attribute name="country" type="xsd:string” minOccurs=”0”
default=“Italy”/>
</xsd:complexType>
• Si può specificare valore di default per i soli
attributi opzionali
Laboratorio di Servizi Web - XML2 Ardissono
11
Attributi: Valori fissi
• Impongono valore fisso: se attributo specificato in
documento XML, deve avere quel valore. Se
omesso, valore associato automaticamente (
attributo opzionale)
<xsd:complexType name="Address">
...
<xsd:attribute name="country" type="xsd:string” fixed=“Italy”/>
</xsd:complexType>
• Default value e fixed values sono mutuamente
esclusivi
Laboratorio di Servizi Web - XML2 Ardissono
12
Tipi di dati semplici (simpleType) - I
• Tutti i tipi XML base (string, float, date, …)
• Tipi derivati da tipi built-in e derivati stessi
– per restrizione
<xsd:simpleType name=”MyInteger">
<xsd:restriction base=“xsd:integer”>
<xsd:minInclusive value=”0"/>
<xsd:maxInclusive value=”9"/>
</xsd:restriction>
</xsd:simpleType>
– per enumerazione
Si possono anche
fare restrizioni per
pattern (espressioni
regolari)
<xsd:simpleType name=”Città">
<xsd:restriction base=“xsd:string”>
<xsd:enumeration value=”Torino"/>
<xsd:enumeration value=”Milano"/>
<xsd:enumeration value=”Venezia"/>
</xsd:restriction>
</xsd:simpleType>
Laboratorio di Servizi Web - XML2 Ardissono
13
Tipi di dati semplici (simpleType) - II
• Liste di elementi di tipi semplici (NON di complessi o di
altre liste)
<xsd:element name=”lista" type=”MyListType"/>
<xsd:simpleType name=”MyListType">
<xsd:list itemType=“xsd:myInteger”>
<lista>0 3 2 8 9 6 7 2 4 1</lista>
</xsd:simpleType>
• Si può specificare lunghezza fissa, minima, massima della
lista, mediante restrizione
<xsd:simpleType name=”SeiNumeri">
<xsd:restriction base=“MyListType”>
<xsd:length value=“6”>
</xsd:restriction>
</xsd:simpleType>
Facets:
length
minLength
maxLength
Laboratorio di Servizi Web - XML2 Ardissono
14
Tipi di dati complessi (complexType) - I
• Estensioni di tipi semplici (associo attributi a tipi semplici)
<xsd:element name=”prezzo"/>
<xsd:complexType>
<prezzo valuta=”EUR”>35,7</prezzo>
<xsd:simpleContent>
<xsd:extension base=“xsd:decimal”>
<xsd:attribute name=”valuta" type="xsd:string”/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:prezzo>
<prezzo valuta=”EUR” valore=“35,7”/>
• Tipi complessi vuoti (senza elementi, solo attributi)
<xsd:element name=”prezzo" type=”InternationalPrice"/>
<xsd:complexType name=”InternationalPrice">
<xsd:attribute name=”valuta" type="xsd:string”/>
<xsd:attribute name=”valore" type="xsd:decimal”/>
</xsd:complexType>
Laboratorio di Servizi Web - XML2 Ardissono
15
Tipi di dati complessi - II
• Raggruppamento di elementi: sequence e choice
<xsd:element name=”billTo" type=”Address"/> />
<xsd:complexType name="Address">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
...
<xsd:choice>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name=”PO-BOX" type="xsd:string"/>
</xsd:choice>
</xsd:sequence>
...
</xsd:complexType>
<billTo country=”GB" >
<name>Paul Bley</name>
<city>Londra</city>
<street>Oxford Street</street>
</billTo>
Gli elementi di
choice sono
mutuamente
esclusivi nei
documenti XML
<billTo country=”Italy" >
<name>Carla Verdi</name>
<city>Roma</city>
<PO-BOX>125</PO-BOX>
</billTo>
Laboratorio di Servizi Web - XML2 Ardissono
16
Derivazione di tipi complessi
Per rappresentazione compatta dei dati e
riutilizzazione di definizioni di tipi di dati
• derivazione per estensione
• derivazione per restrizione
• si possono anche ridefinire tipi di dati, ma
trascuriamo
Laboratorio di Servizi Web - XML2 Ardissono
17
Derivazione di tipi complessi per estensione
<xsd:complexType name="Address">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="country" type="xsd:string"/>
</xsd:complexType>
<xsd:complexType name=”USAddress">
<xsd:complexContent>
<extension base=“Address”>
<xsd:sequence>
<xsd:element name=”region" type="xsd:string"/>
<xsd:element name=”zip" type=”positiveInteger"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
Laboratorio di Servizi Web - XML2 Ardissono
Aggiungo
campi
“region”
e “zip”
18
Derivazione di tipi complessi per restrizione - I
Restrizione di vincoli di occorrenza
<xsd:complexType name="Items” type=“itemType”>
<xsd:sequence>
<xsd:element name="item" minOccurs=”0" maxOccurs=”unbounded">
</xsd:sequence>
</xsd:complexType>
Restringo
cardinalità
min e max
di items
<xsd:complexType name=”ConfirmedItems” type=“itemType”>
<xsd:complexContent>
<restriction base=“Items”>
<xsd:sequence>
<xsd:element name="item" minOccurs=”1" maxOccurs=”100">
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
Laboratorio di Servizi Web - XML2 Ardissono
19
Derivazione di tipi complessi per restrizione - II
Le restrizioni sono simili a quelle applicate ai tipi
semplici …
Altri tipi di restrizione:
•
•
•
•
assegnazione di valore di default
assegnazione di valore fisso
restrizione di tipo (es: da anyType a positiveInteger)
...
Laboratorio di Servizi Web - XML2 Ardissono
20
Divisione di XML schema su file diversi
Per gestire schemi grossi o condividere definizioni
• importazione di uno schema esterno
URI di shema
<include
schemaLocation=“http://www.example.com/schemas/address.xsd”/>
• address.xsd definisce il complexType Address
• schema importatore può dichiarare element di tipo
Address come se definizione fosse interna
• uno schema può importare più schemi esterni
mediante clausole “include”
Laboratorio di Servizi Web - XML2 Ardissono
21
Namespace – ancora …
• Definisce spazio dei nomi per identificazione univoca
di etichette e tipi di dati
– XML Schema namespace: specifica XML Schema W3C
– xsd:schema
xmlns:xsd=“http://www.w3.org/2001/XMLSchema”
• tipi di dato built-in di XML: xsd:string, xsd:decimal, ...
• parole riservate: element, attribute, sequence, simpleType,
complexType, restriction, …
– si possono definire altri namespace, che identificano
spazio dei nomi di definizioni introdotte da noi. Es:
“http://www.example.com/C-ORDER”
– default name space: permette di usare nomi unqualified:
xmlns=“http://www.w3.org/2001/XMLSchema”
Laboratorio di Servizi Web - XML2 Ardissono
22
Definizione e uso di Namespace - I
Default
<schema xmlns:="http://www.w3.org/2001/XMLSchema”
namespace
xmlns:co="http://www.example.com/C-ORDER”
targetNamespace=“http://www.example.com/C-ORDER” >
Inclusione schema (URI)
Nuovo namespace: C-ORDER
<include schemaLocation=“http://www.example.com/schemas/address.xsd”/>
<element name="coffeeOrder" type=”co:CoffeeOrderType"/>
<complexType name="CoffeeOrderType">
<sequence>
coffeeOrder.xsd
<element name="billTo" type=”co:Address"/>
...
</sequence>
<attribute name="orderDate" type="date"/>
Schema, element, string, …
</complexType>
unqualified perchè definiti
…
in namespace di default
</schema>
Laboratorio di Servizi Web - XML2 Ardissono
23
Definizione e uso di Namespace - II
<schema xmlns="http://www.w3.org/2001/XMLSchema”
xmlns:co="http://www.example.com/C-ORDER”
targetNamespace=“http://www.example.com/C-ORDER” >
<complexType name="Address">
<sequence>
...
</sequence>
<attribute name="country" type="string"/>
</complexType>
</schema>
NB: definizioni
appartengono a
namespace C-ORDER
coffeeOrder.xsd e
address.xsd, insieme,
formano spazio
di nomi C-ORDER
per definire ordini
di caffè
address.xsd
Laboratorio di Servizi Web - XML2 Ardissono
24
Validazione di documenti XML - I
Per validare un documento XML rispetto a schema
bisogna specificare XML-schema di riferimento
Documento XML specifica i namespace usati
– xmlns=“http://www.example.com/C-ORDER”, ...
– qualifica i nomi (di tipi di dati, di etichette, …) se necessario
 validatore estrae definizioni per verificare correttezza
sintattica del documento
Noi vediamo validazione (e gestione) di documenti XML in
ambiente Java, basato su uso di JAXB
Laboratorio di Servizi Web - XML2 Ardissono
25
Validazione di documenti XML - II
<?xml version="1.0"?>
<co:coffeeOrder
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance”
xmlns:co="http://www.example.com/C-ORDER”
orderDate="1999-10-20">
Specifica
<billTo country="Italy">
<name>Paolo Bianchi</name>
<street>123 via Po</street>
<city>Torino</city>
</billTo>
<items>
<item partNum="242-NO" >
<coffeeName>Lavazza Oro</coffeeName>
<quantity>5</quantity>
<price>19.99</price>
</item>
</items>
</co:coffeeOrder>
Laboratorio di Servizi Web - XML2 Ardissono
namespaces
per validazione
myOrder.xml
26
Java Architecture for XML Binding - I
per la descrizione di JAXB, vedere tutorial
JWSDP1.1, JAXB:
http://www.educ.di.unito.it/intranet/dol/jaxb1.0/docs/index.html
accedere alla user’s guide
Laboratorio di Servizi Web - XML2 Ardissono
27
Java Architecture for XML Binding - II
Tecnologia Java volta a facilitare integrazione di XML
in applicazioni Java
• Basata su idea di gestire documenti XML come
oggetti appartenenti a classi Java che offrono metodi
per ispezionare, modificare e creare oggetti
• Permette di
– leggere, e modificare documenti XML validi trascurando
aspetti sintattici di XML
– creare nuovi documenti XML e validarli rispetto a schemi
XML
– Gestire documenti XML validi direttamente in Java, senza
passare a forma XML per validazione
Laboratorio di Servizi Web - XML2 Ardissono
28
Processo di XML data binding
• Dato XML schema, generare classi Java che
rappresentano strutture dati dichiarate in schema
(gerarchia di classi Java associate a tipi semplici e
complessi)
• Classi generate possono essere usate in applicazioni
per gestire oggetti XML (content tree)
– Unmarshal XML documents: lettura di un documenti
XML e generazione dei corrispondenti oggetti Java
– Marshal XML documents: creazione di documenti XML
corrispondenti a oggetto Java
Laboratorio di Servizi Web - XML2 Ardissono
29
Esempio: generazione classi da address.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name=”address" type=”Address"/>
<xsd:complexType name="Address">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="country" type="xsd:NMTOKEN"/>
</xsd:complexType>
</xsd:schema>
address.xsd
Address.java
ObjectFactory.java
impl
...
jaxb.properties
Laboratorio di Servizi Web - XML2 Ardissono
30
Rappresentazione Java di XML Schema - I
Definizioni di schema XML rappresentate in package
che contiene
• java content interfaces: dichiarazioni di tipi di dati
anonymous e non
• java Element interfaces: dichiarazioni di
“element” dello schema, eventualmente inserite in
liste di elementi
• Classi di tipi di dati enumerati: simple type
definitions (con facets di enumerazione)
Laboratorio di Servizi Web - XML2 Ardissono
31
Rappresentazione Java di XML Schema - II
• ObjectFactory class offre metodi per istanziare
interfacce java che rappresentano oggetti XML
• package (impl) con classi che implementano
interfacce
• property files: specificano associazioni di nomi a
classi, ...
• javadoc package
Laboratorio di Servizi Web - XML2 Ardissono
32
Interfaccia Address.java (generata) - I
package coffee1;
/**
* Java content class for Address complex type.
* <p>The following schema fragment specifies the expected content contained
within this java content object.
* <p>
Per javadoc
* <pre>
* &lt;complexType name="Address">
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
*
&lt;sequence>
*
&lt;element name="name"
type="{http://www.w3.org/2001/XMLSchema}string"/>
*
&lt;element name="street"
type="{http://www.w3.org/2001/XMLSchema}string"/>
*
&lt;element name="city"
type="{http://www.w3.org/2001/XMLSchema}string"/>
*
&lt;/sequence>
*
&lt;attribute name="country"
type="{http://www.w3.org/2001/XMLSchema}NMTOKEN" />
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* </pre>
*/
Laboratorio di Servizi Web - XML2 Ardissono
33
Interfaccia Address.java (generata) - II
public interface Address {
java.lang.String getCountry();
void setCountry(java.lang.String value);
java.lang.String getCity();
void setCity(java.lang.String value);
java.lang.String getStreet();
void setStreet(java.lang.String value);
java.lang.String getName();
void setName(java.lang.String value);
}
Un metodo di get e un
metodo di set
per ogni componente
del tipo di dato
getCountry()
setCountry()
Address
getCity()
……..
Laboratorio di Servizi Web - XML2 Ardissono
34
Classe AddressImpl.java (generata) - I
package coffee1.impl;
public class AddressImpl implements coffee1.Address,
com.sun.xml.bind.unmarshaller.UnmarshallableObject,
com.sun.xml.bind.serializer.XMLSerializable,
com.sun.xml.bind.validator.ValidatableObject {
In package impl, classe
protected java.lang.String _Country;
AddressImpl.java
protected java.lang.String _City;
implementa
protected java.lang.String _Street;
metodi dichiarati
protected java.lang.String _Name;
in Address.java
private final static com.sun.msv.grammar.Grammar schemaFragment =
com.sun.xml.bind.validator.SchemaDeserializer.deserialize(“…”);
private final static java.lang.Class PRIMARY_INTERFACE_CLASS() {
return coffee1.Address.class; }
Laboratorio di Servizi Web - XML2 Ardissono
35
Classe AddressImpl.java (generata) - II
…..
public java.lang.String getCountry() {
return _Country;
}
public void setCountry(java.lang.String value) {
_Country = value;
}
Implementazione dei metodi di get e
di set di tutti gli elementi dello schema
…
public com.sun.xml.bind.unmarshaller.ContentHandlerEx
getUnmarshaller(com.sun.xml.bind.unmarshaller.UnmarshallingContext
context) {
return new coffee1.impl.AddressImpl.Unmarshaller(context);
}
Laboratorio di Servizi Web - XML2 Ardissono
36
Class AddressImpl.java (generata) - III
public void serializeElements(com.sun.xml.bind.serializer.XMLSerializer
context) throws org.xml.sax.SAXException
{
...
}
public void serializeAttributes(com.sun.xml.bind.serializer.XMLSerializer
context) throws org.xml.sax.SAXException
{
...
}
………
Implementazione di Unmarshaller
che interpreta documento XML e
crea oggetto Java corrispondente
public class Unmarshaller
extends com.sun.xml.bind.unmarshaller.ContentHandlerEx
{
...
}
… etc etc
}
Laboratorio di Servizi Web - XML2 Ardissono
37
Interfacce e classi generate
Interfacce e classi di implementazione generate da
JAXB permettono ad applicazione java di
– generare oggetti secondo struttura dei tipi di dati definita
in schema XML
– marshal e unmarshal tra XML e Java
– marshal di oggetto XML in DOM e altri formati
 Compilato schema XML con JAXB Compiler, si
possono gestire documenti XML validi rispetto a
schema in ambiente Java senza usare SAX o altro
Laboratorio di Servizi Web - XML2 Ardissono
38
Classe ObjectFactory.java
Offre metodi per creazione di (oggetti) istanze delle
interfacce generate a partire dalle definizioni di tipi
di dati e di elementi nello schema XML. Es:
– ObjectFactory obj = new ObjectFactory();
– Address ad = obj.createAddress();
• serve per generare oggetti che appartengono alle
varie interfacce
• NB: una volta creati gli oggetti, si possono invocare
i metodi degli oggetti per assegnare valori. Es:
– ad.setCountry(“Italy”);
– ad.setCity(“Torino”); ...
Laboratorio di Servizi Web - XML2 Ardissono
39
Binding tra tipi di dati XML built-in e tipi Java
XML Schema Type
Java Data Type
xsd:string
java.lang.String
xsd:integer
java.math.BigInteger
xsd:int
int
xsd:double
double
xsd:date
java.util.Calendar
xsd:time
java.util.Calendar
…
…
Laboratorio di Servizi Web - XML2 Ardissono
40
Architettura di JAXB - I
XML
schema
JAXB
binding
compiler
Binding
declarations
Codice di applicazione
Schema
derived
interfaces
JAXB
Packages
XML
input
documents
Unmarshal
javax.xml.bind
Schema
Binding
derived
framework
Java classes implementation
Applicazione
Laboratorio di Servizi Web - XML2 Ardissono
XML
output
documents
Marshal
41
Architettura di JAXB - II
• Binding declarations: regole personalizzate di
traduzione di schema in classi Java (sovrascrivono
regole standard di JAXB. Es: a che package java devono
appartenere le classi generate, che nome dare a classi
generate a partire da definizioni di tipo in XML schema,…)
• Binding compiler: compilatore che legge XML
schema e genera le classi Java
• JAXB Packages: librerie JAXB
• JAXB Binding framework implementation:
runtime API. Offre interfacce per fare marshalling,
unmarshalling e validazione di documenti XML
Laboratorio di Servizi Web - XML2 Ardissono
42
package javax.xml.bind - I
• Definisce classi astratte e interfacce usate (e
implementate) in classi Java generate
– Unmarshaller: interpreta documenti XML e costruisce
content tree (oggetto Java che corrisponde a documento
XML)
– Validator: valida oggetti XML rispetto a schema XML
– Marshaller: genera documento XML che corrisponde a
content tree
– gerarchia di classi evento ed eccezione usate durante
marshal, unmarshal e validazione
Laboratorio di Servizi Web - XML2 Ardissono
43
package javax.xml.bind - II
– Classe JAXBContext
• gestisce corrispondenze tra nomi di elementi XML e
interfacce generate da XML schema
• fornisce astrazione per gestire informazioni di binding
usate in implementazione di operazioni marshal,
unmarshal e validate
• applicazione java che vuole usare classi generate da
JAXB compiler deve usare istanza di JAXBContext:
– JAXBContext jc =
JAXBContext.newInstance(contextPath);
– contextPath: lista di nomi di package che contengono
interfacce derivate da XML schema
Laboratorio di Servizi Web - XML2 Ardissono
44
Esempio di uso di JAXB
• Generazione di classi Java per schema
coffeeOrder.xsd
• Compilazione classi generate
• Sviluppo di applicazione java che usa classi per
– leggere documenti XML
– modificarne contenuto
– generare documenti XML
• CLASSPATH: deve contenere classi di gestione di XML
(parser XML, …) e compilatore JAXB (il vostro classpath è
già a posto)
Laboratorio di Servizi Web - XML2 Ardissono
45
Uso di JAXB - SUGGERIMENTI
JAXB, specialmente nella versione che state usando voi, non
funziona perfettamente (le versioni più recenti sono migliori).
Onde evitare di lottare contro i suoi bachi suggerisco di:
• Non definire mai tag XML che corrispondono a parole riservate (per
esempio, “add”)
• Non definire mai tipi di dati (complexType, simpleType) con nomi che
corrispondono, a meno di maiuscole e minuscole, a parole riservate o a
nomi di tag definiti nello schema (es: element “address”, complexType
“Address”)
• Inoltre, ma questo non è dovuto a bachi, l’elemento principale di uno
schema DEVE avere lo stesso nome del file xsd (es: element “indirizzo”
deve stare in file “indirizzo.xsd”)
Laboratorio di Servizi Web - XML2 Ardissono
46
coffeeOrder.xsd - I
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="coffeeOrder" type="CoffeeOrderType"/>
<xsd:complexType name="CoffeeOrderType">
<xsd:sequence>
<xsd:element name="billTo" type="Address"/>
<xsd:element name="items" type="Items"/>
</xsd:sequence>
<xsd:attribute name="orderDate" type="xsd:date"/>
</xsd:complexType>
<xsd:complexType name="Address">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="country" type="xsd:string"/>
</xsd:complexType>
Laboratorio di Servizi Web - XML2 Ardissono
47
coffeeOrder.xsd - II
<xsd:complexType name="Items">
<xsd:sequence>
<xsd:element name="item" minOccurs="1" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="coffeeName" type="xsd:string"/>
<xsd:element name="quantity">
<xsd:simpleType>
<xsd:restriction base="xsd:positiveInteger">
<xsd:maxExclusive value="100"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="price" type="xsd:decimal"/>
</xsd:sequence>
<xsd:attribute name="partNum" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Laboratorio di Servizi Web - XML2 Ardissono
48
Compilazione schema XML
• Sintassi di invocazione di JAXB compiler (xjc):
$JAXB_HOME/bin/xjc.sh XMLSchemaName -p packageName
Codice eseguibile del
compilatore JAXB
File XML-schema
da compilare
Nome package in cui
salvare le classi
generate
– xjc: alias per invocazione di compilatore (va invocato
essendo posizionati sulla directory D in cui c’è lo schema)
– Es: xjc coffeeOrder.xsd -p coffee1
•crea directory coffee1 (all’interno di D)
•genera interfacce in directory coffee1
•crea directory impl in D/coffee1
•genera implementazioni in directory coffee1/impl
Laboratorio di Servizi Web - XML2 Ardissono
49
Classi generate sotto coffee1 e coffee1/impl
Laboratorio di Servizi Web - XML2 Ardissono
50
Compilazione interfacce e classi generate
• Interfacce e classi generate devono essere compilate
come normali classi Java
– javac *.java impl/*.java
• Poi possono essere usate in altri programmi, MA:
– non è permesso generare direttamente oggetti a partire
dalle interfacce, con “new”
Address ad = new Address();
– per generare oggetti di tali classi bisogna usare metodi
offerti da ObjectFactory (vd dopo)
Laboratorio di Servizi Web - XML2 Ardissono
51
Applicazione java che crea documento XML
contenente un indirizzo (Address)
Sviluppiamo applicazione CreaAddress.java che
• Crea oggetto di tipo Address e ne istanzia le
variabili
• produce file indirizzo.xml che contiene l’indirizzo
in formato XML
• NB: Address è una delle classi generate dal
compilatore JAXB, non necessariamente il tipo
dell’elemento principale dello schema
Laboratorio di Servizi Web - XML2 Ardissono
52
CreaAddress.java - I
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
import java.io.*;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.UnmarshalException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.util.ValidationEventCollector;
import coffee1.*;
Laboratorio di Servizi Web - XML2 Ardissono
Importo
package coffee1
per usare classi
generate
da compilatore
JAXB
53
CreaAddress.java - II
public class CreaAddress{
Creo contesto JAXB per
public static void main( String args[] ) {
gestione di classi in coffee1
try {
JAXBContext jc = JAXBContext.newInstance( “indirizzo1" );
ObjectFactory objFactory = new ObjectFactory();
Address ad = objFactory.createAddress();
// set properties on it
Usare nome di package
ad.setName( “Giorgio” );
indicato in fase di compilazione
ad.setStreet( “via Po” );
con JAXB compiler
ad.setCity( “Torino” );
… continua …
NB: creazione di oggetto
Address NON si fa con“new”:
si usa metodo di creazione
offerto da ObjectFactory
Laboratorio di Servizi Web - XML2 Ardissono
54
CreaAddress.java - III
… continua …
Marshaller m = jc.createMarshaller();
Creo Marshaller per
generazione XML e
metto a true property
di formattazione linee
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.TRUE);
m.marshal(ad, System.out);
Marshal: genero XML document
su standard output
Marshal: genero XML document
su file di output
OutputStream os = new FileOutputStream(“indirizzo.xml");
m.marshal(ad, os);
} catch( UnmarshalException ue ) {System.out.println( "Caught
UnmarshalException" );} catch( JAXBException je ) {je.printStackTrace();}
catch( IOException ioe ) {ioe.printStackTrace();}
Catturo eccezioni
}
JAXB, Unmarshall, ...
Laboratorio di Servizi Web - XML2 Ardissono
55
Applicazione java che legge da file XML,
modifica e riscrive nuovo file XML
Sviluppiamo applicazione TestCoffee.java che
• legge ordine di caffè (order1.xml)
• estrae indirizzo del destinatario e stampa
informazioni a video
• estrae lista di item ordinati
• aggiunge un nuovo item all’ordine
• produce nuovo ordine, in file prova.xml di output
Laboratorio di Servizi Web - XML2 Ardissono
56
order1.xml
<?xml version="1.0"?>
<coffeeOrder orderDate="1999-10-20">
<billTo country="Italy">
<name>Chiara Bianchi</name>
<street>123 via Po</street>
<city>Torino</city>
</billTo>
<items>
<item partNum="242-NO" >
<coffeeName>Lavazza Oro</coffeeName>
<quantity>5</quantity>
<price>19.99</price>
</item>
<item partNum="242-MU" >
<coffeeName>Nescafe</coffeeName>
<quantity>3</quantity>
<price>19.98</price>
</item>
<item partNum="242-GZ" >
<coffeeName>Kimbo</coffeeName>
<quantity>3</quantity>
<price>27.95</price>
</item>
</items>
</coffeeOrder>
Laboratorio di Servizi Web - XML2 Ardissono
Usiamo JAXB
per interpretare
e validare questo
documento XML,
e per modificarlo
57
TestCoffee.java - I
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
import java.io.*;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.UnmarshalException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.util.ValidationEventCollector;
import coffee1.*;
Laboratorio di Servizi Web - XML2 Ardissono
58
TestCoffee.java - II
public class TestCoffee{
public static void main( String[] args ) {
try {
JAXBContext jc = JAXBContext.newInstance( "coffee1" );
Unmarshaller u = jc.createUnmarshaller();
u.setValidating( true );
CoffeeOrderType co =
(CoffeeOrderType)u.unmarshal( new FileInputStream( "order1.xml" ));
Address ad = co.getBillTo();
System.out.println(“Nome: “ + ad.getName());
Items itemList = co.getItems();
List items = itemList.getItem();
Items.ItemType i = newItem("Vergnano", new BigInteger("4"),
new BigDecimal("21.00"), "NND980");
items.add(i);
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(co, System.out);
OutputStream os = new FileOutputStream("prova.xml");
m.marshal(co, os);
} catch( UnmarshalException ue ) {System.out.println( "Caught
UnmarshalException" );} catch( JAXBException je ) {je.printStackTrace();} catch(
IOException ioe ) {ioe.printStackTrace();}
}
Laboratorio di Servizi Web - XML2 59
Ardissono
TestCoffee.java - III
public class TestCoffee{
Creo contesto JAXB per
public static void main( String[] args ) {
gestione di classi in coffee1
try {
JAXBContext jc = JAXBContext.newInstance( "coffee1" );
Unmarshaller u = jc.createUnmarshaller();
u.setValidating( true );
Creo Unmarshaller
Abilito validazione XML
Parsificazione documento
order1.xml e creazione
oggetto java
CoffeeOrderType co =
(CoffeeOrderType)u.unmarshal( new FileInputStream( "order1.xml" ));
------>>>>> continua
NB: JAXB fa sempre validazione
di documento, durante unmarshal.
Documento validato rispetto a
schema XML grazie a cast
su classe corrispondente
Laboratorio di Servizi Web - XML2 Ardissono
60
TestCoffee.java - IV
Address ad = co.getBillTo();
Estraggo indirizzo da elemento
ditipo CoffeeOrderType
System.out.println(“Nome: “ + ad.getName());
… stampare gli altri campi dell’indirizzo …
Items itemList = co.getItems();
List items = itemList.getItem();
Estraggo campi di
oggetto di tipo Address
Estraggo elemento Items
(che racchiude lista di Item)
Estraggo lista di elementi
di tipo Item
Items.ItemType i = newItem("Vergnano", new BigInteger("4"),
new BigDecimal("21.00"), "NND980");
items.add(i);
Creo nuovo item, usando un mio metodo
newItem e aggiungo item a lista
Laboratorio di Servizi Web - XML2 Ardissono
61
TestCoffee.java - V
Marshaller m = jc.createMarshaller();
Creo Marshaller per
generazione XML
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(co, System.out);
Marshal: genero XML document
su standard output
OutputStream os = new FileOutputStream("prova.xml");
m.marshal(co, os);
Marshal: genero XML document
su file di output
} catch( UnmarshalException ue ) {
System.out.println( "Caught UnmarshalException" );
} catch( JAXBException je ) {
je.printStackTrace();
Catturo eccezioni
} catch( IOException ioe ) {
JAXB, Unmarshall, ...
ioe.printStackTrace();
}
}
Laboratorio di Servizi Web - XML2 Ardissono
62
TestCoffee.java - VI
public static Items.ItemType newItem(String name, BigInteger quantity,
BigDecimal price, String partNum)
throws JAXBException {
// create an empty ItemType object
ObjectFactory objFactory = new ObjectFactory();
Items.ItemType item = objFactory.createItemsItemType();
// set properties on it
item.setCoffeeName( name );
item.setQuantity( quantity );
item.setPrice( price );
item.setPartNum( partNum );
// return it
return item;
}
}
Laboratorio di Servizi Web - XML2 Ardissono
63
Esercizi di uso di JAXB
Tutorial in linea (JAXB User’s Guide) riporta esempi di
applicazioni che usano classi generate da JAXB per
interpretare e generare documenti XML
Si veda la sezione Using JAXB
http://www.educ.di.unito.it/intranet/dol/jwsdp-1.1/jaxb1.0/docs/users-guide/jaxb-all.pdf
Laboratorio di Servizi Web - XML2 Ardissono
64
Scarica

xsd:sequence