Indice

Logo Ufficio Italiano W3C

Logo CNR

Logo ISTI

 

 

 

 

 

  Valid XHTML 1.1! Valid CSS!

XML

Massimo Martinelli
massimo AT w3c [DOT it

Ufficio Italiano W3C, CNR-ISTI

Area della Ricerca CNR

via Moruzzi, 1

56124 Pisa


logo Rete Telematica Regione Toscana logo Regione Toscana Corso AQUARIUS sulle Tecnologie Web

Firenze 19 Ottobre 2010 - Pisa, 26 Ottobre 2010

Linguaggi di markup S

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.

La pila delle tecnologie W3C

Pila delle tecnologie W3C, vedere http://www.w3.org/Consortium/techstack-desc.html per maggiori dettaglia da Ivan Herman

Standard Industriali

Sanitari
HL7
SNOMED
...
Bancari
FpML
...
...
Chimici
PDX
...
Elettronici
PIPs
RNIF
...

XML

eXtensible Markup Language

  • linguaggio di marcatura (basato su markup) estensibile
  • non ha tag predefiniti, è estensibile: ci consente di definire dei nostri tag
  • metalinguaggio: linguaggio che ha lo scopo di definire nuovi linguaggi
  • realizzato per realizzare, descrivere ed utilizzare documenti strutturati
  • XML 1.0 5a edizione: W3C Recommendation 26 November 2008

XML S

  • "eXtensible Markup Language abbreviato XML, descrive una classe di dati chiamati documenti XML e descrive parzialmente il comportamento dei programmi che li elaborano"
  • è un linguaggio di marcatura (basato su markup) estensibile realizzato per poter utilizzare in modo semplice i documenti strutturati.
    Sviluppato dal W3C, il World Wide Web Consortium
  • Markup (marca, etichetta) : tutto ciò che ha un significato speciale, che deve essere ben caratterizzato, reso esplicito
    anche identificatore, simbolo o altro espediente per distinguere un elemento da altri simili, può indicare l'inizio o la fine di un oggetto
  • Esempi di markup: testo in italico, testo sottolineato
  • In XML tutto ciò che è compreso tra i caratteri "<" e ">" (angled brackets, parentesi angolari)
    è considerato markup, viene detto anche tag (etichetta)
  • Esempio:
    <nome>

Metainformazione

  • A cosa può servirci una metainformazione ?
  • Esempio: cosa rappresenta la seguente informazione ?
    
    150,25 179,111 625,30 580,90 640,130 197,165 223,251 150,200 77,251 103,165 31,111 121,111
        
  • Rappresentazione dell'informazione

I documenti XML

  • contengono dati analizzabili e non analizzabili
  • dati analizzabili: costituiti da caratteri, alcuni dei quali formano i character data, altri i markup
  • Markup: usato per strutturare logicamente il documento
  • XML fornisce un meccanismo per imporre dei vincoli sull'organizzazione di memorizzazione e sulla struttura logica
  • Processore XML: software usato per leggere documenti XML e fornire l'accesso al loro contenuto e alla loro struttura
  • Processore XML lavora per contro di un altro modulo: l'applicazione
  • Specifica XML: descrive comportamento del processore nel leggere i dati XML e informazione che deve fornire all'applicazione

Obiettivi di XML #1 S

Questi gli obiettivi progettuali di XML (tenere di conto che sono stati pensati prima del 96) secondo il W3C XML Working Group:

  • XML deve essere utilizzato in modo semplice su Internet
    Non significa che gli attuali browser possono utilizzare XML, ma si deve tenere in conto la necessità delle applicazioni distribuite che lavorano su reti a larga scala
  • XML deve supportare un gran numero di applicazioni.
    Anche se è nato per la rete (internet) non è limitato a questo ambiente.
    Deve permettere la realizzazione di diversi tipi di applicazioni, dagli strumenti per gli autori di documenti (editori, ...), per i filtri, per motori di formattazione, per traduttori, ...
  • XML deve essere compatibile con SGML.
    I programmi preesistenti per SGML devono essere in grado di leggere e scrivere dati XML.
    Le istanze XML sono documenti SGML, cosi come sono senza modifiche.
    Per qualsiasi documenti XML può essere generata una DTD in modo tale che SGML produrra la stessa analisi che produrrebbe un analizzatore (parser) XML.
    XML dovrebbe avere essenzialmente la stessa potenza espressiva di SGML.
    Questi obiettivi sono stati in gran parte raggiunti.

Obiettivi di XML #2 S

  • Deve essere facile lo sviluppo di programmi che elaborino XML.
    Deve essere semplice creare programmi XML che non dipendano dalla lettura della DTD.
    Un diplomato in informatica deve essere in grado di scrivere in meno di una settimana un programma basilare che processi un file XML.
    Motivazione ovvia: i formati di dati hanno successo o falliscono se abbiamo o non abbiamo a disposizione dei buoni programmi. Se il formato è semplice da processare (analizzare, elaborare) saranno disponibili buoni programmi.
    (a pochi mesi dalla pubblicazione della prima bozza di XML c'erano già a disposizione molti processori freeware di XML, e questo ha messo in evidenza che gli obiettivi erano stati raggiunti in modo qualitativo.)
  • Il numero di caratteristiche opzionali deve essere mantenuto al minimo possibile, idealmente a zero.
    Si riferisce ad SGML, che aveva un numero molto alto di caratteristiche opzionali che rendevano la compliant molto difficile tra parser differenti.
    XML non ha opzioni, tutti i processori XML devono leggere tutti i documenti XML del mondo, presumento che possano decifrare i caratteri
  • I documenti XML dovrebbero essere leggibili da un uomo e ragionevolmente chiari.
    I formati testuali rispetto a quelli binari sono più aperti, più utili e rendono più gradevole il lavoro.
    Uno dei benefici sostanziali di XML è che se il tuo programma un bel giorno non funziona pù è possibile aprirlo con un qualsiasi editore di testi.

Obiettivi di XML #3 S

  1. La progettazione XML dovrebbe essere rapida.
    Per paura che si potessero sviluppare formati di dati proprietari anzichè aperti, binari è testuali
  2. La progettazione XML dovrebbe essere formale e concisa. Fortemente legato al punto 4: un formato di dati è facile da programmare se i programmatori possono leggere e usare i documenti che lo definiscono
    Molti altri standard e specifiche hanno fatto affidamento troppo pesantemente sulla "prosa" e non abbastanza sui formalismi
    La specifica XML è molto formale e concisa e questo ha favorito l'utilizzo
  3. I documenti XML devono essere facili da creare. Non bisogna puntare solo sul fatto che se i documenti sono semplici da realizzare allora questi verranno creati. Deve essere semplice realizzare programmi per la realizzazione di documenti XML (editori)
  4. Non è di nessuna importanza l'economia nel markup XML
    La complessità e la difficolta di usa di SGML è cresciuta a causa dell'uso della minimizzazione, ovvero l'omissione di parti di markup
    In XML ogni volta ci sia un conflitto tra l'essere concisi ed essere chiari deve prevalere la chiarezza

Le componenti di XML

Tre parti fondamentali distinte:

  1. il contenuto
  2. le specifiche relative agli elementi, la struttura (DTD/XML Schema)
  3. le specifiche relative alla rappresentazione, lo stile (Stylesheet)

Il documento XML S

  1. Ciascun documento XML ha una struttura logica e fisica.
  2. Fisicamente, il documento è composto di unità dette entità. Un entità può indirizzare altre entità per includerle nel documento. Un documento inizia con una "radice" o entità documento.
  3. Logicamente, il documento è composto di dichiarazioni, elementi, commenti, riferimenti a caratteri, e istruzioni di elaborazione, ciascuno dei quali è indicato nel documento da espliciti markup. Le struttura logica e quella fisica devono annidarsi propriamente

Come si presenta un documento XML

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.

Prologo

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

Internazionalizzazione S

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

Elementi

Radice (root): elemento che racchiude tutti gli altri


<?xml version="1.0" encoding="utf-8"?>
<anagrafe>
  .  .  .
</anagrafe>

Regole per i tag

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" />

Regole per i tag

I tag devono essere nidificati correttamente

Non permesso

<aa>
      <bb>
</aa>
     </bb>
  

Corretto!

<aa>
     <bb>
     </bb>
</aa>
     

Markup XML

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, ...).

Attributi

   <cie numerocarta="XX123456YY">

Sintassi:

   <elemento attributo="valore">contenuto</elemento>

Quotare gli attributi

Linguaggio

  • Se vogliamo che anche gli altri capiscano il nostro metalinguaggio è necessario stabilire alcune regole:
    • dichiarare che cosa costituisce un markup
    • dichiarare esattamente che cosa significa il nostro markup
  • Un markup language è quindi un insieme di regole
  • Anche HTML è un markup language
  • L'insieme delle regole di (X)HTML è contenuto in un documento, il DTD (X)HTML (Document Type Definition), invisibile all'utente (browser conosce e incorpora vari DTD)

DTD - Document Type Definition

  • Contiene le regole di definizione dei tag
  • Indica gli elementi e il loro ordine all'interno del documento XML
  • Il suo uso non è obbligatorio; ne è consigliato l'utilizzo
  • Può essere interno o esterno al documento XML
  • Il suo nome per convenzione corrisponde a quello dell'elemento radice
  • Struttura gerarchica

Un esempio di DTD

<!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)>

Riferimento a DTD

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">

Dichiarazione di elementi

Successivamente alla dichiarazione DOCTYPE si dichiarano gli elementi

SINTASSI:

   <!ELEMENT nome_elemento   (nomi_degli_elementi_permessi)>

Ordine degli elementi

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.

Occorrenza degli elementi

Elemento		(1)
Elemento ?		(0,1)
Elemento *		(0,1,+)
Elemento +		(1,+)

Elemento1 , Elemento2	(and, stesso ordine)
Elemento1 | Elemento2	(or)

Tipi

<!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

Sezioni CDATA

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)

Attributi

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

  • CDATA (qualsiasi testo)
  • Un insieme ti tipi "tokenized" (ID, IDREF)
  • una lista di valori (tipo enumerato)

Entità

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)*>

Documento ben-formato, valido

Un documento XML si dice "ben formato" quando:

  • contiene almeno un elemento;
  • esiste un tag unico di apertura e di chiusura che contiene l'intero documento; (radice, root)
  • tutti i tag sono nidificati
  • tutte le entità sono dichiarate.

Un documento si dice "valido" quando

  • contiene una DTD e rispetta le regole definite in essa.

Parser

Analizzano i documenti XML, due tipi:

  • Validanti
    consentono di verificare la congruità del documento, la validità rispetto alle regole imposte dalla DTD
  • Non Validanti
    permettono di verificare solo la correttezza formale dei documenti (well-formedness)

Utili entrambi, utilizzo in contesti differenti
(a volte non serve verificare la validità ma solo la correttezza)

Esercizio

Che errori troverebbe un parser validante?

<?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>

Soluzione

<?XML version="1.0" encoding="utf-8"?>
<!DOCTYPE anagrafe SYSTEM "anagrafe.dtd">
<anag>
  <cie numerocarta="1">
  	<nome>Mario Volont&agrave;</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

Esercizio

Scrivere un DTD e una istanza di documento XML conforme relativo ad un elenco di libri o brani musicali

Importanza di XML

- 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)

Riferimenti

  1. http://www.w3.org/XML - la home page di XML sul sito del W3C
  2. http://www.w3.org - La home page del W3C
  3. http://www.w3.org/TR/ - Standard, Draft, Note W3C
  4. http://www.xml.com/axml/testaxml.htm - "The Annotated XML Specification" Tim Bray
  5. http://www.w3c.it - Ufficio Italiano W3C, alcune traduzioni di specifiche
  6. http://www.xml.org
  7. http://www.xml.com
  8. http://www.microsoft.com/xml
  9. http://www.mozilla.org
  10. http://www.netscape.com
  11. http://www.xmlsoftware.com
  12. http://www.isti.cnr.it/People/M.Martinelli/
  13. http://www.isti.cnr.it/People/M.Martinelli/XML/Doc/XML-A_Technical_Introduction.PDF

Limiti del DTD

  • Non supportano i tipi di dato - #PCDATA può essere una qualsiasi stringa di caratteri (esclusi tag)
  • Sintassi differente da quella XML <!ELEMENT nome (#PCDATA)>
  • Non possono esprimere restrizioni specifiche:
    • l'elemento x può occorrere da 5 a 11 volte
    • Il valore dell'elemento y deve essere compreso tra 0 e 10
    • Se il tipo dell'elemento z è "decimal", l'elemento z deve contenere un elemento x
  • Non supportano i namespace
  • Non sono estensibili

XML SCHEMA

  • Un linguaggio potenziato (rispetto alla DTD) per la definizione di vocabolari XML
  • Metodo estensibile per definire il modello dei dati XML
  • Scritta con sintassi XML
  • Sovrainsieme delle funzionalità della DTD
  • Composizione di schemi Importazione di altri schemi
  • Supporta i namespace
  • Grande potenziamento per la specifica di tipi
    • Definizione di elementi, attributi e relazioni (come le DTD)
    • Supporta tipi di dato primitivi: tipi semplici predefiniti (numeri, valori logici, caratteri, ...).
    • Tipi derivati:
      • oggetti costruibili a partire dai primitivi
        "sottoclasse" dei tipi predefiniti tramite definizione di vincoli (range, lunghezza stringa, precisione decimale,...)
      • Tipi complessi: definizione di una informazione contenente sotto-informazioni
  • XML Schema è composto da due parti: strutture e tipi di dato

XML SCHEMA

 

 

 

Dichiarazione <-> Definizione

  • elementi e attributi si dichiarano
    I componenti dichiarati sono presenti in una istanza di documento XML
  • tipi, gruppi di attributi e gruppi di elementi di definiscono
    I componenti definiti non sono presenti nelle istanze di documenti XML

XML SCHEMA

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   . . . dichiarazioni di elementi . . . 
</schema>
  • Tutti gli schemi hanno come elemento radice l'elemento schema
  • schema appartiene all'insieme delle parole chiave che rappresentano i nomi degli elementi e attributi definiti nella specifica XML Schema.
  • Questo insieme è specificato da uno spazio di nomi (namespace, detti anche vocabolari o vocabolari di markup) attraverso la dichiarazione di un attributo la seguente sintassi
    xmlns:prefisso="URIunivoco"
  • Anteponendo il prefisso specificato (avendo dichiarato il namespace) ad un nome di elemento o attributo (o tipo di dato...) dichiariamo che tale nome appartiene specificamente a quello spazio di nomi e non ad altri
  • Nel nostro esempio anteponendo il prefisso xsd ad un nome specificheremo che quest'ultimo appartiene allo spazio di nomi dello Schema XML
  • Attenzione: invece di xsd potevamo indicare un altro prefisso, xsd non identifica per difetto lo spazio di nomi XML Schema)

Namespace - Spazi di nomi

A cosa ci possono servire gli spazi di nomi ?

  • Stesso nome di elemento usato in contesti differenti esempi: <mouse>, <titolo>
  • Fonte di problemi: le persone possono capire dal contesto, ma un programma?
  • Specificare gli spazi di nomi!
  • Esempi
    <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>
  • Recommendation W3C: http://www.w3.org/TR/1999/REC-xml-names-1990114
  • RFC 2396 (URI) : http://www.ietf.org/rfc/rfc2396.txt

Come si riferisce uno schema

<?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>
  • Termine "documento istanza" utilizzato per descrivere un documento che è conforme ad uno specifico schema
  • xsi: noNamespaceSchemaLocation
    Specifica dove si trova lo Schema XML senza namespace specificato per il documento istanza

Come si riferisce uno schema

<?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>
  • Tutti gli elementi in questo documento istanza provengono dal namespace http://www.comune.livorno.it
  • L'attributo schemaLocation che stiamo usando è quello definito dal namespace XMLSchema-instance
  • xsi:schemaLocation indica che il namespace http://www.comune.livorno.it è definito da anagrafe.xsd

schemaLocation

  • XML Schema usa gli attributi schemaLocation e xsi:schemaLocation in tre circostanze.
  1. In un documento istanza: xsi:schemaLocation indica dov'è il documento schema
    • L'attributo schemaLocation contiene una coppia di valori: il namespace e l'indirizzo dove trovare lo schema
    • Non è obbligatorio usare il namespace: l'attributo noNamespaceSchemaLocation è usao per indicare dove si trova lo schema che non ha un namespace target
  2. In uno schema l'elemento include ha un attributo obbligatorio schemaLocation che contiene l'URI che indica dove si trova lo schema
  3. Ancora in uno schema l'elemento import ha un attributo opzionale namespace e uno obbligatorio schemaLocation che contiene l'URI che indica dove si trova lo schema

targetNamespace

Per difetto:

  • elementFormDefault="unqualified"
  • attributeFormDefault="qualified"
targetNamespace=“http://www.comune.livorno.it
schemaLocation=“http://www.comune.livorno.it
Anagrafe.xsd

 

 

Anagrafe.xsd
definisce gli elementi
nel namespace http://www.comune.livorno.it
Anagrafe.xml
- Utilizza tipi, elementi e attributi
dal namespace http://www.comune.livorno.it

 

 

Il documento istanza utilizza il nuovo vocabolario
Uno schema definisce un nuovo vocabolario.

Dichiarazione di elementi semplici

(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

Tipi semplici predefiniti in XML Schema
Tipo SempliceEsempi (delimitati da virgola)
stringTesto di esempio
normalizedStringTesto di esempio
tokenTesto di esempio
base64BinaryGpM7
hexBinary0FB7
integer...-1, 0, 1, ...
positiveInteger1, 2, ...
negativeInteger... -2, -1
nonNegativeInteger0, 1, 2, ...
nonPositiveInteger... -2, -1, 0
long-9223372036854775808, ... -1, 0, 1, ... 9223372036854775807
unsignedLong0, 1, ... 18446744073709551615
int-2147483648, ... -1, 0, 1, ... 2147483647
unsignedInt0, 1, ...4294967295
short-32768, ... -1, 0, 1, ... 32767
unsignedShort0, 1, ... 65535
byte-128, ...-1, 0, 1, ... 127
unsignedByte0, 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
booleantrue, false, 1, 0
durationP1Y2M3DT10H30M12.3S
dateTime1999-05-31T13:20:00.000-05:00
date1999-05-31
time13:20:00.000, 13:20:00.000-05:00
gYear1999
gYearMonth1999-02
gMonth--05
gMonthDay--05-31
gDay---31
NameshipTo
QNamepo:USAddress
NCNameUSAddress
anyURI
http://www.example.com/,
http://www.example.com/doc.html#ID5
languageit, en-GB, en-US, fr
ID
IDREF
IDREFS
ENTITY
ENTITIES
NOTATION
NMTOKEN
US,
Brésil
NMTOKENS
US UK,
Brésil Canada Mexique

Il tipo date

  • Il tipo date va specificato nella forma CCYY-MM-DD
  • CC indica il secolo: valori ammissibili 00-99
  • YY indica l'anno: 00-99
  • MM indica il mese: 01-12
  • DD indica il giorno:
    • 01-28 se mese= 02
    • 01-29 se mese= 02 e anno (gYear) bisestile
    • 01-30 se mese= 04, 06, 09 o 011
    • 01-31 se mese = 01, 03, 05, 07, 08, 10 o 12
  • Esempio: 2003-03-20 equivale al 20 Marzo 2003

Il tipo gYear

  • gYear indica l'anno secondo il calendario Gregoriano
  • Formato: CCYY
    • CC indica il secolo: valori 00-99
    • YY indica l'anno: valori 00-99

Tipi complessi

  • Elementi di tipo semplice, come titolo nel ns. esempio precedente, non possono contenere al loro interno ne attributi ne altri elementi
  • Per poter aggiungere ad un elemento un attributo e/o un insieme di sotto-elementi dobbiamo necessariamente definire l'elemento contenitore di tipo complesso
<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

Occorrenze di elementi

  • Un libro potrebbe essere stato scritto da più di un autore
    <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>
  • unbounded: valore positiveinteger >= minOccurs
  • default: minOccurs = maxOccurs = "1"
  • maggior precisione di quanto non mi permette la DTD
    Esempio: minoccurs="2" maxoccurs="3"
  • Se minOccurs="0" e maxOccurs="0" l'uso dell'elemento è proibito

Valori fissi e per difetto (elementi di tipo semplice)

È 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" />

Uso di attributi

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" />

Occorrenze di attributi

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" />

Vincoli sui tipi semplici (derivazione per restrizione)

  • È possibile definire dei tipi di dato derivandoli dai tipi di dato semplici predefiniti e derivati, restringendone il campo di validità (range).
  • L'elemento simpleType viene usato per definire il nome del tipo derivato.
  • L'elemento restriction indica il tipo base da cui si deriva il nuovo tipo.
  • Esempio: creiamo un nuovo tipo "percentuale" il cui valore può essere compreso tra 0 e 100 (i valori minimo e massimo sono inclusi) derivando dal tipo base "integer"
    <xsd:simpleType name="percentuale">
     	<xsd:restriction base="xsd:integer">
    	    <xsd:minInclusive value="0" />
    	    <xsd:maxInclusive value="100" />
    	</xsd:restriction>
    </xsd:simpleType>
  • Gli elementi minInclusive e maxInclusive sono detti facet (sfaccettature)

Facet (Sfaccettature)

  • Definizione di un nuovo tipo di dato "CodiceType" derivato (per restrizione) dal tipo semplice ID
  • Vincoliamo il valore di questo tipo con una facet chiamato pattern (modello) sulla base dell'espressione "[a-zA-Z]{1}-\d{3}" che si legge 1 lettera compresa tra la a e la z minuscole o tra la A e la Z maiuscole seguita una linea (-) e da da 3 cifre
    <xsd:simpleType name="CodiceType">
      <xsd:restriction base="xsd:ID">
        <xsd:pattern value="[a-zA-Z]{1}-\d{3}"/>
      </xsd:restriction>
    </xsd:simpleType>

Espressioni - Pattern

SIMBOLO Valori possibili
\d numero decimale
\s\w uno spazio seguito da un carattere (word)
&#xF1 ?
\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, ...

Pattern: espressioni equivalenti

  <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)

Facet

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"

Tipi enumerati: enumeration facet

  • Tra i vari facet quello "enumeration" permette di restringere gli elementi di tipo semplice (eccetto il tipo boolean) ad un insieme di valori distinti
  • Esempio di definizione di un nuovo tipo LinguaType derivato dal tipo base string il cui valore deve essere uno dei valori elencati:
    <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>

Trattamento degli spazi (spazi, tabulazioni, e interruzioni di linea)

  • whiteSpace: possibili valori: preserve, replace, collapse
    <xs:element name="programma_sorgente">
    	<xs:simpleType>
    		<xs:restriction base="xs:string">
    			<xs:whiteSpace value="preserve"/>
    		</xs:restriction>
    	</xs:simpleType>
    </xs:element>
  • preserve: il parser XML non rimuoverà alcuno spazio
  • replace: il parser XML sostituirà tutti i caratteri "whitespace"
    (#x9 tab, #xA line feed, #xD carriage return) con spazi (#x20)
  • collapse: il parser sostituira tutti i caratteri "whitespace" con UN SOLO spazio

Derivazione: il tipo lista

È 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

Derivazione: tipo unione

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>

Definizione di tipo anonimo

È 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>

Contenuto misto (mixed)

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>

Contenuto vuoto - anyType - Annotazioni - Definizioni globali e locali di elementi e attributi

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

Costruzione di modelli di contenuto (choice)

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>

Esercizio

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)

Esercizio

Realizzare uno Schema XML per la nostra classe di documenti anagrafe

(trasformare la DTD anagrafe.dtd in schema XML)

Validare il documento

Anagrafe.dtd

<!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)>

Anagrafe.xsd

<?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>

Grazie per l' attenzione

Domande?


Se non è sul Web non esiste ...

... troverete le slide all'indirizzo (http://www1.isti.cnr.it/~Martinelli/XML/doc/Corsi_Regione2010/)