Massimo Martinelli
massimo AT w3c [DOT it
Ufficio Italiano W3C, CNR-ISTI
Area della Ricerca CNR
via Moruzzi, 1
56124 Pisa
Corso AQUARIUS sulle Tecnologie Web
Firenze 19 Ottobre 2010 - Pisa, 26 Ottobre 2010
il termine markup (o marcatura) deriva dall'ambiente tipografico dove si usava marcare con annotazioni le parti del testo che andavano evidenziate o corrette, allo scopo di segnalarle al compositore o al dattilografo. La tecnica di composizione di un testo con l'uso di marcatori (o espressioni codificate) richiede una serie di convenzioni, ovvero di un linguaggio a marcatori di documenti. In generale un linguaggio di markup descrive i meccanismi di rappresentazione (strutturali, semantici o presentazionali) del testo che, utilizzando convenzioni standardizzate, sono utilizzabili su più supporti.
<nome>
150,25 179,111 625,30 580,90 640,130 197,165 223,251 150,200 77,251 103,165 31,111 121,111
Questi gli obiettivi progettuali di XML (tenere di conto che sono stati pensati prima del 96) secondo il W3C XML Working Group:
Tre parti fondamentali distinte:
Anagrafe.xml
<?xml version="1.0" encoding="utf-8" ?>
<anagrafe>
<cie numerocarta="XX123456YY">
<cognome>Rossi</cognome>
<nome>Mario</nome>
<datanascita>
<giorno>20</giorno>
<mese>03</mese>
<anno>2003</anno>
</datanascita>
<luogonascita>
<comune>Livorno</comune>
<provincia>LI</provincia>
</luogonascita>
</cie>
</anagrafe>
Un ipotetico colloquio tra un Ente
(es. Ministero degli Interni, Prefettura,
Camera di Commercio, ...)
e l'Anagrafe
Uno degli obiettivi di progettazione di XML
è che sia in un formato leggibile dall'uomo,
per intendersi non può essere in formato binario,
e dovrebbe essere ragionevolmente chiaro.
Ogni documento XML inizia con un prologo
contiene una dichiarazione di versione
l'insieme di caratteri utilizzato (character set)
<?xml version="1.0" encoding="utf-8" ?>
. . .
Documento conforme alla versione 1.0 di XML
Documento che usa caratteri appartenenti alla codifica UTF-8
XML supporta Unicode:
Unicode è un sistema di codifica che assegna un numero univoco ad ogni carattere usato per la scrittura di testi, in maniera indipendente dalla lingua, dalla piattaforma informatica e dal programma utilizzati
UTF-8 (Unicode Transformation Format, 8 bit) è una codifica dei caratteri Unicode in sequenze di lunghezza variabile (da 1 a 4) di byte
Rende possibile l'utilizzo contemporaneo di differenti alfabeti senza difficoltà
La codifica dei caratteri identifica gli stessi:
non devo utilizzare codifiche particolari per far riconoscere i caratteri, uso direttamente i caratteri che verranno riconosciuti poichè dichiaro il set di caratteri (se utilizzo un editore utf-8)
ISO 8859-1 codifica i caratteri dell'alfabeto Latino 1 (191 characters) e rappresenta i caratteri usati in Europa occidentale
Radice (root): elemento che racchiude tutti gli altri
<?xml version="1.0" encoding="utf-8"?>
<anagrafe>
. . .
</anagrafe>
Ogni tag di apertura deve avere un corrispondente tag di chiusura </nome_elemento>
Forma concisa per elementi senza contenuto:
<nome_elemento />
forme equivalenti
<nome_elemento attr="valore"></nome_elemento>
<nome_elemento attr="valore" />
Esempi HTML
<br /> (<br></br> )
<img src="http://www.w3.org/Icons/w3c_home" alt="logo W3C" />
I tag devono essere nidificati correttamente
<aa>
<bb>
</aa>
</bb>
<aa>
<bb>
</bb>
</aa>
XML è case sensitive
le lettere maiuscole e quelle minuscole sono interpretate differentemente
<nome> != <Nome> != <NOME>
i tag XML per convenzione si scrivono in minuscolo (previsto nella prima recommendation)
Alcuni caratteri e sequenze di caratteri sono riservati, pertanto non si possono utilizzare nei nomi di tag (%, xml, ...).
<cie numerocarta="XX123456YY">
Sintassi:
<elemento attributo="valore">contenuto</elemento>
Quotare gli attributi
<!ELEMENT anagrafe (cie+)>
<!ELEMENT cie (cognome, nome, datanascita, luogonascita, luogoresidenza?, infoaggiuntiva*)>
<!ATTLIST cie
numerocarta ID #REQUIRED>
<!ELEMENT cognome (#PCDATA)>
<!ELEMENT nome (#PCDATA)>
<!ELEMENT datanascita (giorno, mese, anno)>
<!ELEMENT giorno (#PCDATA)>
<!ELEMENT mese (#PCDATA)>
<!ELEMENT anno (#PCDATA)>
<!ELEMENT luogonascita (comune, provincia, statoestero?)>
<!ELEMENT comune (#PCDATA)>
<!ELEMENT provincia (#PCDATA)>
<!ELEMENT statoestero (#PCDATA)> <!-- solo se != Italia -->
<!ELEMENT luogoresidenza (comune, provincia, statoestero?)> <!-- solo se diversa da quella di nascita -->
<!ELEMENT infoaggiuntiva (#PCDATA)>
Internamente al file XML: dichiarazione DOCTYPE:
<?xml version="1.0"?>
<!DOCTYPE elemento_radice [
definizione elementi, attributi, entità, notazioni
]>
< anagrafe >
...
</ anagrafe >
in caso di DTD esterna:dichiarazione DOCTYPE (document type declaration) nel file XML
<?xml version="1.0"?>
<!DOCTYPE anagrafe SYSTEM "anagrafe.dtd">
Successivamente alla dichiarazione DOCTYPE si dichiarano gli elementi
SINTASSI:
<!ELEMENT nome_elemento (nomi_degli_elementi_permessi)>
esempio dichiarazione
<!ELEMENT cie (cognome, nome, datanascita, luogonascita, luogoresidenza?, infoaggiuntiva*)>
(ELEMENT CONTENT)
elemento "cie" padre di altri elementi
elementi figli separati da "," (virgola): devono essere apparire nel file anagrafe.xml nello questo stesso ordine.
elmenti marcati con carattere "*": possono essercene 0, 1 o più di uno
elementi marcati dal carattere "?": possono essere presenti zero o una volta
Altro esempio:
<!ELEMENT persona (nome|cognome)>
<!ELEMENT persona (nome|cognome|email)+>
il carattere "|" corrisponde ad un "OR" ovvero l'elemento "persona" sarà costituito dall'elemento "nome" oppure dall'elemento "cognome"
il carattere "+", da almeno 1 ma anche da più elementi "nome", "cognome", "email" in qualsiasi ordine.
Elemento (1) Elemento ? (0,1) Elemento * (0,1,+) Elemento + (1,+) Elemento1 , Elemento2 (and, stesso ordine) Elemento1 | Elemento2 (or)
<!ELEMENT cognome (#PCDATA)>
l'elemento cognome potrà essere composto da qualsiasi testo
o altro carattere che non sia un markup o ", & oppure ]]
PCDATA = Parsed Character Data
CDATA = Character Data
Sezione CDATA: un modo conveniente per rendere più semplice la vita agli autori di documenti XML.
Supponiamo di voler includere un esempio XML in un documento XML, ci sono due modi per farlo:
<tag>ciao !</tag>
<![CDATA[<tag>ciao !</tag>]]>
Con CDATA è possibile inserire frammenti di codice XML all'interno di altri documenti XML senza dover preoccuparsi di usare le entità per i caratteri "<" e "&" (escaping)
Gli attributi sono usati per associare coppie di nome-valore agli elementi. Le specifiche di attributo possono apparire solo all'interno dei tag-di-inizio e dei tag degli elementi vuoti
Dichiarazioni di lista di attributi (Attribute-List)
<!ATTLIST nome_elemento
nome_attributo tipo_di_attributo valore_di_default>
I tipi di attributo possono essere
Si possono definire entità nel caso ci siano elementi ripetuti spesso: ad esempio
<!ENTITY XML "eXtensible Markup Language">
ogni occorrenza di &XML; (nel file XML) sarà sostituita in fase di visualizzazione dalla stringa
"eXtensible Markup Language"
Le entità si possono utilizzare per rappresentare caratteri riservati come ad esempio "<" o ">" (<, >), o possono essere usate per far riferimento a documenti esterni nel caso il documento XML non sia composto da un unico file:
<!ENTITY introduzione SYSTEM "introduzione.txt">
Possono essere anche parametriche
<!ENTITY % [nome] "[nomi]">
ad esempio:
<!ENTITY % headings "H1 | H2 | H3 | H4">
<!ENTITY BODY (%headings | P | DIV | BR)*>
Un documento XML si dice "ben formato" quando:
Un documento si dice "valido" quando
Analizzano i documenti XML, due tipi:
Utili entrambi, utilizzo in contesti differenti
(a volte non serve verificare la validità ma solo la correttezza)
<?XML version="1.0" encoding="utf-8"?>
<!DOCTYPE anagrafe>
<anag>
<cie numerocarta=1>
<nome>Mario Volontà
<Indirizzo>Via Elba</Indirizzo>
<num>11</num>
<comune>Livorno</comune>
</cie>
</anag>
<?XML version="1.0" encoding="utf-8"?>
<!DOCTYPE anagrafe SYSTEM "anagrafe.dtd">
<anag>
<cie numerocarta="1">
<nome>Mario Volontà</nome> // se scritto con editore utf-8 va bene anche "à"
<indirizzo>Via Elba</indirizzo>
<num>11</num>
<comune>Livorno</comune>
</cie>
</anag>
manca SYSTEM "anagrafe.dtd" apici </nome> Root anag != anagrafe DOCTYPE Valore attributo numerocarta non tra apici <nome> non chiuso Indirizzo maiuscolo (in XML tag si scrivono in minuscolo) à entità non dichiarata
Scrivere un DTD e una istanza di documento XML conforme relativo ad un elenco di libri o brani musicali
- Problemi principali da risolvere sul Web: difficoltà trovare informazioni
- XML permette di strutturare i documenti e di associare una sintassi
- Riduzione del traffico di rete, maggiore sviluppo applicazioni client
- XML supporta UNICODE, un grande numero di set di caratteri può essere utilizzato
- XML può essere usato come formato di scambio per documenti elettronici ed applicazioni
- Indipendente da hardware e software
- Struttura contente di manipolare i dati in modo più semplice ed efficiente
- Quando registriamo informazioni vogliamo essere sicuri di poterle riutilizzare in futuro
(es. word 1, word 2, word n, word per mac, word per win, incompatibilità, perdita di informazioni)
- Un documento XML è in formato leggibile dall'uomo
- Documento strutturati e metainformazioni consentono motori di ricerca più accurati
- Sistemi standard di metadati: Resource Description Framework
- XML è estensibile, non ha tag predefiniti
- Consente di creare linguaggi standard ed estendibili, per campi di applicazione
(medicina, elettronica, matematica, musica, ...)
- Con SAX, DOM, JDOM semplice scrivere un programma che cerca ed utilizza elementi e contenuti
- Offre una ottima capacità di rappresentare dati complessi (notazioni matematiche, interfacce grafiche)
- Visualizzare documento su media differenti in modi diversi senza doverlo riscriv. ogni volta
- XSL offre meccanismi per rappresentare e manipolare il documento, buona capacità di rappresentare dati complessi (notazioni matematiche, interfacce grafiche); sequenze, cicli e condizioni (N-regine)
<!ELEMENT nome (#PCDATA)>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
. . . dichiarazioni di elementi . . .
</schema>
xmlns:prefisso="URIunivoco"
A cosa ci possono servire gli spazi di nomi ?
<html:body xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xhtml:h1>text</xhtml:h1>
</html:body>
body e h1 appartengono al namespace HTML
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:dc="http://purl.org/metadata/dublin-core"
...
<xhtml:p>questo è un paragrafo xhtml</xhtml:p>
<dc:Creator>Mario Rossi</dc:Creator>
<?xml version="1.0" encoding="utf-8"?>
<anagrafe xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="anagrafe.xsd">
<cie numerocarta="XX123456YY">
<cognome>Rossi</cognome>
<nome>Mario</nome>
<datanascita>
<giorno>20</giorno>
<mese>03</mese>
<anno>2003</anno>
</datanascita>
<luogonascita>
<comune>Livorno</comune>
<provincia>LI</provincia>
</luogonascita>
</cie>
</anagrafe>
<?xml version="1.0" encoding="utf-8"?>
<anagrafe xmlns="http://www.comune.livorno.it"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.comune.livorno.it
anagrafe.xsd">
<cie numerocarta="XX123456YY">
<cognome>Rossi</cognome>
<nome>Mario</nome>
<datanascita>
<giorno>20</giorno>
<mese>03</mese>
<anno>2003</anno>
</datanascita>
<luogonascita>
<comune>Livorno</comune>
<provincia>LI</provincia>
</luogonascita>
</cie>
</anagrafe>
Per difetto:
(supponendo che xsd identifichi il namespace XMLSchema)
<xsd:element name="nome_elemento" type="tipo_elemento" />
Nel nostro esempio potremmo definire un elemento titolo di tipo string
<xsd:element name="titolo" type="string" />
Tipi semplici predefiniti in XML Schema | ||||
---|---|---|---|---|
Tipo Semplice | Esempi (delimitati da virgola) | |||
string | Testo di esempio | |||
normalizedString | Testo di esempio | |||
token | Testo di esempio | |||
base64Binary | GpM7 | |||
hexBinary | 0FB7 | |||
integer | ...-1, 0, 1, ... | |||
positiveInteger | 1, 2, ... | |||
negativeInteger | ... -2, -1 | |||
nonNegativeInteger | 0, 1, 2, ... | |||
nonPositiveInteger | ... -2, -1, 0 | |||
long | -9223372036854775808, ... -1, 0, 1, ... 9223372036854775807 | |||
unsignedLong | 0, 1, ... 18446744073709551615 | |||
int | -2147483648, ... -1, 0, 1, ... 2147483647 | |||
unsignedInt | 0, 1, ...4294967295 | |||
short | -32768, ... -1, 0, 1, ... 32767 | |||
unsignedShort | 0, 1, ... 65535 | |||
byte | -128, ...-1, 0, 1, ... 127 | |||
unsignedByte | 0, 1, ... 255 | |||
decimal | -1.23, 0, 123.4, 1000.00 | |||
float | -INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN | |||
double | -INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN | |||
boolean | true, false, 1, 0 | |||
duration | P1Y2M3DT10H30M12.3S | |||
dateTime | 1999-05-31T13:20:00.000-05:00 | |||
date | 1999-05-31 | |||
time | 13:20:00.000, 13:20:00.000-05:00 | |||
gYear | 1999 | |||
gYearMonth | 1999-02 | |||
gMonth | --05 | |||
gMonthDay | --05-31 | |||
gDay | ---31 | |||
Name | shipTo | |||
QName | po:USAddress | |||
NCName | USAddress | |||
anyURI |
| |||
language | it, en-GB, en-US, fr | |||
ID | ||||
IDREF | ||||
IDREFS | ||||
ENTITY | ||||
ENTITIES | ||||
NOTATION | ||||
NMTOKEN |
| |||
NMTOKENS |
|
<xsd:complexType name="libro">
<xsd:sequence>
<xsd:element name="titolo" type="xsd:string"/>
<xsd:element name="autore" type="xsd:string"/>
<xsd:element name="editore" type="xsd:string"/>
<xsd:element name="pagine" type="xsd:positiveinteger"/>
</xsd:sequence>
<xsd:attribute name="isbn" type="xsd:string"/>
</xsd:complexType>
sequence: sequenza di elementi con ordine prefissato
equivale alla "," (virgola) della DTD
<xsd:complexType name="libro">
<xsd:sequence>
<xsd:element name="titolo" type="xsd:string"/>
<xsd:element name="autore" type="xsd:string" maxOccurs="unbounded" />
<xsd:element name="editore" type="xsd:string"/>
<xsd:element name="pagine" type="xsd:positiveinteger"/>
</xsd:sequence>
<xsd:attribute name="isbn" type="xsd:string"/>
</xsd:complexType>
È possibile assegnare agli elementi di tipo semplice un valore per difetto
<xs:element name="colore" type="xs:string" default="rosso" />
È possibile specificare un valore prefissato (fixed) (non è possibile specificare un altro valore)
<xs:element name="colore" type="xs:string" fixed="rosso" />
Gli attributi sono sempre di tipo semplice (predefinito o derivato per restrizione)
Tutti gli attributi sono opzionali per difetto
Per specificare esplicitamente che un attributo è opzionale è necessario specificare l'attributo "use".
<xs:attribute name="lang" type="xs:string" use="optional" />
Per rendere un attributo obbligatorio:
<xs:attribute name="lang" type="xs:string" use="required" />
Per proibire l'uso di un attributo
<xs:attribute name="lang" use="prohibited" />
Gli attributi possono occorrere una sola volta
È possibile assegnare agli attributi un valore per difetto
<xs:attribute name="lang" type="xs:string" default="IT" />
È possibile specificare un valore prefissato (fixed) (non è possibile specificare un altro valore)
<xs:attribute name="lang" type="xs:string" fixed="IT" />
<xsd:simpleType name="percentuale">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0" />
<xsd:maxInclusive value="100" />
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="CodiceType">
<xsd:restriction base="xsd:ID">
<xsd:pattern value="[a-zA-Z]{1}-\d{3}"/>
</xsd:restriction>
</xsd:simpleType>
SIMBOLO | Valori possibili |
---|---|
\d | numero decimale |
\s\w | uno spazio seguito da un carattere (word) |
ñ | ? |
\p{Lu} | carattere maiuscolo |
\p{IsGreek} | carattere dell'alfabeto Greco |
\P{IsGreek} | carattere non dell'alfabeto Greco |
a*x | *=0,1,n volte --> x, ax, aax, aaax, ... |
a?x | ? = 0, 1 volte --> x, ax |
a+x | +=1,n volte --> ax, aax, aaax, ... |
(a|b)+x | a oppure b, seguito da x --> ax, bx, aax, bbx, abx, ... |
[abcde]x | [ ] uno dei simboli presenti all'interno ax, bx, cx, dx, ex |
[a-e] | uno dei simboli tra "a" ed "e" (minuscolo) a, b,c, d, e |
[-ae]x | -x, ax, ex |
[^0-9]x | qualsiasi carattere non compreso tra 0 e 9 seguito da x |
\D | qualsiasi carattere non cifra numerica seguito da x |
.x | qualsiasi carattere seguito da x |
.*abc.* | qualsiasi sequenza di caratteri seguita da abc seguita da qualsiasi sequenza di caratteri |
ab{2}x | abbx (2 volte il carattere b) |
ab{2,4}x | da 2 a 4 volte il carattere b --> abbx, abbbx, abbbbx |
ab{2,}x | almeno 2 caratteri b --> abbx, abbbx, abbbx, ... |
<xsd:simpleType name="codiceType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{2}-[a-zA-Z]{2} "/>
<xsd:pattern value="\d{1}-\d{2}-[a-zA-Z]{2}" />
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="codiceType">
<xsd:restriction base="xsd:string">
<xsd:pattern value=" ="\d{2}-[a-zA-Z]{2} | \d{1}-\d{2}-[a-zA-Z]{2}" />
</xsd:restriction>
</xsd:simpleType>
Il simbolo | significa "oppure" (OR)
length | lunghezza fissa |
minLength | lunghezza minima |
maxLength | lunghezza massima |
pattern | modello (espressione regolare) |
enumeration | enumerazione |
whiteSpace | spazio |
minExclusive | valore minimo (non incluso) |
maxExclusive | valore massimo (non incluso) |
minInclusive | valore minimo (incluso) |
maxInclusive | valore massimo (incluso) |
totalDigits | numero totale di cifre |
fractionDigits | numero cifre dopo la virgola per un decimale, frazione di secondo,...) |
applicabili sulla base del tipo (numerico, stringa, binario)
Appendice B della raccomandazione: "Simple Types & their Facets"
<xsd:simpleType name="LinguaType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Italiana"/>
<xsd:enumeration value="Francese"/>
<xsd:enumeration value="Inglese"/>
</xsd:restriction>
</xsd:simpleType>
<xs:element name="programma_sorgente">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
È possibile creare nuovi tipi, detti tipi lista, derivando dai tipi predefiniti (non è possibile derivare ulteriormente da un tipo lista ne da tipi complessi)
Esempio: creazione del tipo ListaDiInteriType
<xsd:simpleType name="ListaDiInteriType">
<xsd:list itemType="xsd:integer"/>
</xsd:simpleType>
Se listaInteri è definito di tipo MiaListaDiInteriType
<listaInteri>20003 15037 95977 95945</listaInteri>
La lista non è predefinita
Attenzione agli spazi nel caso di liste di tipo string con parole composte
Asia Europa America Latina
se avessimo impostato il facet length="3" questo elenco comporterebbe un errore
Valori ammissibili: unione dei valori ammissibili dei tipi elencati
Posso utilizzare ALTERNATIVAMENTE uno tra I tipi elencati
<xsd:simpleType name="MiaUnioneType">
<xsd:union memberTypes="xsd:string ListaInteriType"/>
</xsd:simpleType>
Se mioElencoUnione è stato dichiarato di tipo MiaUnioneType
Valori ammissibili:
<mioElencoUnione>libro</mioElencoUnione>
<mioElencoUnione>95630 95977 95945</mioElencoUnione>
Valori NON AMMISSIBILI:
<mioElencoUnione>libro giornale</mioElencoUnione>
<mioElencoUnione>123 456 789</mioElencoUnione>
<mioElencoUnione>pagina 123</mioElencoUnione>
È possibile definire insiemi di tipi nominati e dichiarare elementi che li riferiscono
È possibile definire un nuovo tipo anonimamente all'interno della definizione di un elemento (comodo nel caso il nuovo tipo venga usato solo una volta)
<xsd:complexType name="Oggetti"> <!-- Tipo nominato -->
<xsd:sequence>
<xsd:element name="oggetto" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType> <!-- Tipo anonimo -->
<xsd:sequence>
<xsd:element name="nomeProdotto" type="xsd:string"/>
<xsd:element name="quantita">
<xsd:simpleType> <!-- Tipo anonimo -->
<xsd:restriction base="xsd:positiveInteger">
<xsd:maxExclusive value="100"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="prezzo" type="xsd:decimal"/>
<xsd:element name="dataAcquisto" type="xsd:date" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
Normalmente i dati in forma di carattere (PCDATA) sono ammessi all'interno degli elementi
XML Schema fornisce un metodo per permettere che tali dati possano essere esterni ai sotto-elementi
<lettera>
<saluto>Caro Sig. </saluto><nome>Mario Rossi</nome>
Il giorno <dataSpedizione>200-03-21</dataSpedizione>
abbiamo provveduto a spedirle n. <quantitativo>1</quantitativo>
<nomeProdotto>computer</nomeProdotto>
Cordiali saluti
</lettera>
Schema XML relativo
<xsd:element name="lettera">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element name="saluto" type="xsd:string">
<xsd:element name="nome" type="xsd:string" />
<xsd:element name="dataSpedizione" type="xsd:date" />
<xsd:element name="quantitativo" type="xsd:positiveInteger"/>
<xsd:element name="nomeProdotto" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<cambioLira valuta=“Euro" valore=“1936.27"/>
Definzione di un tipo (anonimo) con contenuto complesso (complexContent)
<xsd:element name=“cambioLira">
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:attribute name=“valuta" type="xsd:string"/>
<xsd:attribute name="valore" type="xsd:decimal"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
Elemento complexContent serve per definire elementi figli e attributi di elementi
Restrizione anyType dichiara due attributi, non introduce nessun contenuto per l’elemento
Sintassi abbreviata
<xsd:element name=“cambioLira">
<xsd:complexType>
<xsd:attribute name=“valuta" type="xsd:string"/>
<xsd:attribute name=“valore" type="xsd:decimal"/>
</xsd:complexType>
</xsd:element>
Oltre al modello sequence esiste un altro modello per per vincolare gli elementi: choice. In un gruppo gli elementi possono apparire in modo mutuamente esclusivo (or)
<xsd:complexType name="primoOsecondoType">
<xsd:choice>
<xsd:element name="primo" type="xsd:string" />
<xsd:element name="secondo" type="xsd:string" />
</xsd:choice>
</xsd:complexType>
Scrivere uno Schema XML che rappresenti una classe di documenti "residenza" con queste caratteristiche:
Per ogni persona indicare la nuova residenza (via, numero civico, cap, comune, data cambio di residenza)
e ogni eventuale precedente residenza
Scrivere una istanza XML conforme allo Schema XML definito
Validare il documento (Validatore)
Realizzare uno Schema XML per la nostra classe di documenti anagrafe
(trasformare la DTD anagrafe.dtd in schema XML)
Validare il documento
<!ELEMENT anagrafe (cie+)>
<!ELEMENT cie (cognome, nome, datanascita, luogonascita, luogoresidenza?, infoaggiuntiva*)>
<!ATTLIST cie
numerocarta ID #REQUIRED>
<!ELEMENT cognome (#PCDATA)>
<!ELEMENT nome (#PCDATA)>
<!ELEMENT datanascita (giorno, mese, anno)>
<!ELEMENT giorno (#PCDATA)>
<!ELEMENT mese (#PCDATA)>
<!ELEMENT anno (#PCDATA)>
<!ELEMENT luogonascita (comune, provincia, statoestero?)>
<!ELEMENT comune (#PCDATA)>
<!ELEMENT provincia (#PCDATA)>
<!ELEMENT statoestero (#PCDATA)> <!-- solo se != Italia -->
<!ELEMENT luogoresidenza (comune, provincia, statoestero?)> <!-- solo se diversa da quella di nascita -->
<!ELEMENT infoaggiuntiva (#PCDATA)>
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="anagrafe">
<xs:complexType>
<xs:sequence>
<xs:element name="cie" type="cieType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="cieType">
<xs:sequence>
<xs:element ref="cognome"/>
<xs:element ref="nome"/>
<xs:element name="datanascita" type="datanascitaType"/>
<xs:element name="luogonascita" type="luogonascitaType"/>
<xs:element name="luogoresidenza" type="luogoresidenzaType" minOccurs="0"/>
<xs:element ref="infoaggiuntiva" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="numerocarta" type="xs:ID" use="required"/>
</xs:complexType>
<xs:element name="cognome" type="xs:string"/>
<xs:element name="nome" type="xs:string"/>
<xs:complexType name="datanascitaType">
<xs:sequence>
<xs:element ref="giorno"/>
<xs:element ref="mese"/>
<xs:element ref="anno"/>
</xs:sequence>
</xs:complexType>
<xs:element name="giorno" type="xs:gDay"/>
<xs:element name="mese" type="xs:gMonth"/>
<xs:element name="anno" type="xs:gYear"/>
<xs:element name="infoaggiuntiva" type="xs:string"/>
<xs:complexType name="luogonascitaType">
<xs:sequence>
<xs:element ref="comune"/>
<xs:element ref="provincia"/>
<xs:element ref="statoestero" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="luogoresidenzaType">
<xs:sequence>
<xs:element ref="comune"/>
<xs:element ref="provincia"/>
<xs:element ref="statoestero" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:element name="comune" type="xs:string"/>
<xs:element name="provincia" type="xs:string"/>
<xs:element name="statoestero" type="xs:string"/>
</xs:schema>
Domande?
Se non è sul Web non esiste ...
... troverete le slide all'indirizzo (http://www1.isti.cnr.it/~Martinelli/XML/doc/Corsi_Regione2010/)