610 likes | 821 Views
DTD & XML Schema. Laurea Magistrale in Informatica Reti 2 (2005/06). dott. Francesco De Angelis francesco.deangelis@unicam.it. Agenda. Document Type Definition XML Schema Namespace. Document Type Definition.
E N D
DTD & XML Schema Laurea Magistrale in Informatica Reti 2 (2005/06) dott. Francesco De Angelis francesco.deangelis@unicam.it
Agenda • Document Type Definition • XML Schema • Namespace DTD & XML Schema
I due diversi livelli di “controllo” del documento generano due livelli di “correttezza”: XML ben formato: XML valido Es: <title><book/><book> Titolo </book></title> è ben formato ma non è tipicamente valido La buona formazione può essere valutata conoscendo solo XML La validazione dipende dalla specifica applicazione XML e cioè dallo specifico linguaggio XML ben formati ed XML validi DTD & XML Schema
La forma di un documento XML • Ogni documento XML inizia con un prologo che contiene: • una XML declaration • eventualmente una Doctype Declaration (la dichiarazione della DTD a cui il documento si riferisce) • eventualmente una serie di processing instruction • Le processing instruction sono utilizzate raramente, servono più che altro per l’aggiunta di fogli di stile <?xml-stylesheet type=“text/css” href=“esempio.css”?> DTD & XML Schema
Dichiarazione XML <?XML version=“1.0” encoding=“UTF-16” standalone=“yes” ?> • Un documento XML può includere una dichiarazione XML. Questa specifica le caratteristiche opzionali del documento in questione. Poiché esse sono ridotte al minimo, la dichiarazione XML è brevissima • La sintassi usata per la dichiarazione XML è quella delle processing instructions • La non obbligatorietà della dichiarazione XML è dovuta a motivi di convenienza, per poter usare la grande quantità di documenti HTML e SGML che sono ben formati senza richiedere modifiche anche stupide. In assenza di dichiarazione XML, si assume la forma: <?XML version=“1.0” ?> DTD & XML Schema
Dichiarazione XML • Esistono esattamente tre valori che possono essere messi in una dichiarazione XML: • Il parametro “version” identifica quale versione di XML si sta usando. Per il momento, l’unico valore possibile è “1.0”. Necessario. • Il parametro “encoding” permette di specificare, se il dubbio può sorgere, quale codifica di caratteri viene usata per il documento. Facoltativo. • Il parametro “standalone” permette di specificare se tutto il contenuto del documento è interno alla risorsa o se ne esiste parte anche all'esterno (ad esempio in un'entità posta nel DTD esterno). Facoltativo. Se è assente è false. DTD & XML Schema
La Document Type Definition • Una DTD è costituita da un elenco di dichiarazioni (markup declaration) che descrivono la struttura del documento • Le dichiarazioni di una DTD definiscono: • gli elementi strutturali (element) di un documento mediante un identificatore generico • il modello di contenuto di ogni elemento (content model) ovvero gli elementi che contiene ed i loro rapporti (un elemento può essere vuoto) • la lista degli attributi associati a ciascun elemento e il loro tipo DTD & XML Schema
La Document Type Definition • XML non fornisce alcun modo per definire la semantica di una DTD • ogni elemento è definito esclusivamente interamente dal suo nome e dal suo contenuto • ogni altra specificazione semantica va fornita mediante documentazione in lingua naturale o in altre notazioni logiche • I DTD XML e SGML sono molto simili. A parte minime modifiche, ogni DTD XML è anche un DTD SGML. DTD & XML Schema
La dichiarazione di tipo • Il <!DOCTYPE … > è la dichiarazione del tipo di documento. Essa permette alle applicazioni XML di determinare le regole sintattiche da applicare alla verifica e validazione del documento. • La dichiarazione non è, ma contiene o fa riferimento alla Document Type Definition, dove vengono elencati gli elementi validi e i loro vincoli. • Il DTD può essere posto in un file esterno, internamente al documento, o in parte esternamente ed in parte internamente. N.B.: In XML il nome del DOCTYPE deve essere il nome del tag radice. DTD & XML Schema
Dichiarazione del DTD: <!DOCTYPE … > • <!DOCTYPE mydoc SYSTEM “document.dtd“> La prima forma di dichiarazione indica che il DTD è contenuto in un file esterno (external subset). • <!DOCTYPE mydoc [ <!ELEMENT …]> La seconda forma precisa il DTD internamente (internal subset). • <!DOCTYPE mydoc SYSTEM “document.dtd” [ <!ELEMENT …]> La terza forma precisa una parte del DTD come contenuta in un file esterno ed una parte come propria del documento. DTD & XML Schema
Tipi di elementi • Il DTD definisce i tipi di elementi che possono occorrere nel file xml • Per ogni tipo di elemento viene indicato il tipo di contenuto, che può essere: • Any content: indica che ogni contenuto è ammissibile.Es: <!ELEMENT memo ANY> • Empty content: un elemento vuoto non può contenere alcun testo tra il tag di inizio e quello di chiusura e può quindi essere rappresentato da un tag vuoto. Es: <!ELEMENT br EMPTY> • Simple content: è un elemento il cui contenuto è composto da testo. In questo caso #PCDATA è acronimo di “Parsed Character Data”.Es: <!ELEMENT message (#PCDATA)> • Element content: è il caso tipico in cui il contenuto è composto da sottoelementi.Es: <!ELEMENT note (to, from, title, message)> • Mixed content: sono elementi che contendono testo misto ad altri elementi DTD & XML Schema
Element content - sequenza • Un elemento composto da una sequenza deve contenere una lista dei sottoelementi elencati, con un elemento per ogni tipo • I singoli sottoelementi sono divisi da virgole DTD & XML Schema
Element content - alternativa • Indica che il contenuto deve essere uno tra quelli elencati • I singoli sottoelementi sono divisi da barre verticali (l’or del C) DTD & XML Schema
Element content - ripetizione • E’ possibile definire in vari modi le cardinalità dei sottoelementi: • Nessuna specifica: l’argomento deve comparire esattamente una volta<!ELEMENT a (b)> è permesso solo <a><b/></a> • ?: opzione. Specifica che il sottoelemento è facoltativo<!ELEMENT a (b?)> sono leciti sia <a/> che <a><b/></a> • +: ripetizione. Il sottoelemento deve figurare una o più volte<!ELEMENT a (b+)> <a><b/></a>, <a><b/><b/></a>, ecc... • *: ripetizione. Il sottoelemento può figurare un numero qualsiasi di volte, o anche non figurare affatto<!ELEMENT a (b*)> <a/>, <a><b/></a>, <a><b/><b/></a>, ecc... DTD & XML Schema
Element content complessi • I costrutti possono combinarsi dando origine ad espressioni regolari • <!ELEMENT sezione (titolo, abstract?, para+)>ogni sezione ha un titolo, può avere un abstract opzionale, seguito da almeno un paragrafo • <!ELEMENT sezione (titolo, (abstract | para)+)>Dentro all’elemento sezione ci deve essere un titolo, seguito da almeno un abstract o un para, che poi possono ripetersi in qualunque ordine e numero • <!ELEMENT sezione (titolo, abstract*, para+)>Ogni elemento sezione è composto da un titolo, da una sequenza opzionale di abstract e da una sequenza si para composta da almeno un para • <!ELEMENT sezione (titolo, (sottotitolo | abstract)?, para+)>Ogni sezione è data da un titolo, da uno tra sottotitolo ed abstract, che possono però anche mancarem e da una serie di para • <!ELEMENT sezione (titolo, sottotitolo?, abstract?, para+>Come sopra, ma sottotitolo ed abstract possono coesistere DTD & XML Schema
Contenuto misto • In XML il contenuto di testo #PCDATA ed il contenuto di elementi possono combinarsi solo nella forma seguente:<!ELEMENT para (#PCDATA | bold | italic)*> • Ogni paragrafo contiene un testo in cui si possono trovare, opzionalmente, degli elementi <bold> ed <italic>. Es: <para> <bold>Questo</bold> testo contiene delle sezioni in <bold>grassetto</bold> ed in <italic>corsivo</italic>, ma potrebbe anche non averne</para> DTD & XML Schema
Attributi • Il DTD permette anche di vincolare gli attributi dei singoli tag, cioè dei singoli elementi. • In generale gli attributi vengono specificati con ATTLIST:<!ATTLIST elemento attributo1 tipo1 modificatore1 attributo2 tipo2 modificatore2 attributo-n tipo-n modificatore-n> • I tipi definiscono l’insieme o la tipologia dei valori assumibili dall’attributo • I modificatori identificano le condizioni di obbligatorietà o opzionalità dell’attributo ed, eventualmente, un valore di default per lo stesso DTD & XML Schema
Attributi stringa <!ATTLIST message lang CDATA “Italiano”> • In questo caso l’attributo lang è una stringa • Se l’attributo è presente nel file il suo valore è quello specificato • Altrimenti viene assunto il valore di default “Italiano” <note> … <message lang=“English”> Remember the meeting </message> </note> <note> … <message> Ricordati l’appuntamento </message> </note> DTD & XML Schema
Attributi per enumerazione <!ATTLIST person salutation (Mr | Mrs | Miss | Dr) “Mr”> • Il titolo di ogni persona assume valori nell’insieme indicato • In mancanza del parametro si assume per default “Mr” <person salutation=“Dr”> <name>Luke</name> <surname>Brown</name> </person> DTD & XML Schema
Tipi di attributi predefiniti • DTD definisce alcuni tipi speciali, che aiutano il progettista soprattutto per quanto riguarda le relazioni tra elementi • ID: identificativo univoco all’interno del file <!ATTLIST User login ID #REQUIRED> • IDREF: riferimento ad un identificativo univoco definito nel file <!ATTLIST User userClass IDREF #REQUIRED> • IDREFS: come IDREF, ma può esserci una lista di riferimenti • NMTOKEN o NMTOKENS: stringa (o lista di stringhe) di caratteri senza spazi o caratteri di interpunzione • ENTITY o ENTITIES: il valore deve essere un’entità DTD & XML Schema
Modificatori • Valore di default: espresso da una stringa indica il valore da assegnare all’attributo in mancanza di diverse indicazioni • Valore fisso: definito da #FIXED più il valore. L’attributo assume obbligatoriamente il valore assegnato e l’autore del documento XML non può modificarlo:<!ATTLIST persona numeroGambe CDATA #FIXED “2”> • Specifica di obbligatorietà: #REQUIRED. Indica che l’attributo deve essere sempre presente in ogni elemento<!ATTLIST misura val CDATA #REQUIRED> • Specifica di opzionalità: #IMPLIED. Indica che l’attributo è opzionale e può non essere specificato dall’autore del documento. Se combinato con ID indica che il sistema genererà un identificativo automaticamente DTD & XML Schema
Entità • Le entità del DTD sono frammenti ricorrenti di contenuti testuali a cui vengono associati degli identificatori che possono essere “espansi” come macro all’interno del documento prima di procedere al parsing vero e proprio • La definizione avviene secondo lo schema: <!ENTITY nomeEntità valore> • L’utilizzo avviene inserendo nel testo la sequenza: &nomeEntità; • Esempio: <!ENTITY autore “Francesco De Angelis”> <document><title>Introduzione ad XML</title><author>&autore;</author> </document> DTD & XML Schema
Entità esterne • Le entità esterne vengono “recuperate” da un file esterno all’XML <!ENTITY nomeEntità SYSTEM “url del file”> • Es: <!ENTITY text SYSTEM “book.txt”> • E’ possibile specificare entità da non parsare, tipicamente come entità di dati binari <!ENTITY immagine SYSTEM “img.gif” NDATA gif> <book> <title>..</title> <text>&text;</text> </book> DTD & XML Schema
Entità predefinite • Sono predefinire tutte le entità associabili ai singoli caratteri sulla base del codice (unicode) degli stessi. Ad esempio l’entità corrisponde al carattere ASCII 10. • Alcuni caratteri, tra cui ‘<‘ ed ‘&’, creano problemi quando vengono mischiati al testo. Per questo sono predefinire alcune entità che possono sostituire questi caratteri: • Equivalente a : <![CDATA [<]]> DTD & XML Schema
Entità parametriche • Sono entità definite nel DTD ed utilizzate all’interno del DTD stesso • Vengono sostituite durante la lettura del DTD • Contengono frammenti ricorrenti del modello di contenuto • Es: volendo definire in un unico punto il tipo di testo che contiene sezioni in grassetto: <!ENTITY % testo “#PCDATA”> <!ENTITY % testoConBold “(%testo;|bold)*”> <!ELEMENT testo %testoConBold;> DTD & XML Schema
Cosa c’è di sbagliato nelle DTD • Troppo “document oriented” • DTD è stato sviluppato per interfacciarsi con tool per il trattamento del testo • Limitato nella rappresentazione di strutture complesse • Non c’è la nozione di ereditarietà/sub-typing • Content-model ambiguo • Troppi modi per rappresentare la stessa cosa • I nomi sono globali, non locali DTD & XML Schema
Utilizzo delle DTD • Validazione • Storage XML efficiente (persistenza, estensione, o database storage) • Documentazione • Parsing efficiente • Design di tool di supporto DTD & XML Schema
XML Schema • “Schema” è un termine generale, dal vocabolario inglese: “a structured framework or plan” • Quando si parla di “XML Schema” si intende usualmente il W3C XML Schema Language • … e il suo acronimo XSD • DTD, XML Schema, e RELAX NG sono tutti linguaggi di “schema” XML DTD & XML Schema
Perchè XML Schema? • DTD fornisce specifiche deboli • Nessuna restrizione sul contenuto del testo • Poco controllo sui contenuti misti (mixed content, text + elements) • Poco controllo sull’ordinamento degli elementi • DTD è scritto in un formato non-XML • Parser separati per DTD e XML • XML Schema Definition Language risolve questi problemi • Più controllo su strutture e contenuti • XSD è scritto in XML DTD & XML Schema
Riferirsi ad uno schema • Per la DTD il riferimento va prima del root element: <?xml version="1.0"?> <!DOCTYPE rootElement SYSTEM "url"> <rootElement> ... </rootElement> • Per l’XML Schema il riferimento va nel root element: <?xml version="1.0"?> <rootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"(riferimeno richiesto a XML Schema Instance) xsi:noNamespaceSchemaLocation="url.xsd">(dove trovare lo Schema definition voluto) ... </rootElement> DTD & XML Schema
Il documento XSD: “lo schema” • L’estensione è .xsd • L’elemento root è <schema> • Il documento XSD parte con: <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.rg/2001/XMLSchema"> Attenzione: documento XSD stesso è scritto in XML DTD & XML Schema
<schema> • L’elemento <schema> può avere attributi: • xmlns:xs="http://www.w3.org/2001/XMLSchema" • Specifica dove i tag dello schema sono specificati • elementFormDefault="qualified" • Tutti gli elementi devono essere qualificati da un namespace • È altamente desiderabile qualificare ogni tag DTD & XML Schema
Elementi “semplici” e “complessi” • Un elemento semplice contiene solo testo • Non ha attributi • Non contiene altri elementi • Non può essere vuoto • Ci possono essere varie restrizioni applicate al contenuto • Un elemento complesso • Può avere attributi • Può essere vuoto, contenere testo, altri elementi, o sia testo che altri elementi. DTD & XML Schema
Definire un elemento semplice • Un elemento semplice è definito come: <xs:element name="name” type="type” /> dove: • name è il nome dell’elemento • Valori comuni per type sono xs:boolean xs:integer xs:date xs:string xs:decimal xs:time • Altri attributi di element sono: • default="default value” se non ci sono altri valori specificati • fixed="value" nessun altro valore specificato DTD & XML Schema
Definire un attributo • Gli attributi sono dichiarati sempre come tipi semplici • Definito come <xs:attribute name="name” type="type” /> dove: • name e type sono gli stessi che perxs:element • Altri attributi che gli elementi semplici possono avere: • default="defaultvalue" se nessun valore è specificato • fixed="value”nessun altro valore può essere specificato • use="optional" non richiesto (default) • use="required"richiesto DTD & XML Schema
Restrizioni, o “facets” • La forma generale delle restrizioni è: <xs:element name="name"> (o xs:attribute) <xs:restriction base="type">... the restrictions ... </xs:restriction></xs:element> • Ad esempio: <xs:element name="age"> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"> <xs:maxInclusive value="140"> </xs:restriction></xs:element> DTD & XML Schema
Restrizioni su numeri • minInclusive -- numero deve essere ≥ di value • minExclusive -- numero deve essere > di value • maxInclusive -- numero deve essere ≤ di value • maxExclusive -- numero deve essere < di value • totalDigits -- numero deve avere valuecifre • fractionDigits -- numero deve avere non più di valuecifre dopo il punto decimale DTD & XML Schema
Restrizioni su stringhe • length -- la stringa deve contenere valuecaratteri • minLength -- la stringa deve contenere almeno valuecaratteri • maxLength -- la stringa deve contenere non più di valuecaratteri • pattern -- valueè una espressione regolare da soddisfare • whiteSpace -- dice come trattare gli spazi bianchi • value="preserve" li mantiene • value="replace" rinpiazza con “spazi” • value="collapse" rimuove gli spazi iniziali, finali e rimpiazza le sequenze con uno spazio singolo DTD & XML Schema
Enumerazioni • Restringe il range di possibili valori ad una loro enumerazione • Esempio: <xs:element name="season"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Spring"/> <xs:enumeration value="Summer"/> <xs:enumeration value="Autumn"/> <xs:enumeration value="Fall"/> <xs:enumeration value="Winter"/> </xs:restriction> </xs:simpleType></xs:element> DTD & XML Schema
Elementi Complessi • Un elemento complesso è definito da: <xs:element name="name"> <xs:complexType>... information about the complex type... </xs:complexType> </xs:element> • Esempio: <xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstName" type="xs:string" /> <xs:element name="lastName" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> DTD & XML Schema
Definizioni locali e globali • Elementi di chiarati al “top level” dello <schema> sono disponibili per l’uso in tutto lo schema • Elementi dichiarati in un xs:complexType sono locali • Così, in <xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstName" type="xs:string" /> <xs:element name="lastName" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> Gli elementi firstName e lastName sono dichiarati solo localmente • L’ordine delle dichiarazioni nel “top level” dello <schema>non specifica l’ordine di apparizione nel documento che usa tale schema DTD & XML Schema
Dichiarazione ed uso • Per sfruttare un tipo lo si usa in type="..." • Esempi: • <xs:element name="student" type="person"/> • <xs:element name="professor" type="person"/> • Lo scope (visibilità) è importante: non si può usare un tipo al di fuori del suo scope DTD & XML Schema
xs:sequence • Consente di specificare l’ordine di apparizione degli elementi <xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstName" type="xs:string" /> <xs:element name="lastName" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> DTD & XML Schema
xs:all • xs:all consente l’apparizione in qualsiasi ordine <xs:element name="person"> <xs:complexType> <xs:all> <xs:element name="firstName" type="xs:string" /> <xs:element name="lastName" type="xs:string" /></xs:all> </xs:complexType> </xs:element> • A dispetto del nome i membri del gruppo xs:all possono occorrere una sola volta o per niente • Si può usareminOccurs="0"per specificare che un elemento è opzionale (il valore di default è 1) • In questo contesto, maxOccurs è sempre 1 DTD & XML Schema
<xs:choice> • Definisce un insieme di elementi tra cui effettuare una scelta <xs:element name="person"> <xs:complexType> <xs:choice> <xs:element name="firstName" type="xs:string" /> <xs:element name=“surName" type="xs:string" /></xs:choice> </xs:complexType> </xs:element> DTD & XML Schema
Riferimenti • Dopo avere definito elementi con name="...", si può far loro riferimento con ref="..." • Esempi: • <xs:element name="person"> <xs:complexType> <xs:all><xs:element name="firstName" type="xs:string" /> <xs:element name="lastName" type="xs:string" /></xs:all></xs:complexType> </xs:element> <xs:element name="student" ref="person"> Oppure<xs:element ref="person"> DTD & XML Schema
Elementi misti • Elementi misti possono contenere sia testo che altri elementi • Attributo mixed = "true” sull’elemento xs:complexType • Il testo stesso non è menzionato nell’elemento e può essere messo dove si vuole <xs:complexType name= "paragraph” mixed="true"> <xs:sequence> <xs:element name= "someName” type= "xs:anyType"/> </xs:sequence></xs:complexType> DTD & XML Schema
Estensioni • Un tipo complesso può essere la base di un nuovo tipo <xs:complexType name="newType"> <xs:complexContent> <xs:extension base="otherType">...new stuff... </xs:extension> </xs:complexContent></xs:complexType> DTD & XML Schema