Sei sulla pagina 1di 253

HTML.

it - XML

XML da anni fa parlare di s come il linguaggio di Markup destinato a sostituire l'HTML. Questa sezione fornisce strumenti per imparare da zero XML (attraverso il corso) e per approfondirne la conoscenza (attraverso i tutorial). Corso XML
Questa guida, curata da Marco Giann, introduce, in 70 lezioni corredate da esempi pratici, alle caratteristiche principali di XML. Dall'introduzione al linguaggio al suo utilizzo pratico. Questo corso, completamente in italiano e di facile comprensione, il primo passo per chi non ha alcuna conoscenza di XML.

Tutorial XML-DOM
Con XML possibile avere un'unica piattaforma di sviluppo per scambiarsi ed elaborare i dati provenienti da varie fonti. Il Tutorial di Enrico Modanese per HTML.it vi condurr all'elaborazione e alla scrittura di strumenti che utilizzano Javascript, XML e la standard DOM per accedere ai documenti XML e manipolarli.

http://www.html.it/xml/index.html [19/06/2001 14.08.45]

HTML.it - Corso gratuito su XML

di Marco Giann marco@ragusaonline.com

Questa guida, curata da Marco Giann, introduce, in 70 lezioni corredate da esempi pratici, alle caratteristiche principali di XML. Dall'introduzione al linguaggio al suo utilizzo pratico. Questo corso, completamente in italiano e di facile comprensione, il primo passo per chi non ha alcuna conoscenza di XML.

Percorso consigliato: apprendisti Livello di difficolt:

INTRODUZIONE CAPITOLO 1 1. Limportanza dellXML 1.1 Origine e obiettivi 1.2 Relazioni tra XML e altri linguaggi 1.2.1 Relazione tra XML e SGML 1.2.2 Relazione tra XML e HTML 1.3 Le propriet dellXML 1.4 LXML e il Web 1.4.1 Database eterogenei 1.4.2 Processi distribuiti 1.4.3 Viste differenti 1.4.4 Motori di ricerca CAPITOLO 2 2. STRUTTURA E SINTASSI 2.1 Struttura logica del linguaggio XML 2.2 Struttura fisica del linguaggio XML 2.3 Sintassi XML 2.3.1 Apertura e chiusura dei tag 2.3.2 Attributi 2.4 Documenti XML validi e ben formati 2.4.1 Documenti validi 2.4.2 Documenti ben formati CAPITOLO 3

http://www.html.it/xml/guida/index.html (1 di 3) [19/06/2001 14.08.53]

HTML.it - Corso gratuito su XML

3. DEFINIZIONE DEL TIPO DI DOCUMENTO (DTD) 3.1 Struttura della DTD 3.2 Creazione di una DTD semplice 3.3 Dichiarazioni di elementi 3.4 Tipi di Dati 3.5 Simboli relativi alla struttura 3.6 Attributi 3.7 Entit 3.8 Le parole chiave IGNORE e INCLUDE 3.9 Istruzioni di elaborazione. 3.10 Commenti 3.11 DTD esterne 3.12 Vocabolari 3.13 Spazi dei nomi XML (XML Namespace) 3.13.1 Creazione di nomi univoci tramite gli spazi dei nomi XML CAPITOLO 4 4. AMPLIARE I DOCUMENTI XML 4.1 XSL: lXML con i fogli di stile 4.1.1 Nozioni fondamentali sul linguaggio XSL 4.1.2 Componenti del linguaggio XSL 4.1.3 Fogli di stile XSL 4.1.4 Utilizzo dei modelli 4.1.5 Visualizzazione degli elementi di output 4.1.6 Estrazione dei dati dallXML 4.2 XLL: Collegamenti con il linguaggio XML 4.2.1 XLink: il sistema per i collegamenti XML 4.2.2 Collegamenti semplici nellXML 4.2.3 Collegamenti estesi nellXML 4.3 XPOINTER 4.3.1 Concetti fondamentali relativi al linguaggio XPointer 4.4 XML-Data 4.4.1 Gli obiettivi di XML-Data 4.4.2 Linguaggio schema XML-Data 4.4.3 Struttura del documento dello schema 4.4.4 Dichiarazioni del tipo di elemento

http://www.html.it/xml/guida/index.html (2 di 3) [19/06/2001 14.08.53]

HTML.it - Corso gratuito su XML

4.4.5 Dichiarazioni del tipo di attributo 4.4.6 Tipi di dati 4.4.7 Funzionamento degli schemi (esempio file xml/xsl) CAPITOLO 5 5. Applicazioni dellXML 5.1 Channel Definition Format (CDF) 5.1.1 Webcasting (tecnologia push) 5.1.2 Struttura di un file CDF 5.1.3 Utilizzo del file CDF 5.1.4 Esempio di un canale 5.2 Synchronized Multimedia Integration Language (SMIL) 5.2.1 Struttura di SMIL 5.2.2 Stile parallelo 5.2.3 Stile in sequenza 5.2.4 Specifiche dellimpostazione 5.2.5 Switching 5.2.6 Esempio SMIL (esempio file smil) Conclusioni Appendice A Strumenti software A.1 Il processore XML A.2 Il parser Msxml A.3 Panorama del software A.4 Esempio di file XML (esempio file xml/xsl) Bibliografia

http://www.html.it/xml/guida/index.html (3 di 3) [19/06/2001 14.08.53]

XML: Introduzione all'XML - Introduzione

Introduzione all'XMLIntroduzione
LHTML (Hypertext Markup Language) considerato la base del World Wide Web. Questo linguaggio consente infatti di creare in maniera standardizzata pagine di informazioni formattate in grado di raggiungere, tramite Internet, un numero di utenti in costante aumento. Insieme al protocollo HTTP (Hypertext Transport Protocol), lHTML ha rivoluzionato il modo in cui le persone inviano e ricevono informazioni, ma lo scopo principale per cui stato realizzato la visualizzazione dei dati. Per questo motivo, lHTML prende in considerazione soprattutto il modo in cui le informazioni vengono presentate e non il tipo o la struttura di tali informazioni, aspetti per i quali stato sviluppato il linguaggio XML (eXtensible Markup Language). La necessit di espandere le capacit di HTML ha spinto i produttori di browser a introdurre nuovi marcatori nella sintassi, rendendola a tutti gli effetti proprietaria e non pi standard. Da ci segue che una pagina HTML che sfrutti marcatori proprietari non pu essere visualizzata correttamente se non con il browser adatto, con le ovvie conseguenze che ne derivano. LXML un linguaggio di markup aperto e basato su testo che fornisce informazioni di tipo strutturale e semantico relative ai dati veri e propri. Questi "dati sui dati", o metadati, offrono un contesto aggiuntivo allapplicazione che utilizza i dati e consente un nuovo livello di gestione e manipolazione delle informazioni basate su Web. LXML, derivazione del noto linguaggio SGML (Standard Generalized Markup Language), stato ottimizzato per il Web, diventando potente complemento dellHTML basato su standard. Limportanza dellXML nel futuro delle informazioni sul Web potrebbe pertanto giungere ad eguagliare quella dellHTML agli albori.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/introdu.htm [19/06/2001 14.09.05]

XML: Capitolo I: L'importanza dell'XML - Origine e obiettivi

Origine e obiettivi
LExtensible Markup Language (XML) un metalinguaggio che permette di creare dei linguaggi personalizzati di markup; nasce dallesigenza di portare nel World Wide Web lo Standard Generalized Markup Language (SGML), lo standard internazionale per la descrizione della struttura e del contenuto di documenti elettronici di qualsiasi tipo; ne contiene quindi tutta la potenza, ma non tutte le complesse funzioni raramente utilizzate. Si caratterizza per la semplicit con cui possibile scrivere documenti, condividerli e trasmetterli nel Web. Lutilizzo di XML permette di superare il grosso limite attuale del Web, che quello della dipendenza da un tipo di documento HTML, singolo e non estensibile. Questo linguaggio nato per permettere agli utenti del World Wide Web di condividere le informazioni su sistemi differenti; il presupposto era che quelle informazioni fossero testo con al pi alcune immagini e collegamenti ipertestuali. Attualmente per, le informazioni sul World Wide Web sono database di testo, immagini, suoni, video, audio. Quindi lHTML stato chiamato sempre pi di frequente a fornire soluzioni a problemi che non aveva lo scopo di risolvere, come dover descrivere tipi differenti e specifici di informazioni, definire relazioni complesse di collegamenti fra documenti, trasmettere informazioni in diversi formati. Per superare questi problemi, sono state create delle estensioni dellHTML, spesso fra loro incompatibili. LXML permette a gruppi di persone o ad organizzazioni di creare il proprio linguaggio di markup, specifico per il tipo di informazione che trattano; per molte applicazioni e per diversi settori, gli esperti hanno gi creato linguaggi di markup specifici, come ad esempio il Channel Definition Format, il Mathematical Markup Language ed altri (Fig. 1.1).

Fig. 1.1: LXML permette di scrivere linguaggi di markup XML fu sviluppato da XML Working Group (originariamente noto come SGML Editorial Review Board) costituitosi sotto gli auspici del World Wide Web Consortium (W3C) nel 1996. Esso era presieduto da Jon Bosak della Sun Microsystems con la partecipazione attiva dellXML Special Interest Group (precedentemente noto come SGML Working Group) anchesso organizzato dal W3C. Lobiettivo di questo gruppo di lavoro era di portare il linguaggio SGML nel Web. LSGML un linguaggio per la specifica dei linguaggi di markup ed il genitore del

http://www.html.it/xml/guida/origine.htm (1 di 2) [19/06/2001 14.09.15]

XML: Capitolo I: L'importanza dell'XML - Origine e obiettivi

ben noto HTML. La progettazione dellXML venne eseguita esaminando i punti di forza e di debolezza dellSGML. Il risultato uno standard per i linguaggi di markup che contiene tutta la potenza dellSGML ma non tutte le funzioni complesse e raramente utilizzate. LXML venne mostrato per la prima volta al pubblico quando lSGML celebr il suo decimo anno. Gli obiettivi progettuali di XML sono:

1. XML deve essere utilizzabile in modo semplice su Internet: in primo luogo,


lXML deve operare in maniera efficiente su Internet e soddisfare le esigenze delle applicazioni eseguite in un ambiente di rete distribuito.

2. XML deve supportare un gran numero di applicazioni: deve essere


possibile utilizzare lXML con unampia gamma di applicazioni, tra cui strumenti di creazione, motori per la visualizzazione di contenuti, strumenti di traduzione e applicazioni di database.

3. XML deve essere compatibile con SGML: questo obiettivo stato definito
sulla base del presupposto che un documento XML valido debba anche essere un documento SGML valido, in modo tale che gli strumenti SGML esistenti possano essere utilizzati con lXML e siano in grado di analizzare il codice XML. 4. Deve essere facile lo sviluppo di programmi che elaborino documenti XML: ladozione del linguaggio proporzionale alla disponibilit di strumenti e la proliferazione di questi la dimostrazione che questo obiettivo stato raggiunto. 5. Il numero di caratteristiche opzionali deve essere mantenuto al minimo possibile: al contrario dellSGML, lXML elimina le opzioni, in tal modo qualsiasi elaboratore potr pertanto analizzare qualunque documento XML, indipendentemente dai dati e dalla struttura contenuti nel documento. 6. I documenti XML dovrebbero essere leggibili da un utente e ragionevolmente chiari: poich utilizza il testo normale per descrivere i dati e le relazioni tra i dati, lXML pi semplice da utilizzare e da leggere del formato binario che esegue la stessa operazione; inoltre poich il codice formattato in modo diretto, utile che lXML sia facilmente leggibile da parte sia degli utenti che dei computer.

7. La progettazione di XML dovrebbe essere rapida: lXML stato sviluppato


per soddisfare lesigenza di un linguaggio estensibile per il Web. Questo obiettivo stato definito dopo aver considerato leventualit che se lXML non fosse stato reso disponibile rapidamente come metodo per estendere lHTML, altre organizzazioni avrebbero potuto provvedere a fornire una soluzione proprietaria, binaria o entrambe.

8. La progettazione di XML deve essere formale e concisa: questo obiettivo


deriva dallesigenza di rendere il linguaggio il pi possibile conciso, formalizzando la formulazione della specifica.

9. I documenti XML devono essere facili da creare: i documenti XML possono


essere creati facendo ricorso a strumenti di semplice utilizzo, quali editor di testo normale.

10. Non di nessuna importanza leconomicit nel markup XML: nellSGML e


nellHTML la presenza di un tag di apertura sufficiente per segnalare che lelemento precedente deve essere chiuso. Bench cos sia possibile ridurre il lavoro degli autori, questa soluzione potrebbe essere fonte di confusione per i lettori, nellXML la chiarezza ha in ogni caso la precedenza sulla concisione.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/origine.htm (2 di 2) [19/06/2001 14.09.15]

XML: Capitolo I: L'importanza dell'XML - Relazione tra XML e SGML

Relazione tra XML e SGML


SGML un meta-linguaggio, ovvero un insieme di regole generalizzate usate per creare molteplici linguaggi speciali che prendono il nome di markup language. Le applicazioni pi note di SGML sono HTML, TIM (Telecommunication Interchange Markup); inoltre SGML viene largamente usato dalle grandi industrie di tecnologia come strumento di immagazzinamento e scambio di informazioni di qualsiasi tipo. E' poi utilizzato in tipografia (ad esempio nella stampa delle delibere) per creare il documento che poi le macchine tipografiche andranno a stampare secondo la loro interpretazione specifica delle strutture SGML. LSGML stesso non ha mai suscitato particolare interesse tra gli sviluppatori Web, probabilmente a causa soprattutto della sua complessit e delle difficolt che lutilizzo di questo linguaggio comporta. Lobiettivo era di includere nellXML, solo le parti dellSGML necessarie per la pubblicazione sul Web. XML eredita da SGML la capacit di definire con estrema facilit nuovi marcatori, creando di fatto dei linguaggi di markup personalizzati, mentre la complessit e le caratteristiche opzionali che appesantivano lSGML sono state pertanto eliminate dallXML. Pregi di SGML : La sua potenza la flessibilit. E' uno standard (ISO 8879:1986) che pu essere applicato ad ogni tipo dato; espandibile ed fortemente strutturato. Queste caratteristiche lo rendono capace di risolvere problemi di elaborazione dell'informazione tra i pi complessi, garantendo un perfetto riutilizzo dei dati. Inoltre non-proprietario ed indipendente dalla piattaforma. Limiti di SGML : Ha una struttura molto pesante, comprensiva di un gran numero di opzioni che lo rendono poco maneggevole da un eventuale software di manipolazione dei dati, quindi pu rappresentare un grosso scoglio per i programmatori che lavorano sul Web. Comunque sia il problema pi importante che SGML richiede un DTD (Document Type Definition) per l'identificazione di tutte le relazioni tra le entit che compongono il documento SGML, e di uno Style-Sheet cio un foglio di stile che stabilisce il modo di rappresentare e/o visualizzare i dati e le strutture definite nel DTD. Inoltre ogni documento SGML deve necessariamente essere validato e quindi oltre ad un controllo sintattico viene controllata anche la semantica delle strutture di dati presenti nel documento (ad esempio non potr succedere che un titolo di capitolo viene dopo il relativo sottotitolo). Si capisce quindi che in mancanza di uno di questi elementi, o in caso di corruzione dei dati, le istanze SGML saranno visualizzate come codice incomprensibile per l'utente finale. Il risultato di queste considerazioni che per le applicazioni sul World Wide Web (WWW) le istanze SGML non sono praticamente portabili data la loro intrinseca pesantezza e non robustezza.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/sgml.htm [19/06/2001 14.09.20]

XML: Capitolo I: L'importanza dell'XML - Relazione tra XML e HTML

Relazione tra XML e HTML


LXML spesso considerato una sostituzione dellHTML. Sebbene questo possa essere in parte vero, in realt i due linguaggi sono complementari e, relativamente al modo in cui vengono trattati i dati, operano su livelli differenti. Nei casi in cui lXML viene utilizzato per strutturare e descrivere i dati sul Web, lHTML usato per formattare i dati. Pregi di HTML : Data la semplicit della struttura dei documenti HTML, rappresenta un veloce strumento per lo scambio delle informazioni sul Web. Le istanze HTML non devono essere validate ma sufficiente che siano "ben formate", ovvero sintatticamente corrette. Il modo con cui viene visualizzato il documento dipende dallo Style-Sheet del browser stesso. Limiti di HTML : I limiti di HTML discendono proprio dai suoi pregi e sono dovuti soprattutto ad un uso distorto di questo strumento. Dal momento che non richiesta una strutturazione semanticamente corretta delle informazioni, HTML diventa molto povero per le applicazioni di elaborazione dei dati, quindi il problema viene completamente demandato agli applicativi scritti in Java, Java Script, ecc. La sua struttura non estensibile e questo lo rende praticamente inutilizzabile per le industrie che si sono viste costrette a crearsi standards differenti per ogni diversa applicazione, ed ancora una volta compito del software elaborare i dati per il trasferimento delle informazioni sul Web. Un altro problema da non sottovalutare si pu verificare dalla parte del client qualora non abbia un dispositivo video del tipo previsto dal server (per esempio dispositivi per il braille o monitor non grafici). Inoltre lHTML non offre i meccanismi per mantenere il controllo della formattazione. Infatti non si possono specificare le dimensioni video di un documento o controllare le dimensioni della finestra di un browser. Per superare questo problema sono stati inseriti nuovi tag e i fogli di stile; i nuovi tag forniscono istruzioni di formattazione come ad esempio il tag <FONT> per specificare il tipo di carattere; gli utenti per, possono ignorare queste specifiche e utilizzare le loro; inoltre questi tag sono di formattazione e non di descrizione (come dovrebbero essere essendo lHTML un linguaggio di descrizione del documento). Tutto questo fa s che uno sviluppatore di pagine Web non sappia mai con certezza cosa un client visualizzer sullo schermo del computer. Il W3C (ente guida per lo sviluppo del Web), si rese conto che la creazione di una moltitudine di nuovi tag che rispondessero a ogni possibile esigenza di formattazione era irrealistica ed incoerente con i principi ed i concetti dellHTML; vennero quindi introdotti i CSS (Cascading Style Sheet) che permettono attraverso le norme di stile di definire come devono apparire determinati elementi di un documento; anche con i CSS per, si deve scegliere fra un assortimento di propriet predefinite. Bisogna anche specificare che lasciare al browser la decisione di come presentare un documento, fu esplicitamente voluto come impostazione del progetto HTML (infatti come si gi detto un linguaggio di descrizione del documento). Il browser conosce le preferenze degli utenti e soprattutto lambiente in cui si trova ad operare; tutte informazioni che logicamente lautore di un documento HTML non conosce (a parte pochi casi, come un ambiente intranet omogeneo). Il poter decidere come visualizzare un documento molto utile ad esempio quando un utente non dispone di un browser grafico, oppure per utenti che hanno problemi di vista e hanno bisogno di caratteri molto grandi, oppure addirittura per utenti non vedenti. Sfortunatamente, le case produttrici di browser, non hanno capito la filosofia di base dellHTML; il risultato di questo che allo stato attuale un numero enorme di pagine sul Web, contengono insiemi di tag specifici per determinati browser, e anche per determinate versioni dello stesso browser; queste pagine sono molto spesso illeggibili. Gradualmente lHTML sta passando da un linguaggio di descrizione, ad un linguaggio di presentazione, con tutti i problemi qui descritti; lXML pu fornire una soluzione, fornendo un layout a

http://www.html.it/xml/guida/rel.htm (1 di 2) [19/06/2001 14.09.24]

XML: Capitolo I: L'importanza dell'XML - Relazione tra XML e HTML

chiunque e indipendentemente dal browser utilizzato, attraverso lutilizzo dellExstensible Style Language (XSL), che diventer uno standard universalmente accettato. LXML si differenzia dallHTML per tre maggiori aspetti:
q q q

Possono essere definiti nuovi tag ed attributi. La struttura di un documento pu essere vista in modo gerarchico nidificando i tag in ogni livello di complessit. Ogni documento XML pu contenere una opzionale descrizione della sua grammatica, in modo che possa essere utilizzata da applicazioni che richiedono una validazione della struttura del documento.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/rel.htm (2 di 2) [19/06/2001 14.09.24]

XML: Capitolo I: L'importanza dell'XML - Le propriet dell'XML

Le propriet dell'XML
LXML importante in due classi di applicazioni Web: la creazione di documenti e lo scambio dei dati; i server Web attualmente utilizzati richiedono, per essere in grado di servire documenti XML, minime modifiche di configurazione; inoltre il metodo standard di collegamento e la connessione dei documenti XML, utilizza gli URL, che vengono interpretati correttamente della maggior parte del software per Internet. La sintassi dellXML molto simile a quella dellHTML, ma molto pi rigida e severa; anche se al primo impatto questa caratteristica non sembra una propriet positiva, (soprattutto per chi dovr scrivere documenti XML), stata volutamente introdotta dal gruppo di studio del W3C, per facilitare lo sviluppo di applicazioni basate sullXML e aumentarne le prestazioni (si pensi ad un browser). Inoltre una sintassi chiara e pulita, aumenta la leggibilit di un documento (questo vale in generale); a questo proposito si pu dire che una sintassi chiara e pulita, unita alla possibilit di creare un proprio set di markup, contribuir a rendere un file XML leggibile quanto un file di solo testo (e in alcuni casi di pi). LXML non limitato a un insieme fisso di tipi di elementi, ma permette di definire e utilizzare elementi e attributi personalizzati; per far questo viene fornita una sintassi con cui possibile specificare gli elementi e gli attributi che possono essere utilizzati allinterno dei documenti. In altre parole possibile creare un modello, chiamato Document Type Definition (DTD), che descrive la struttura e il contenuto di una classe di documenti; lo stesso XML ha un proprio DTD (attualmente descritto nella specifica REC-xml-19980210) in cui vengono elencate le regole della specifica stessa del linguaggio. Con lXML anche introdotta una classe di documenti che fa riferimento al solo DTD dellXML; la creazione di un DTD personale non quindi indispensabile, come mostra la Fig. 1.2.

Fig. 1.2: Un documento XML pu fare riferimento al DTD dellXML o a un DTD personale Questa possibilit semplifica molto lutilizzo dellXML rispetto allSGML. Nel linguaggio SGML infatti i DTD sono indispensabili (e spesso complicati da creare e da imparare), e un documento deve fare obbligatoriamente riferimento ad uno di essi. LXML permette di creare dei tag personalizzati; inoltre uno stesso documento XML pu essere utilizzato per scopi diversi da applicazioni diverse. Come fa una applicazione a riconoscere il markup disegnato per lei e ad evitare di confonderlo con il markup disegnato per altre applicazioni? Ad esempio una applicazione potrebbe utilizzare un elemento chiamato "address" per identificare il domicilio di una persona; unaltra applicazione invece potrebbe utilizzare lo stesso elemento per identificare lindirizzo elettronico di una persona. Anche un programmatore potrebbe avere difficolt nel capire lutilizzo di un determinato elemento; per risolvere questo tipo di problemi, il gruppo di lavoro del W3C ha pensato ad un metodo per individuare le convenzioni che governano lutilizzo di un particolare set di elementi; lidea quella di utilizzare un namespace, cio un documento in cui viene definito lutilizzo di un particolare set di elementi; un documento XML pu far riferimento ad un namespace attraverso un indirizzo Web. Il documento di riferimento il WD-xml-names-19990114. LXML pu essere utilizzato come piattaforma per lo scambio di dati tra le

http://www.html.it/xml/guida/proprieta.htm (1 di 3) [19/06/2001 14.09.39]

XML: Capitolo I: L'importanza dell'XML - Le propriet dell'XML

applicazioni, come mostra la Fig. 1.3; ci possibile perch orientato alla descrizione dei dati.

Fig 1.3: LXML pu essere utilizzato come piattaforma per lo scambio di dati Poniamo il caso che si voglia scambiare le informazioni di database su Internet. Si immagini di utilizzare un browser per rinviare al server le informazioni su un questionario compilato dagli utenti. Questo processo, come molti altri, richiede un formato che possa essere personalizzato per un utilizzo specifico e che sia una soluzione aperta non proprietaria. LXML la soluzione per questo tipo di problema. Questo linguaggio in futuro diventer sempre pi importante per lo scambio di dati su Internet. LXML in grado di fornire una sola piattaforma per lo scambio di dati tra le applicazioni. Era sempre stato difficile trovare un formato di interscambio che potesse essere utilizzato per il trasferimento di dati tra database di fornitori differenti e sistemi operativi diversi. Quel tipo di interscambio ora diventato una delle applicazioni principali dellXML. Le pagine HTML hanno lunico scopo di essere visualizzate da un browser (infatti si dice che i dati nellHTML sono orientati al video); per questo molto difficile lelaborazione successiva delle informazioni contenute nelle pagine HTML. I documenti basati sullXML invece, non fanno supposizioni su come verranno utilizzati dal client; cos le informazioni ricevute possono essere utilizzate da unapplicazione che comprende il linguaggio XML, utilizzando i dati ivi contenuti in altri processi software; quindi uno stesso documento pu essere facilmente utilizzato per scopi diversi. Il collegamento ipertestuale una caratteristica specifica dellHTML; attualmente per, esso supporta solo un tipo di collegamento, che quello unidirezionale; in un vero sistema ipertestuale i tipi di collegamento sono diversi. Anche se lXML uno standard, molte cose sulle tecnologie correlate, quali i fogli di stile ed il collegamento, sono ancora in fase di sviluppo; quindi il modo esatto in cui il collegamento deve essere implementato nellXML ancora in fase di studio. Sicuramente dovr essere compatibile con i meccanismi di collegamento HTML esistenti, supportare lestensibilit e le propriet intrinseche dellXML e implementare i vari tipi di collegamenti propri di un vero sistema ipertestuale. Attualmente lo standard di riferimento lExtensible Linking Languge (XLL) del 3/3/1998; stato diviso in due parti: XML Linking Language (XLink) e XML Pointer Language (XPointer). LXSL definisce la specifica per la presentazione e laspetto di un documento XML: stato presentato nel 1997 da un consorzio di industrie software (tra cui anche la Microsoft) al W3C perch lo approvasse come linguaggio di stile standard per i documenti XML. LXSL un sottoinsieme del Document Style Semantics and Specification Language (DSSSL), il linguaggio di stile utilizzato in ambiente SGML; gode delle propriet di essere estensibile, potente ma nello stesso tempo di facile utilizzo. Con lXSL possibile creare fogli di stile che permettono la visualizzazione di un documento XML in un qualsiasi formato (audio, video, braille, etc.), come mostra la Fig. 1.4. Attualmente lo standard di riferimento il documento WD-xsl-19990421.

http://www.html.it/xml/guida/proprieta.htm (2 di 3) [19/06/2001 14.09.39]

XML: Capitolo I: L'importanza dell'XML - Le propriet dell'XML

Fig 1.4: LXSL permette di creare fogli di stile per un qualsiasi formato

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/proprieta.htm (3 di 3) [19/06/2001 14.09.39]

XML: Capitolo I: L'importanza dell'XML - L'XML e il Web

L'XML e il Web
Si possono individuare quattro categorie di applicazioni che utilizzeranno lXML:
q q q q

Applicazioni che richiedono al Web client di mediare tra due o pi database eterogenei. Applicazioni che tentano di distribuire i processi di caricamento dellinformazione dal Web server al Web client. Applicazioni che richiedono al Web client di presentare differenti viste degli stessi dati ad utenti differenti. Applicazioni nelle quali motori di ricerca Web tentano di ritagliare le informazioni scoperte, ai bisogni individuali degli utenti.

Lalternativa allXML, per queste applicazioni, sono codici proprietari inseriti come script nei documenti HTML. La filosofia dellXML invece, si basa sul fatto che il formato dei dati non sia legato a nessuno script in particolare, e sia uno standard indipendente da qualsiasi organizzazione proprietaria.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/web.htm [19/06/2001 14.09.43]

XML: Capitolo I: L'importanza dell'XML - Database eterogenei

L'importanza dell'XMLDatabase eterogenei


Un esempio di questa categoria di applicazioni Web il sistema informativo di unagenzia americana di "home health care". Questo tipo di agenzie sono il maggior componente dellindustria medica americana e la loro importanza sta aumentando da quando politiche governative hanno spostato lassistenza medica ospedaliera verso lassistenza medica domestica. Come si pu ben capire la gestione dellinformazione critica per questa industria; la salute di un paziente rappresentata nel sistema informativo attraverso una collezione di documenti storici che rappresentano la vita medica di una persona, passata attraverso vari dottori, ospedali, farmacie e compagnie di assicurazioni; quando un nuovo paziente entra in una agenzia, c lenorme compito di prelevare tutto il materiale e di memorizzarlo nel database dellagenzia. Lavvento del Web diede alla comunit informatica medica la speranza di poter semplificare lo sforzo di memorizzazione delle informazioni nel database; sfortunatamente le applicazioni Web esistenti offrono modelli di soluzione a questo problema inadeguati. Gli ospedali offrono alle agenzie una soluzione che in poche parole cos riassunta: 1. Raggiungere il sito Web dellospedale

2. 3. 4. 5.

Diventare un utente autorizzato Accedere alla documentazione medica del paziente attraverso il browser Stampare la documentazione Inserire manualmente i dati nel database (dalla stampa)

Attualmente questa soluzione proposta da un gran numero di ospedali americani. Una versione leggermente pi sofisticata permette alloperatore di inserire manualmente i dati letti dal browser direttamente in un form dellagenzia (in una finestra separata), evitando cos la stampa del documento. Anche questa per non una grande soluzione. La soluzione ideale sarebbe la seguente: 1. Raggiungere il sito Web dellospedale

2. Diventare un utente autorizzato 3. Accedere alla documentazione medica del paziente attraverso una interfaccia
Web che rappresenti la documentazione con una icona a cartella

4. Fare un drag della cartella dallapplicazione Web nel database interno 5. Fare un drop della cartella nel database
Attualmente questa soluzione non possibile poich ci si scontra con i limiti dellHTML; le ragioni sono due: q LHTML non permette di rappresentare strutture dati
q

LHTML non permette il controllo dei dati per validare i documenti ricevuti

Una soluzione tecnica per implementare questo scambio di documenti quella di richiedere agli ospedali e alle agenzie di utilizzare un sistema informativo standard dettato dal governo (tale soluzione attualmente allo studio); questo tipo di soluzione per difficile da mettere in pratica, soprattutto in un ambiente dove ospedali e agenzie stanno attraversando un momento di difficolt finanziaria (cambiare il sistema informativo comporta generalmente grosse spese). Unaltra soluzione quella di adottare un formato standard di scambio dellinformazione; un grande numero di industrie nel campo spaziale, telecomunicazioni, hardware, software, ha utilizzato per anni un linguaggio standard per lo scambio dei dati e il processo attualmente molto ben compreso. Tipicamente un consorzio di grandi industrie definisce un Document Type Definition (in ambiente SGML) per implementare un linguaggio di markup specifico per un determinato scopo; quindi il linguaggio utilizzato come standard per lo scambio dei dati in determinati ambienti. La soluzione XML indipendente dai sistemi, dalle organizzazioni e proviene dalla decennale esperienza dellSGML; lXML permette di utilizzare lapproccio SGML per

http://www.html.it/xml/guida/database.htm (1 di 2) [19/06/2001 14.09.47]

XML: Capitolo I: L'importanza dell'XML - Database eterogenei

lo scambio dei dati nel Web; significativo come il giorno del rilascio della prima versione stabile dellXML, lorganizzazione che raggruppa le maggiori agenzie di home health care, abbia annunciato lo sviluppo dellHealth Care Markup Language in ambiente SGML, che dovrebbe risolvere i tipi di problemi descritti in questo esempio. Si anche dimostrato che rappresentare i dati con un ricco markup ha dei benefici che vanno oltre lo scambio dei dati; ad esempio molto utile rappresentare risultati di un esame clinico con tag quali <allergia> oppure <reazione>; infatti chi legge il documento subito allertato (da una applicazione apposita) del fatto che un paziente pu essere allergico alla penicillina.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/database.htm (2 di 2) [19/06/2001 14.09.47]

XML: Capitolo I: L'importanza dell'XML - Processi distribuiti

Processi distribuiti
Un esempio di questa seconda categoria di applicazioni XML il sistema di distribuzione dei dati adottato dallindustria dei semiconduttori. Ogni grande industria nel campo dei semiconduttori deve mantenere enormi quantit di dati tecnici sui circuiti integrati prodotti. Per abilitare lo scambio di questi dati, anni fa fu formato un consorzio (il Pinnacles Group) di industrie quali Intel, National Semiconductor, Philips, Texas Instrument e Hitachi; lo scopo era quello di sviluppare uno specifico linguaggio di markup in ambiente SGML; nel 1995 stata presentata la prima versione stabile e attualmente le grandi compagnie sono impegnate nel processo dimplementazione di questo linguaggio. Si potrebbe pensare che lincremento della popolarit dellHTML avesse fatto cambiare idea ai membri del Pinnacles Group, ma le limitazioni di tale linguaggio li hanno convinti che lidea originale fosse pi che corretta. Lidea era che utilizzare il linguaggio di markup come veicolo per la distribuzione dei dati sui circuiti integrati potesse permettere non solo la loro visualizzazione, ma anche il progetto dei circuiti stessi. Questo approccio si integra molto bene con la tecnologia dei Java applet perch permette ad un ingegnere di accedere al sito Web di una industria di semiconduttori e di scaricarsi non solo i dati di un particolare circuito integrato, ma anche un Java applet che permetta di combinare i dati in vari modi. Questo esempio dei semiconduttori una buona dimostrazione dei vantaggi dellXML perch: q Richiede uno specifico tag set che non pu essere ottenuto con il non estensibile tag set dellHTML.
q q

Richiede che la rappresentazione dei dati sia indipendente dai sistemi utilizzati nelle varie industrie. Creare il disegno dei circuiti dai dati un processo computazionalmente molto intensivo; quindi in un ambiente Web client-server necessario distribuire il processo computazionale per ridurre al minimo linterazione fra il client e il server e lasciare la parte pi intensiva del processo sul client; questo aspetto pu essere riassunto nel seguente slogan: "XML fa lavorare Java".

Bisogna notare che la validazione dei dati in questi processi non sempre necessaria; infatti la validazione dei dati cruciale quando questi devono essere memorizzati in un database, ma non sempre questo richiesto; per rendere questi processi il pi efficienti possibile, XML permette che la validazione sia un optional in applicazioni dove non necessaria. Lesempio dei semiconduttori mostra come si integrano bene lXML e Java in applicazioni in cui i dati devono essere manipolati in modo interessante sul client.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/processi.htm [19/06/2001 14.09.51]

XML: Capitolo I: L'importanza dell'XML - Viste differenti

Viste differenti
Un utente pu decidere di cambiare la visualizzazione dei dati senza dover scaricare differenti formati dal Web server. Una possibile applicazione di questa categoria un dinamico tables of contents (TOC); possibile attraverso un server Web, presentare allutente il contenuto di una struttura dati utilizzando un TOC dinamico; con un click del mouse su una parte del TOC, lutente pu ottenere livelli di dettaglio pi specifici della struttura dati. Un TOC dinamico di questo tipo pu essere generato a run-time direttamente dalla struttura gerarchica dei dati memorizzati in un database; sfortunatamente il ritardo intrinseco della rete Internet, rende il processo di espansione o di contrazione del TOC fastidioso per molti utenti. Una soluzione migliore quella di scaricare lintera struttura TOC sul Web client; quindi lutente pu espandere, contrarre, navigare nel TOC, supportato da processi molto veloci che girano direttamente sul suo client. Un gruppo di studio alla Sun ha implementato questo tipo di soluzione nel Java-based HTML Help browser, ma le limitazioni dellHTML richiedono al team ingegnose "capriole". In questa applicazione un TOC costruito manualmente (le carenze dellHTML rendono impossibile la generazione automatica del TOC direttamente dal documento), utilizzando un set di tag inventato per questo proposito. Quindi il TOC inserito in un commento dentro la pagina HTML, per fare in modo che il Web browser non abbia problemi di riconoscimento del set di tag non convenzionale; un applet Java scaricato con il documento HTML interpreta il markup del TOC, fornendolo allutente. In pratica questa soluzione lavora molto bene; ma in ambiente XML, la creazione manuale del TOC non necessaria; naturalmente attraverso un editor necessario creare la struttura generale del TOC, ma il TOC specifico di una particolare struttura dati pu essere generato a run-time e scaricato nel browser che lo visualizza grazie al Java applet. La capacit di catturare e trasmettere le informazioni semantiche e strutturale dei dati, rende possibile attraverso lXML, limplementazione di una grande variet di questo tipo di applicazioni; ad esempio: q Con un semplice click del mouse si pu optare per visualizzare la versione per macchine Sparc del manuale tecnico del sistema operativo Solaris, o la versione per macchine x86.
q q

Oppure si pu optare per visualizzare il manuale in differenti lingue internazionali. Un documento che contiene molte annotazioni pu essere visualizzato senza queste, oppure solo con le annotazioni, oppure sia con il testo che con le annotazioni, semplicemente attraverso un menu di selezione. Una agenda telefonica ordinata sul Cognome, pu istantaneamente essere ordinata sul nome.

Questi sono solo alcuni esempi che possono essere implementati in ambiente Web grazie allXML.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/viste.htm [19/06/2001 14.09.54]

XML: Capitolo I: L'importanza dell'XML - Motori di ricerca

Motori di ricerca
XML permette di aggiungere informazioni semantiche al testo: <Autore>Giancarlo Parma</Autore> questo permette di semplificare la creazione di applicazioni che svolgono operazioni intelligenti con i documenti elettronici; un motore di ricerca sarebbe in grado di eseguire ricerche esplicite nel Web per trovare tutti i documenti in cui Giancarlo Parma lautore; in questo modo si pu superare uno dei limiti dellHTML, in cui i dati sono orientati al video e difficili da utilizzare per una elaborazione successiva; a questo riguardo, il commercio on-line in pieno sviluppo e sempre pi commercianti in tutto il mondo si stanno affacciando nel Web; per unindagine su un campione di acquirenti abituali via Internet, ha evidenziato una certa frustrazione da parte dei consumatori per la difficolt di trovare i prodotti di cui hanno bisogno; il problema risiede nel sistema di indicizzazione delle merci, non sempre intuitivo e semplice come lutente vorrebbe. La chiave per risolvere questo tipo di problemi sta in questo slogan: "Linformazione ha bisogno di conoscere se stessa, ma ha anche bisogno di conoscere me"; supponiamo di dover implementare una guida TV personalizzata per un sistema via cavo di 500 canali; la guida TV personalizzata deve conoscere sia le preferenze e le caratteristiche dellutente (livello di educazione, interessi, professione, et, etc.), sia le caratteristiche dei programmi trasmessi; queste informazioni devono essere fornite in modo tale da permettere al motore di ricerca implementato nella guida, di fare una selezione intelligente dei programmi pi interessanti per lutente; si ha quindi bisogno di un sistema standard che utilizzi uno specifico set di tag con cui poter esprimere le caratteristiche di un particolare programma (argomento, tipo di utenza a cui rivolto, attori, lunghezza, data in cui stato girato, lingua, etc.). Questo un semplice esempio che pu naturalmente essere esteso ad un qualsiasi ambiente in cui linformazione debba essere ritagliati sui gusti degli utenti; lXML unottima soluzione anche per questo tipo di problemi e permetter ad applicazioni Web di competere realmente con la grande distribuzione dislocata sul territorio.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/motori.htm [19/06/2001 14.09.57]

XML: Capitolo II: Struttura e Sintassi

Struttura e sintassi
Una delle caratteristiche principali dellXML la possibilit di fornire una struttura a un documento. Ogni documento XML comprende sia una struttura logica che una struttura fisica. La struttura logica simile a un modello che indica quali elementi includere in un documento e in quale ordine. La struttura fisica contiene i dati effettivi utilizzati in un documento, quali il testo memorizzato nella memoria del computer, unimmagine memorizzata nel WWW e cos via. Per comprendere la struttura di un documento XML, osserviamo questo modello:

Fig 1.5:Un documento XML ha sia una struttura logica che una struttura fisica.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/struttura.htm [19/06/2001 14.10.03]

XML: Capitolo II: Struttura e Sintassi - Struttura logica del linguaggio XML

Struttura logica del linguaggio XML


La struttura logica fa riferimento allorganizzazione delle parti di un documento: in altre parole, indica il modo in cui viene creato un documento in contrapposizione al contenuto del documento stesso. Un documento XML costituito da dichiarazioni, elementi, istruzioni di elaborazione e commenti. Alcuni componenti sono opzionali, altri sono necessari. PROLOGO Il primo elemento strutturale di un documento XML un prologo opzionale, costituito da due componenti principali anchessi opzionali: la dichiarazione XML e la dichiarazione del tipo di documento. DICHIARAZIONE XML La dichiarazione XML identifica la versione delle specifiche XML a cui conforme il documento. Sebbene la dichiarazione XML sia un elemento opzionale, deve sempre essere inserita in documento XML. Il documento inizia con una dichiarazione XML di base: <?xml version="1.0"?> Una dichiarazione XML pu inoltre contenere una dichiarazione di codifica (encoding) e una dichiarazione di documento autonomo (standalone). La dichiarazione di codifica identifica lo schema di codifica dei caratteri, ad esempio UTF-8 o EUC-JP. Schemi di codifica diversi assegnano formati di caratteri o linguaggi diversi. La dichiarazione di documento autonomo identifica lesistenza delle dichiarazioni di markup esterne al documento. Questo tipo di dichiarazione pu assumere valore yes o no. DICHIARAZIONE DEL TIPO DI DOCUMENTO La dichiarazione del tipo di documento costituita da codice di markup che indica le regole grammaticali o la definizione del tipo di documento DTD per una particolare classe di documenti. Questa dichiarazione pu anche essere diretta a un file esterno che contiene tutta o parte della DTD e deve essere visualizzata dopo la dichiarazione XML e prima dellelemento Document. Queste stringhe di codice aggiungono una dichiarazione del tipo di documento allesempio: <?xml version="1.0"?> <!DOCTYPE Wildflowers SYSTEM "Wldflr.dtd"> LELEMENTO DOCUMENT Lelemento Document contiene tutti i dati di un documento XML inclusi tutti i sottoelementi nidificati e le entit esterne. Pu essere considerato simile allunit C: del computer. Tutti i dati del computer sono memorizzati in questa singola unit in cui le cartelle e le sottocartelle contengono le singole parti di dati in una struttura logica e di semplice gestione. Queste stringhe di codice aggiungono un elemento Document, in questo caso lelemento Plant allesempio: <?xml version="1.0"?> <!DOCTYPE Wildflowers SYSTEM "Wldflr.dtd"> <PLANT> <COMMON>Columbine</COMMON> <BOTANICAL>Aquilegia canadensis</BOTANICAL> </PLANT> La nidificazione il processo che consente di incorporare un oggetto o un costrutto luno allinterno dellaltro. Un documento XML pu ad esempio contenere elementi nidificati e altri documenti. Ogni elemento secondario, cio un elemento diverso dallelemento Document risiede interamente allinterno del relativo elemento principale, cos :

http://www.html.it/xml/guida/logica.htm (1 di 2) [19/06/2001 14.10.06]

XML: Capitolo II: Struttura e Sintassi - Struttura logica del linguaggio XML

<DOCUMENT> <PARENT1> <CHILD1></CHILD1> <CHILD2></CHILD2> </PARENT1> </DOCUMENT>

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/logica.htm (2 di 2) [19/06/2001 14.10.06]

XML: Capitolo II: Struttura e Sintassi - Struttura fisica del linguaggio XML

Struttura fisica del linguaggio XML


La struttura fisica di un documento XML costituita da tutto il contenuto del documento stesso. Le unit di memorizzazione definite entit, possono essere parte integrante del documento o possono essere esterne. Ogni entit identificata da un nome univoco e da un contenuto specifico che pu essere costituito da un singolo carattere allinterno del documento o da un file esterno di grandi dimensioni. In termini di struttura logica di un documento XML, le entit vengono dichiarate nel prologo e viene loro fatto riferimento nellelemento Document. Dopo aver dichiarato la DTD, lentit pu essere utilizzata in un punto qualsiasi del documento. Un riferimento di entit indica allelaboratore di recuperare il contenuto di unentit, come stabilito dalla dichiarazione di entit, e di utilizzarla allinterno del documento. ENTITA ANALIZZABILI E NON ANALIZZABILI Unentit pu essere analizzabile o non analizzabile. Per entit analizzabile si intende unentit in grado di essere letta dallelaboratore di XML che ne consente lestrazione. Al termine dellestrazione, questo tipo di entit viene visualizzata come parte del testo del documento nella posizione di riferimento dellentit stessa. Ad esempio, una dichiarazione del tipo analizzabile potrebbe essere questa : <!ENTITY LR1 "light requirement: mostly shade"> Ogni volta che nel documento viene fatto riferimento a questa entit, questultima verr sostituita dal contenuto. Se si desidera modificare il contenuto dellentit, necessario effettuare questa operazione solo nella dichiarazione e la modifica si rifletter in qualsiasi punto del documento in cui venga utilizzata lentit. RIFERIMENTI DI ENTITA Il contenuto di ogni entit viene aggiunto al documento ogni volta che viene fatto riferimento a quellentit. Il riferimento ha la funzione di segnaposto per lautore del contenuto e lelaboratore di XML colloca il contenuto effettivo nei punti di riferimento. Per includere un riferimento, bisogna inserire una e commerciale (&) e immettere il nome dellentit seguito da punto e virgole (;). Allinterno di un documento assumerebbe il seguente aspetto: <TERM>Wild Ginger has the following &LR1;</TERM> RIFERIMENTI DI ENTITA DI PARAMETRO Un altro tipo di riferimento quello relativo allentit di parametro che utilizza un modulo (%) invece di una e commerciale anche se laspetto simile a qualsiasi altro riferimento di entit. %CDF; un esempio di entit di parametro. Unentit non analizzabile viene indicata talvolta come entit binaria in quanto il contenuto spesso costituito da un file binario, ad esempio unimmagine, che non pu essere interpretato direttamente dallelaboratore XML. Unentit non analizzabile richiede informazioni diverse da quelle incluse in unentit analizzabile. Viene richiesta unannotazione che identifica il formato o il tipo di risorsa per cui lentit viene dichiarata. Ad esempio : <!ENTITY MyImage SYSTEM "Image001.gif" NDATA GIF> Questa dichiarazione significa che lentit MyImage un file binario nellannotazione GIF. Perch queste dichiarazione di entit siano valide, anche lannotazione deve essere dichiarata. La dichiarazione di annotazione consente allapplicazione di XML di gestire i file binari esterni. Nel caso dellannotazione GIF utilizzata nellesempio, pu essere impiegata la dichiarazione di annotazione seguente: <!NOTATION GIF SYSTEM "/Utils/Gifview.exe"> Questa stringa di codice indica allelaboratore di XML di utilizzare Gifview.exe per elaborare lentit di tipo GIF ogni volta che viene rilevata. Dopo essere stata dichiarata, la dichiarazione di annotazione pu essere utilizzata allinterno del documento.

http://www.html.it/xml/guida/fisica.htm (1 di 2) [19/06/2001 14.10.11]

XML: Capitolo II: Struttura e Sintassi - Struttura fisica del linguaggio XML

ENTITA' PREDEFINITE Nel linguaggio XML alcuni caratteri sono utilizzati per contrassegnare il documento in modo specifico. Le parentesi angolari (<>) e la barra (/) sono interpretate come markup e non come dati di un carattere effettivo: <PLANT>Blodroot</PLANT> Questi e altri caratteri sono riservati per il markup e non possono essere utilizzati come contenuto. Se si desidera che questi caratteri siano visualizzati come dati, necessario utilizzare determinati codici: &lt; < (parentesi angolare di apertura) &gt; > (parentesi angolare di chiusura) &amp ; & (e commerciale) &apos; (apostrofo) &quot; " (virgolette doppie) ENTITA INTERNE ED ESTERNE Nel primo caso si tratta di unentit in cui non esistono unit di memorizzazione fisica separate e il cui contenuto viene fornito nella dichiarazione corrispondente, ad esempio: <!ENTITY LR1 "light requirement: mostly shade"> Unentit esterna fa riferimento a ununit di memorizzazione nella dichiarazione mediante un identificatore pubblico o di sistema. Lidentificatore di sistema fornisce un collegamento alla posizione in cui si trova il contenuto dellentit, ad esempio un URI (Uniform Resource Identifier) come ad esempio: <!ENTITY MyImage SYSTEM "http://www.wildflowers.com/Image001.gif" NDATA GIF> In questo caso lelaboratore di XML deve necessariamente leggere il file Image001.gif per recuperare il contenuto di questa entit. Oltre allidentificatore di sistema, lentit pu includere un identificatore pubblico che fornisce un metodo opzionale e alternativo per il recupero del contenuto di unentit da parte dellelaboratore di XML. Questo identificatore pu essere ad esempio utilizzato se lapplicazione collegata a una libreria del documento disponibile pubblicamente. Se lelaboratore non in grado di generare una posizione appropriata per lidentificatore pubblico, necessario che venga controllato lURI specificato dallidentificatore di sistema. Ad esempio: <!ENTITY MyImage PUBLIC "-//Wildflowers/TEXT Standard images//EN" "http://www.wildflowers.com/Image001.gif" NDATA GIF> Lelaboratore di XML verifica lidentificatore pubblico allinterno di un elenco di risorse a cui collegato e scoprire che non necessaria una nuova copia dellentit perch gi disponibile localmente.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/fisica.htm (2 di 2) [19/06/2001 14.10.11]

XML: Capitolo II: Struttura e Sintassi - Sintassi XML

Sintassi XML
Le regole strutturali del linguaggio XML si riflettono nelle regole linguistiche o sintassi.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/sintassi.htm [19/06/2001 14.10.21]

XML: Capitolo II: Struttura e Sintassi - Apertura e chiusura dei tag

Apertura e chiusura dei tag


Nel codice HTML un elemento contiene in genere sia tag di apertura che di chiusura. A differenza dellHTML, lXML richiede che un tag di chiusura venga utilizzato per ogni elemento. Si consideri ad esempio lelemento HTML Paragraph che dovrebbe in genere includere un tag di apertura, il contenuto e un tag di chiusura come mostrato di seguito: <P>Questo un elemento HTML Paragraph.</P> Non sempre viene utilizzato un tag di chiusura in questo contesto. Questo avviene perch lHTML e il linguaggio di origine SGML consentono di omettere i tag di chiusura senza invalidare il codice. Poich un paragrafo in HTML non pu essere annidato allinterno di un altro paragrafo, lelaboratore in grado di leggere il tag di apertura del paragrafo e di presumere che indichi anche la fine del paragrafo precedente. Queste tecniche di minimizzazione non sono consentite nel linguaggio XML. Questa caratteristica costituisce la differenza sintattica pi evidente tra i due linguaggi. IL TAG DI ELEMENTO VUOTO Il linguaggio XML supporta un collegamento per elementi vuoti, il tag di elemento vuoto. Questo tag unisce i tag di apertura e di chiusura per un elemento senza alcun contenuto. Viene utilizzato un formato speciale: <NOMETAG/>. In questo caso la barra segue il nome del tag, il che non possibile nel linguaggio HTML.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/tag.htm [19/06/2001 14.10.23]

XML: Capitolo II: Struttura e Sintassi - Attributi

Attributi
Gli attributi consentono di associare valori a un elemento senza che siano considerati parte del contenuto dellelemento stesso. Ad esempio osserviamo un comune elemento HTML e lutilizzo di un attributo: <A HREF = "http://www.microsoft.com">Microsoft Home Page</A> In questo caso lelemento Anchor indicato dal tag <A> contiene un attributo denominato HREF. Il valore dellattributo http://www.microsoft.com. Mentre il valore non viene mai visualizzato dallutente, lattributo contiene importanti informazioni relative allelemento e fornisce la destinazione dellancoraggio. Questo formato del nome e del valore mostra il modo in cui sono utilizzati gli attributi nel linguaggio XML. Questo esempio aggiunge un attributo a uno degli elementi del documento: <?xml version="1.0"?> <!DOCTYPE Wildflowers SYSTEM "Wldflr.dtd"> <PLANT ZONE=3> <COMMON>Columbine</COMMON> <BOTANICAL>Aquilegia canadensis</BOTANICAL> </PLANT> Lattributo ZONE del tag di apertura <PLANT> segue il formato del nome e del valore.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/attributi.htm [19/06/2001 14.10.26]

XML: Capitolo II: Struttura e Sintassi - Documenti XML validi e ben formati

Documenti XML validi e ben formati


Il linguaggio XML possiede due caratteristiche fondamentali, la capacit di fornire una struttura ai documenti e di rendere i dati autodescrittivi. Queste caratteristiche non sarebbero di alcuna utilit se non si potessero far rispettare le regole strutturali e grammaticali.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/doc.htm [19/06/2001 14.10.29]

XML: Capitolo II: Struttura e Sintassi - Documenti validi

Documenti validi
La definizione del tipo di documento DTD specificata nel prologo delinea tutte le regole relative a un documento. Un documento XML valido segue tutte queste regole rigidamente. Un documento valido conforme anche a tutti i limiti di validit identificati dalle specifiche relative allXML. Lelaboratore dovr comprendere i limiti di validit delle specifiche XML e verificare possibili violazioni allinterno del documento. Se lelaboratore trova un errore, deve comunicarlo allapplicazione XML. Dovr inoltre leggere la DTD, convalidare il documento e riportare qualsiasi violazione allapplicazione XML. Dato che questi controlli possono richiedere tempo e occupare larghezza di banda e poich la convalida non sempre necessaria, il linguaggio XML supporta la nozione di documento ben formato.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/validi.htm [19/06/2001 14.10.31]

XML: Capitolo II: Struttura e Sintassi - Documenti ben formati

Documenti ben formati


Anche se ben formato significa che necessario seguire alcune regole, non richiesto la stessa rigidit dei limiti di validit. Il concetto di documento ben formato relativamente nuovo in XML. Un documento XML ben formato pi facile da leggere per un programma ed pronto per la distribuzione in rete. Pi specificatamente, i documenti ben formati hanno queste caratteristiche:
q q q q

Tutti i tag di apertura e di chiusura corrispondono. I tag vuoti utilizzano una sintassi XML speciale. Tutti i valori degli attributi sono racchiusi tra virgolette. Tutte le entit sono dichiarate.

Quindi, un documento XML valido rispetta i tag e le norme di nidificazione impostate nel DTD del documento, mentre un documento XML ben formato viene strutturato in modo appropriato per lutilizzo da parte di un computer.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/formati.htm [19/06/2001 14.10.34]

XML: Capitolo III: Definizione del tipo di documento (DTD) - DTD

DTD<
Un documento XML comprende, come sappiamo, il prologo che contiene la dichiarazione XML e la dichiarazione del tipo di documento, che identifica il tipo di documento specifico elaborato e le regole che controllano il documento completo. Queste regole sono denominate definizione del tipo di documento o DTD e costituiscono la parte pi complessa della dichiarazione del tipo di documento.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/dtd.htm [19/06/2001 14.10.36]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Struttura della DTD

Struttura della DTD


Una DTD pu essere costituita da due parti: un sottoinsieme DTD esterno e un sottoinsieme DTD interno. Nel primo caso si tratta di una DTD che esiste allesterno del contenuto del documento, nel secondo caso si tratta di una DTD inclusa allinterno del documento XML. Un documento pu contenere una o entrambi i tipi di sottoinsiemi. In questo caso il sottoinsieme interno viene elaborato per primo e gli viene data la precedenza su qualsiasi sottoinsieme esterno. Questa funzionalit utile agli autori che impiegano una DTD esterna, ma che desiderano personalizzare alcune parti della DTD per unapplicazione specifica. Se si desidera includere un sottoinsieme DTD interno al documento, sufficiente scriverlo nella dichiarazione del tipo di documento. Un sottoinsieme DTD esterno tuttavia deve essere incluso mediante un riferimento DTD, che indica al processore dove trovare il sottoinsieme esterno specificando il nome del file DTD. Il riferimento DTD contiene inoltre informazioni relative allautore, allobiettivo e al linguaggio utilizzato nella DTD. Ad esempio: <!DOCTYPE catalog PUBLIC "-//flowers//DTD Standard //EN" http://www.wildflowers.com/dtd/Wldflr.dtd

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/strutturad.htm [19/06/2001 14.10.39]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Creazione di una DTD semplice

Creazione di una DTD semplice


Creiamo un documento XML di messaggio di posta elettronica con un sottoinsieme DTD interno. <?xml version="1.0"?> <!DOCTYPE EMAIL [ <!ELEMENT EMAIL (TO, FROM, CC, SUBJECT, BODY)> <!ELEMENT TO (#PCDATA)> <!ELEMENT FROM (#PCDATA)> <!ELEMENT CC (#PCDATA)> <!ELEMENT SUBJECT (#PCDATA)> <!ELEMENT BODY (#PCDATA)> ]> <EMAIL> <TO>Jodie@msn.com</TO> <FROM>Bill@msn.com</FROM> <CC>Philip@msn.com</CC> <SUBJECT>My first DTD</SUBJECT> <BODY>Hello, World</BODY> </EMAIL> Si noti che il codice contiene informazioni aggiuntive nella dichiarazione del tipo di documento. In questo caso si tratta del sottoinsieme DTD interno e identifica gli elementi che possono essere presenti nel documento e il tipo di dati che deve contenere. Se questo documento viene eseguito visualizzando la pagina XML, il documento avr questo aspetto:

In questo caso lelaboratore sta convalidando il documento in base alla DTD. In altri termini la pagina XML che visualizza il documento esegue lanalisi utilizzando un elaboratore di convalida. Ci significa che lelaboratore verifica il documento in base alle regole della DTD per accertare che tutto il codice utilizzato nel documento sia valido. Per verificare il funzionamento della convalida, aggiungiamo un elemento non incluso nella DTD al documento, ad esempio un elemento Signature, al termine del documento,

http://www.html.it/xml/guida/creadtd.htm (1 di 3) [19/06/2001 14.10.45]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Creazione di una DTD semplice

come: <?xml version="1.0"?> <!DOCTYPE EMAIL [ <!ELEMENT EMAIL (TO, FROM, CC, SUBJECT, BODY)> <!ELEMENT TO (#PCDATA)> <!ELEMENT FROM (#PCDATA)> <!ELEMENT CC (#PCDATA)> <!ELEMENT SUBJECT (#PCDATA)> <!ELEMENT BODY (#PCDATA)> ]> <EMAIL> <TO>Jodie@msn.com</TO> <FROM>Bill@msn.com</FROM> <CC>Philip@msn.com</CC> <SUBJECT>My first DTD</SUBJECT> <BODY>Hello, World</BODY> <SIGNATURE>Bill</SIGNATURE> </EMAIL> Se si cerca di eseguire questo documento, verr visualizzato un messaggio di errore perch lelaboratore non trova la dichiarazione relativa allelemento Signature nella DTD simile a questo : Element content is invalid according to the DTD/Schema. (Il contenuto dellelemento non valido in base alla DTD/Schema.) Modifichiamo adesso una parte della DTD. Notiamo che la prima dichiarazione dellelemento relativa allelemento Email: <!ELEMENT EMAIL (TO,FROM,CC,SUBJECT,BODY)>

Allinterno di questa riga di codice tra le parentesi presente un elenco degli altri elementi che possono essere contenuti nel documento. Questo elenco viene definito modello di contenuto e identifica gli elementi secondari che lelemento Email deve contenere e lordine in cui sono elencati. Ad esempio rimuoviamo lelemento Subject dal modello di contenuto. <!DOCTYPE EMAIL [ <!ELEMENT EMAIL (TO, FROM, CC, BODY)> <!ELEMENT TO (#PCDATA)> <!ELEMENT FROM (#PCDATA)> <!ELEMENT CC (#PCDATA)> <!ELEMENT SUBJECT (#PCDATA)> <!ELEMENT BODY (#PCDATA)> ]>

Lesecuzione del documento causerebbe un errore, perch il documento non ha seguito il modello di documento specificato. Torniamo al documento originale per modificare lordine degli elementi From e Cc affinch la parte superiore del documento assuma laspetto seguente: <EMAIL> <TO>Jodie@msn.com</TO> <CC>Philip@msn.com</CC> <FROM>Bill@msn.com</FROM> <SUBJECT>My first DTD</SUBJECT> <BODY>Hello, World</BODY> <SIGNATURE>Bill</SIGNATURE> </EMAIL>

Ancora una volta al momento dellesecuzione del documento, verr restituito un errore perch lelaboratore prevedeva un altro elemento al posto di quello ottenuto. E dunque chiaro che la DTD ha il ruolo di un rigido regolamento per i documenti XML, quindi importante fare attenzione al momento della creazione delle DTD.

http://www.html.it/xml/guida/creadtd.htm (2 di 3) [19/06/2001 14.10.45]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Creazione di una DTD semplice

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/creadtd.htm (3 di 3) [19/06/2001 14.10.45]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Dichiarazioni di elementi

Dichiarazioni di elementi
Ogni dichiarazione di elemento contiene il nome dellelemento e il tipo di dati definito specifiche di contenuto costituite da uno tra i quattro tipi seguenti:
q q q q

Un elenco di altri elementi, denominato modello di contenuto La parola chiave EMPTY La parola chiave ANY Contenuto di vario tipo

ULTERIORI INFORMAZIONI SUL MODELLO DI CONTENUTO La DTD dellesempio precedente iniziava con una dichiarazione di elemento inclusa nel modello di contenuto, come illustrato nella parentesi che segue: <!ELEMENT EMAIL (TO, FROM, CC, SUBJECT, BODY)> Lelemento Email contiene solo sottoelementi o elementi secondari. Per ogni elemento del modello di contenuto deve essere visualizzata una dichiarazione di elemento corrispondente nella parte restante della DTD che segue. DICHIARAZIONE DI ELEMENTO VUOTO Per dichiarare che un elemento non pu avere alcun contenuto, possibile utilizzare la parola chiave EMPTY nella dichiarazione di elemento, come indicato di seguito: <!ELEMENT TEST EMPTY> Un elemento Test di un documento che includa la dichiarazione precedente non potrebbe mai avere alcun contenuto e sarebbe necessario che fosse indicato come elemento vuoto, ad esempio <TEST/>. Anche se gli elementi vuoti potrebbero sembrare inutili, possono contenere attributi in grado di fornire un contenuto significativo o di funzioni specifiche allinterno di un documento. Il tag <BR> in HTML un esempio di tag di elemento vuoto. DICHIARAZIONE DI TUTTI GLI ELEMENTI La specifica di contenuto ANY esattamente lopposto della parola chiave precedente. Se una dichiarazione di elemento utilizza la parola chiave ANY per le specifiche di contenuto, quel tipo di elemento potr avere qualsiasi tipo di contenuto in base alle disposizioni della DTD, disposto in un ordine qualsiasi. La dichiarazione di tutti gli elementi assume questo aspetto: <!ELEMENT TEST ANY> CONTENUTO DI VARIO TIPO Le specifiche di contenuto possono anche essere costituite da un singolo insieme di alternative separate dal simbolo pipe (|). Ad esempio: <!ELEMENT EXAMPLE (#PCDATA|x|y|z)*>

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/elem.htm [19/06/2001 14.10.49]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Tipi di dati

Tipi di dati
Allinterno del contenuto dei documenti, il linguaggio XML consente di utilizzare dati di caratteri analizzabili dichiarati mediante la parola chiave #PCDATA e i dati di caratteri dichiarati mediante la parola chiave CDATA. I dati di caratteri analizzabili sono dati di caratteri di markup, contengono quindi tag di markup. I dati di caratteri sono costituiti da testo ordinario che pu includere caratteri in genere riservati al markup. In base allimpostazione predefinita, gli elaboratori di XML presuppongono che il contenuto di un file XML sia costituito da dati di caratteri. Mentre i dati di caratteri analizzabili sono in genere utilizzati nel contenuto di un documento XML, i dati di carattere possono essere utilizzati nel caso in cui un autore desideri includere dati che non possono essere analizzati. Per dichiarare una sezione come dati di carattere, necessario indicare linizio della sezione con la sequenza <![CDATA[ e la fine con due parentesi di chiusura ]]. Tutti i dati che risiedono allinterno di questo insieme di marcatori verranno interpretati come semplici dati non analizzabili.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/tipi.htm [19/06/2001 14.10.52]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Simboli relativi alla struttura

Simboli relativi alla struttura


Il linguaggio XML utilizza una serie di simboli per specificare la struttura di una dichiarazione di elementi. La tabella seguente identifica i simboli disponibili, lo scopo di ogni simbolo, un esempio di come vengono utilizzati e il loro significato. Simbolo Scopo Esempio Significato Parentesi Racchiudono una sequenza, un gruppo di elementi o una serie di alternative Separa gli elementi di una sequenza e identifica lordine in cui devono essere visualizzati Separa gli elementi in un gruppo di alternative (content1, content2) Lelemento deve contenere la sequenza content1 e content2. Lelemento deve contenere content1, content2 e content3 nellordine specificato. Lelemento deve contenere content1, content2 o content3.

Virgola

(content1, content2, content3)

Pipe

(content1| content2| content3)

Punto di domanda

Indica che un elemento deve essere visualizzato una sola volta o non apparire mai Indica che lelemento pu essere visualizzato ogni volta che lautore desidera Indica che un elemento deve essere visualizzato una o pi volte

content1?

Lelemento pu contenere content1. Se content1 viene visualizzato, deve apparire una sola volta. Lelemento pu contenere content1. Se viene visualizzato, pu apparire una o pi volte. Lelemento deve contenere content1 una volta, ma pu essere visualizzato anche pi di una volta. Lelemento deve contenere content1.

Asterisco

content1*

Segno pi

content1+

Nessun simbolo

Indica che deve essere visualizzato un elemento

content1

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/simboli.htm [19/06/2001 14.10.56]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Attributi

Attributi
Oltre alla definizione della struttura di un elemento e al tipo di contenuto, possibile associare attributi a un elemento. Gli attributi forniscono informazioni aggiuntive relative allelemento o al contenuto dellelemento. DICHIARAZIONI DI ATTRIBUTO Nel linguaggio XML gli attributi vengono dichiarati nella DTD utilizzando la sintassi seguente: <!ATTLIST ElementName AttributeName Type Default> In questo caso <!ATTLIST> rappresenta il tag che identifica una dichiarazione di attributo. La voce ElementName rappresenta il nome dellelemento a cui vengono applicati gli attributi, La voce AttributeName rappresenta il nome dellattributo. La voce Type identifica il tipo di attributo dichiarato. La voce Default specifica le impostazioni predefinite relative allattributo. Ecco elencati i tipi di attributi disponibili per il linguaggio XML: Tipo di attributo Utilizzo CDATA ENTITY ENTITIES ID In questo attributo possono essere utilizzati solo dati in formato carattere. Il valore dellattributo deve fare riferimento a unentit binaria esterna dichiarata nella DTD. E equivalente allattributo ENTITY, ma consente lutilizzo di pi valori separati da spazi. Il valore dellattributo deve essere un identificatore univoco. Se un documento contiene attributi ID con lo stesso valore, lelaboratore produrr un errore. Il valore deve essere un riferimento a un ID dichiarato in un altro punto del documento. Se lattributo non corrisponde al valore dellID specificato, lelaboratore produrr un errore. E equivalente allattributo IDREF, ma consente lutilizzo di pi valori separati da spazi. Il valore dellattributo consiste in una qualsiasi combinazione di caratteri del token del nome, rappresentati da lettere, numeri, punti trattini, due punti o caratteri di sottolineatura. E equivalente allattributo NMTOKEN, ma consente lutilizzo di pi valori separati da spazi. Il valore dellattributo deve fare un riferimento a unannotazione dichiarata in un altro punto della DTD. La dichiarazione pu anche essere costituita da un elenco di annotazioni. Il valore deve corrispondere a una delle annotazioni dellelenco. Ogni annotazione deve avere la relativa dichiarazione nella DTD. Il valore dellattributo deve corrispondere a uno dei valori inclusi. Ad esempio: <!ATTLIST MyAttribute (content1|content2)>.

IDREF

IDREFS NMTOKEN

NMTOKENS NOTATION

Enumerated

La parte finale della dichiarazione di attributo limpostazione predefinita per il valore dellattributo. Le impostazioni predefinite per i quattro tipi sono: Impostazione predefinita Utilizzo

http://www.html.it/xml/guida/attrib.htm (1 di 2) [19/06/2001 14.11.00]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Attributi

#REQUIRED

Ogni elemento contenente questo attributo deve specificarne un valore. Un valore mancante pu causare un errore. Questo attributo opzionale. Lelaboratore pu ignorare questo attributo se non viene rilevato alcun valore. Questo attributo deve avere il valore fixedvalue. Se lattributo non incluso nellelemento, viene stabilito il valore fixedvalue. Identifica un valore predefinito per un attributo. Se lelemento non include lattributo, viene stabilito il valore default.

#IMPLIED

#FIXED fixedvalue

Default

Nel documento desempio mostriamo lutilizzo degli attributi aggiungendo alcune dichiarazioni di attributo alla DTD: <?xml version="1.0"?> <!DOCTYPE EMAIL [ <!ELEMENT EMAIL (TO+, FROM, CC*, BCC*, SUBJECT?, BODY?)> <!ATTLIST EMAIL LANGUAGE(Western|Greek|Latin|Universal) " Western" ENCRYPTED CDATA #IMPLIED PRIORITY (NORMAL|LOW|HIGH) "NORMAL"> <!ELEMENT TO (#PCDATA)> <!ELEMENT FROM (#PCDATA)> <!ELEMENT CC (#PCDATA)> <!ELEMENT BCC (#PCDATA)> <!ATTLIST BCC HIDDEN CDATA #FIXED "TRUE"> <!ELEMENT SUBJECT (#PCDATA)> <!ELEMENT BODY (#PCDATA)> ]> In questo esempio sono stati aggiunti attributi allelemento Email e al nuovo elemento Bcc. Il primo attributo aggiunto allelemento Email LANGUAGE. Questo attributo pu contenere una tra le numerose opzioni. Lattributo conterr il valore predefinito Western se non verr specificato un altro valore. Lattributo successivo dellelemento Email ENCRYPTED. Questo elemento deve contenere i dati di carattere e poich limpostazione predefinita #IMPLIED, lelaboratore ignorer questo attributo se non verr specificato alcun valore. Lultimo attributo dellelemento Email PRIORITY. Questo attributo pu assumere uno dei tre valori NORMAL, LOW e HIGH. Il valore predefinito NORMAL. Lattributo HIDDEN stato incluso nellelemento Bcc. Questo attributo di tipo CDATA e il valore predefinito di #FIXED viene specificato dopo la parola chiave #FIXED. Questo attributo deve sempre specificare il valore nella DTD, in questo caso TRUE.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/attrib.htm (2 di 2) [19/06/2001 14.11.00]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Entita'

Entit
Oltre allentit generale viste nel capitolo precedente esiste un altro tipo di entit definita entit di parametro. La maggior parte delle entit deve essere dichiarata nella DTD. Alcune entit predefinite sono incorporate nel codice XML e sono utilizzate per visualizzare i caratteri generalmente impiegati per il markup. Le dichiarazioni di entit seguono la stessa sintassi di base utilizzata dalle altre dichiarazioni: <!ENTITY EntityName EntityDefinition> Le entit della DTD possono essere analizzabili o non analizzabili. Le entit del primo tipo o entit di testo contengono testo che far parte del documento XML. Le entit del secondo tipo o entit binarie sono in genere riferimenti a un file binario esterno. Le entit non analizzabili possono anche essere costituite da testo non analizzabile ed quindi preferibile pensare a queste entit come elementi che non sono stati creati per essere considerati parte del codice XML. ENTITA INTERNE Le entit interne vengono dichiarate nella DTD e includono il contenuto che verr utilizzato nel documento. Ad esempio, questa riga di codice aggiunge unentit interna definita SIGNATURE: <!ENTITY SIGNATURE "Bill"> Ogni volta che viene fatto riferimento allentit nel documento, &SIGNATURE, questultima verr sostituita dal relativo contenuto, in questo caso Bill. ENTITA ESTERNE: PAROLE CHIAVE SYSTEM E PUBLIC Le entit esterne fanno riferimento a file esterni, anche ad altri file XML. Ad esempio, questa entit fa riferimento a un file GIF esterno e verr visualizzata nel corpo del documento XML: <!ENTITY IMAGE1 SYSTEM "Xmlquot.gif" NDATA GIF> Una dichiarazione di entit esterna pu includere la parola chiave SYSTEM o PUBLIC. Molte DTD sono sviluppate localmente, vengono cio sviluppate per unazienda o organizzazione specifica o per un sito Web particolare. In questo caso andrebbe utilizzata la parola chiave SYSTEM. Questa parola chiave seguita da un URI (Uniform Resource Identifier) che indica allelaboratore dove reperire loggetto indicato nella dichiarazione. Nellesempio precedente, il nome di file era utilizzato perch il codice aveva impiego locale. Nella dichiarazione che segue, lURI un indirizzo Web che collega alla posizione dei file di riferimento: <!ENTITY IMAGE1 SYSTEM http://XMLCo.com/Images/Xmlquot.gif NDATA GIF> Alcune DTD sono standard stabiliti disponibili per unampia gamma di utenti. Sarebbe necessario utilizzare la parola chiave PUBLIC, seguita dallidentificatore pubblico che lelaboratore pu impiegare se disponibile una libreria standard. Dopo lidentificatore pubblico inserito un URI, simile a quello utilizzato con la parola chiave SYSTEM. Un esempio potrebbe essere questo: <!ENTITY IMAGE1 PUBLIC "-//XMLCo//TEXT Standard Images//EN" "http://XMLCo.com/Images/Xmlquot.gif" NDATA GIF> ENTITA ESTERNE: ANNOTAZIONI E DICHIARAZIONI DI ANNOTAZIONI Consideriamo la dichiarazione di entit: <!ENTITY IMAGE1 SYSTEM "Xmlquot.gif" NDATA GIF> Unannotazione NDATA GIF viene visualizzata nella parte finale della dichiarazione. Questa annotazione indica allelaboratore il tipo di oggetto a cui viene fatto riferimento. A questo punto se viene semplicemente aggiunta la dichiarazione di entit alla DTD e viene eseguita attraverso lelaboratore, verr visualizzato un messaggio di errore simile al seguente:

http://www.html.it/xml/guida/entita.htm (1 di 2) [19/06/2001 14.11.04]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Entita'

Declaration IMAGE1 contains reference to undefined notation GIF. (La dichiarazione IMAGE1 contiene un riferimento a unannotazione GIF non identificata.) Lerrore si verifica perch la dichiarazione di entit fa riferimento a un tipo di file binario e allelaboratore non stato indicato come operare con questo file. Si tratta di unentit non analizzabile che lelaboratore non in grado di comprendere. In questo caso lannotazione deve essere dichiarata come dichiarazione di annotazione. Una dichiarazione di annotazione indica allelaboratore come operare con un tipo di file binario specifico. Le dichiarazioni di annotazione hanno il seguente formato: <!NOTATION GIF SYSTEM "Iexplore.exe"> Questa dichiarazione indica allelaboratore di utilizzare il programma Iexplore.exe per elaborare il file GIF ogni volta che nella DTD ne viene rilevato uno. ENTITA DI PARAMETRO Anche se le entit di parametro funzionano in modo simile alle entit generali, possiedono unimportante differenza sintattica. Le entit di parametro utilizzano il simbolo di percentuale (%) nelle dichiarazioni e nei riferimenti. Nella dichiarazione di entit il simbolo di percentuale segue la parola chiave !ENTITY, ma precede il nome dellentit come illustrato di seguito. Si noti che richiesto uno spazio singolo prima e dopo il simbolo &: <!ENTITY % ENCRYPTION "40bit CDATA #IMPLIED 128bit CDATA #IMPLIED"> E ora possibile fare riferimento a questa entit in un altro punto della DTD. Ad esempio: <!ELEMENT EMAIL (TO+, FROM, CC*, BCC*, SUBJECT?, BODY?)> <!ATTLIST EMAIL LANGUAGE(Western|Greek|Latin|Universal) "Western" ENCRYPTED %ENCRYPTION; PRIORITY (NORMAL|LOW|HIGH) "NORMAL"> Il riferimento allentit di parametro &ENCRYPTION; utilizza lo stesso formato di base del riferimento di entit generale, a eccezione del simbolo % che sostituisce il simbolo &. Le entit di parametro possono rivelarsi un metodo utile per creare uno stile personale allinterno delle DTD e rendere queste ultime pi concise e meglio organizzate. Tuttavia queste entit dovrebbero essere utilizzate con cautela, dato che possono creare situazioni complesse allinterno di un documento in grado di rendere difficoltosa la gestione.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/entita.htm (2 di 2) [19/06/2001 14.11.04]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Le parole chiave Ignore e Include

Le parole chiave IGNORE e INCLUDE


Le parole chiave IGNORE e INCLUDE possono essere utilizzate dagli autori per "attivare" o "disattivare" porzioni della DTD. IGNORE e INCLUDE sono utilizzate nella DTD per creare allinterno del documento condizioni adatte a vari scopi. Lutilizzo di IGNORE e INCLUDE consente ad esempio di verificare diverse strutture durante il controllo delle variazioni. IGNORE e INCLUDE sono utilizzati in modo simile a CDATA: <![IGNORE [DTD section]]> <![INCLUDE [DTD section]]> Nessuna parola chiave pu apparire allinterno di una dichiarazione e ogni sezione della DTD deve includere una dichiarazione completa o una serie di dichiarazioni, commenti e spazi vuoti. Vediamo un esempio dellutilizzo delle parole chiave: <![IGNORE[<!ELEMENT BCC (#PCDATA)> <!ATTLIST BCC HIDDEN CDATA #FIXED "TRUE">]]> <![INCLUDE[<!ELEMENT SUBJECT (#PCDATA)>]]> Questo frammento di codice indica allelaboratore di ignorare lelemento Bcc e lelenco di attributi e includere lelemento Subject.

Lezione

successiva

[ S o m m a r i o ]

http://www.html.it/xml/guida/ignore.htm [19/06/2001 14.11.08]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Istruzioni di elaborazione

Istruzioni di elaborazione
Le istruzioni di elaborazione (PI, Processing Instructions) forniscono indicazioni allapplicazione che elabora il documento. Queste istruzioni vengono in genere visualizzate nel prologo, ma possono essere posizionate in un punto qualsiasi del documento XML. Listruzione di elaborazione pi comune la dichiarazione XML inclusa nella parte superiore del documento di esempio: <?xml version=1.0"?> Le istruzioni di elaborazione sono scritte con la sequenza <?, seguita dal nome dellistruzione, da un valore o da unistruzione e sono chiuse con ?>. Il nome o la destinazione di PI identifica quale applicazione dovrebbe seguire le istruzioni. Esempi di istruzioni di elaborazione sono: <?AVI CODEC="VIDEO1" COLORS="256"?> <?WAV COMPRESSOR="ADPCM" BITS="8" RESOLUTION="16"?>

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/pi.htm [19/06/2001 14.11.10]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Commenti

Commenti
I commenti rappresentano una delle parti generiche della DTD. Anche se i commenti non sono necessari, vengono ampiamente utilizzati per migliorare la leggibilit di un documento. E possibile aggiungere commenti per spiegare lo scopo di una determinata sezione della DTD, per indicare il significato dei riferimenti e per altri obiettivi. I commenti si rivelano utili come promemoria durante le fasi della codifica, se si verifica la necessit di tornare alla DTD ed effettuare le modifiche oppure se un altro autore utilizza il documento. I commenti non sono vincolati alla DTD e possono essere utilizzati in tutto il documento. Dato che i commenti sono a vantaggio esclusivo del lettore, qualsiasi elaboratore di XML ne ignorer la presenza. I commenti vengono visualizzati tra tag di commento (<!-- -->) e possono includere qualsiasi combinazione di testo, markup e simboli a eccezione di combinazioni di simboli che costituiscono i tag di commento.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/commenti.htm [19/06/2001 14.11.13]

XML: Capitolo III: Definizione del tipo di documento (DTD) - DTD esterne

DTD esterne
E possibile separare documenti e DTD per semplificarne lutilizzo. Dopo aver creato una DTD separata, possibile farvi riferimento allinterno di qualsiasi documento. Per separare una parte della DTD nel documento XML basta tagliare semplicemente la porzione di DTD e incollarla nel nuovo file di testo. Il nuovo nome di file dovrebbe avere estensione .dtd. La separazione della DTD dal documento riduce notevolmente la dimensione del file del documento XML e fornisce altri vantaggi. Dato che ora la DTD un file separato, pu essere utilizzata in altri documenti da chiunque vi abbia accesso. Un altro autore pu creare un documento utilizzando la stessa struttura con un contenuto completamente diverso. Poich il nuovo documento seguirebbe la DTD, potrebbe essere letto da qualsiasi applicazione in grado di elaborare la DTD.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/dtdest.htm [19/06/2001 14.11.15]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Vocabolari

Vocabolari
Un vocabolario XML un insieme di elementi e della struttura di un tipo di documento specifico. I vocabolari sono definiti in una DTD che rappresenta il regolamento per quel vocabolario. I vocabolari sono utilizzati correntemente su Internet e in alcune organizzazioni e aziende. Uno dei vocabolari principali e maggiormente noti il Channel Definition Format (CDF) impiegato per definire le pagine Web progettate per essere inviate automaticamente agli utenti client. I vocabolari sono adatti per le applicazioni verticali e per lo sviluppo di sistemi di interscambio di dati per aziende specifiche, ad esempio telecomunicazioni, prodotti farmaceutici e istituzioni legali. CHANNEL DEFINITION FORMAT Channel Definition Format (CDF) viene utilizzato per descrivere il comportamento delle pagine Web in un modello di invio automatico. CDF viene utilizzato da Microsoft Internet Explorer e descrive i processi quali pianificazioni di download, visualizzazione della barra dei canali, utilizzo delle pagine e frequenza degli aggiornamenti. OPEN FINANCIAL EXCHANGE Open Financial Exchange (OFX) correntemente unapplicazione SGML utilizzata da pacchetti software per comunicare con le istituzioni finanziarie. OFX sar presto basato sul linguaggio XML. OPEN SOFTWARE DESCRIPTION Open Software Description (OSD) un formato di dati utilizzato per consentire laggiornamento e linstallazione di software tramite Internet. Questo formato particolarmente utile per notificare agli utenti la disponibilit di nuove versioni di software e per fornire un meccanismo per ottenere i programmi da Internet. ELECTRONIC DATA INTERCHANGE Electronic Data Interchange (EDI) viene utilizzato correntemente in tutto il mondo per lo scambio di dati e per il supporto delle transazioni. Nellimplementazione corrente tuttavia pu essere utilizzato solo da organizzazioni che hanno impostato lo scambio di informazioni mediante sistemi compatibili. Il linguaggio XML pu ampliare la portata di EDI e renderlo pi accessibile a un maggior numero di organizzazioni.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/vocabo.htm [19/06/2001 14.11.18]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Spazio dei nomi XML (XML Namespace)

Spazio dei nomi XML (XML Namespace)


Come sappiamo XML un linguaggio per definire linguaggi, cio insiemi di marcatori personalizzati e le loro sintassi di utilizzo. Questa operazione avviene attraverso i DTD che definiscono gli insiemi di marcatori che saranno utilizzati nei documenti e le loro regole di nidificazione. I marcatori XML che saranno definiti nei DTD adottati sui siti Web possono anche non essere inventati dai Webmaster, ma possono appartenere a repertori standard per i vari domini applicativi (i cosiddetti XML namespace), garantendo luniformit sintattica delle pagine Web necessaria al funzionamento degli agenti. I Namespace permettono la creazione e luso di marcatori ambigui, ovvero con lo stesso nome, ma in riferimento a significati e ambienti diversi utilizzando costrutti con nomi non equivoci. Pensiamo per esempio a documenti di una rivista in cui la parola "titolo" a secondo del contesto pu referenziare il titolo di una rivista, ma anche il ruolo di un giornalista allinterno della struttura aziendale. I dati, ovvero il contenuto di un documento XML, vengono recuperati analizzando i singoli nodi allinterno del documento, meccanismo consentito dal fatto che la struttura gerarchica dei documenti XML e le regole di validit e di ben formato che gestiscono la creazione dei documenti XML garantiscono che ogni nodo presente in un documento unico. Questo garantisce a sua volta che esista un solo riferimento per ciascun nodo. Lutilizzo di documenti XML in un ambiente di collaborazione potrebbe tuttavia dare luogo a potenziali problemi. Ad esempio, due o pi documenti potrebbero contenere elementi con gli stessi nomi, ma con semantica differente. I documenti possono essere strutturati nello stesso modo. Qualora fosse necessario utilizzare entrambi i documenti in un unico ambiente, la sovrapposizione di elementi sarebbe causa di confusione. Consideriamo ad esempio: <AUTOMOBILE> <ID>232-HDF</ID> </AUTOMOBILE> <DOG> <ID>Rover</ID> </DOG> Gli elementi Automobile e Dog contengono un elemento Id ciascuno, ma tale Id assume significato differente nei due casi. Se questi elementi provenienti da fonti diverse sono stati combinati in un solo documento, gli elementi Id perdono il significato originale. Questo problema, tuttaltro che trascurabile, potrebbe aggravarsi parallelemente alla diffusione dellutilizzo del linguaggio XML sul Web e nelle organizzazioni. La soluzione offerta dagli spazi dei nomi, che consentono di creare nomi univoci indipendentemente dalla posizione in cui gli elementi vengono utilizzati, garantendo luniformit sintattica delle pagine Web.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/spazio.htm [19/06/2001 14.11.20]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Creazione di nomi univoci tramite gli spazi dei nomi XML

Creazione di nomi univoci tramite gli spazi dei nomi XML


La definizione spazio dei nomi utilizzata dal programmatore tradizionale per indicare un gruppo di nomi in cui non esistono duplicati. Poich la natura del linguaggio XML consente di definire set di tag personalizzati, che potrebbero dar luogo a nomi duplicati nei documenti XML, nel linguaggio XML gli spazi dei nomi offrono caratteristiche aggiuntive. Costituiscono infatti una metodologia per la creazione di nomi universalmente univoci in un documento XML identificando i nomi degli elementi con una risorsa esterna univoca. Nel linguaggio XML uno spazio dei nomi pertanto una raccolta di nomi identificata da un URI e pu essere qualificato o non qualificato. NOMI QUALIFICATI NellXML un nome qualificato si compone in due parti: il nome dello spazio dei nomi e la parte locale. Il nome dello spazio dei nomi, ovvero un URI, definisce lo spazio dei nomi, mentre la parte locale corrisponde al nome dellelemento o dellattributo del documento locale. Poich lURI sempre univoco, il nome dello spazio dei nomi crea insieme alla parte locale un nome di elemento universalmente univoco. Per poter utilizzare uno spazio dei nomi in documento XML, necessario includere una dichiarazione dello spazio dei nomi nel prologo del documento. E inoltre possibile includere nella dichiarazione un prefisso dello spazio dei nomi. Utilizzando i due punti (:), il prefisso pu essere aggiunto alla parte locale in modo da associarla al nome dello spazio dei nomi. Nel documento riportato nellesempio che segue, i due spazi dei nomi vengono dichiarati con prefissi, quindi utilizzati nel documento. <?xml version="1.0"?> <?xml:namespace ns=http://inventory/schema/ns prefix="inv"?> <?xml:namespace ns=http://wildflowers/schema/ns prefix="wf"?> <PRODUCT> <PNAME>Test1</PNAME> <inv:quantity>1</inv:quantity> <wf:price>323</wf:price> <DATE>6/1</DATE> </PRODUCT> In questo esempio di codice, i prefissi vengono utilizzati per identificare elementi appartenenti allo spazio dei nomi selezionato. Si otterranno in questo modo nomi univoci, ma anche la conservazione del valore semantico dei nomi. Gli elementi inv:quantity e wf:price contengono nomi completamente qualificati che risulteranno univoci indipendemente dalla posizione in cui sono stati utilizzati. Il prefisso parte del nome dellelemento e deve essere sempre incluso in modo tale da indicare che lelemento appartiene allo spazio dei nomi. NOMI NON QUALIFICATI Un nome non qualificato non dispone di nome associato al nome dello spazio dei nomi. I nomi di elementi XML tipici non sono qualificati poich non specificano uno spazio dei nomi. AREA DI VALIDITA DELLO SPAZIO DEI NOMI Il prologo non lunica opzione disponibile per la posizione della dichiarazione dello spazio dei nomi. E infatti possibile includere tale dichiarazione direttamente allinterno di un elemento appartenente allo spazio dei nomi. A questo scopo, sufficiente includere la dichiarazione la prima volta che si utilizza lelemento, come mostrato nellesempio che segue: <PRODUCT> <PNAME>Test1</PNAME> <inv:quantity>1</inv:quantity> <wf:price xmlns:wf="urn:shemas-wildflowers-com:xml-prices">

http://www.html.it/xml/guida/spazio2.htm (1 di 3) [19/06/2001 14.11.24]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Creazione di nomi univoci tramite gli spazi dei nomi XML

323 </wf:price> <DATE>6/1</DATE> </PRODUCT> Lo spazio dei nomi risulta quindi disponibile nel contesto dellelemento specifico, ovvero tale elemento e tutti i relativi elementi secondari possono utilizzare lo spazio dei nomi. Se dichiarato nellelemento del documneto, lo spazio dei nomi pu essere utilizzato nellintero documento. SPAZIO DEI NOMI PREDEFININTI E possibile impostare come predefinito uno spazio dei nomi dichiarandolo senza lassegnazione di un prefisso. In questo caso, lo spazio dei nomi viene considerato allinterno del contesto dellelemento in cui stato dichiarato, come mostrato nel seguente esempio di codice: <CATALOG> <INDEX> <ITEM>Trees</ITEM> <ITEM>Wildflowers</ITEM> </INDEX> <PRODUCT xmlns:wf="urn:shemas-wildflowers-com> <NAME>Bloodroot</NAME> <QUANTITY>10</QUNTITY> <PRICE>$2.44</PRICE> </PRODUCT> </CATALOG> Lelemento Product contiene la dichiarazione di uno spazio dei nomi senza prefisso associato. In quanto tale, lo spazio dei nomi viene utilizzato per lelemento Product e tutti i relativi elementi secondari, ma per nessun altro elemento oltre Product. DICHIARAZIONE DELLO SPAZIO DEI NOMI COME URL O URN In quanto univoci, gli URL possono essere utilizzati per rendere univoci i nomi degli spazi dei nomi. Se uno spazio dei nomi mappato a un URL, tale spazio dei nomi risulter univoco nellintero contesto in cui viene utilizzato. Unaltra situazione tipica rappresentata dallesistenza di uno schema dello spazio dei nomi che identifica tutti i nomi contenuti nello spazio dei nomi e il modo in cui sono strutturati. Il nome dello spazio dei nomi XML non fornisce alcun meccanismo per il recupero di tale schema, meccanismo che tuttavia pu essere reso disponibile utilizzzando gli URN (Uniform Resource Names). Un URN consente di individuare e recuperare un file di schema che definisce un determinato spazio dei nomi. Sebbene funzionalit simili possano essere fornite da un comune URL, a questo scopo lURN pi efficiente e facile da gestire poich pu essere riferito a pi URL. Il codice seguente mostra lutilizzo di un URN nel contesto di uno spazio dei nomi XML: <CATALOG> <INDEX> <ITEM>Trees</ITEM> <ITEM>Wildflowers</ITEM> </INDEX> <wf:product xmlns:wf="urn:shemas-wildflowers-com> <wf:name>Bloodroot>/wf:name> <QUANTITY>10</QUNTITY> <PRICE>$2.44</PRICE> </wf:product> </CATALOG> Lo schema relativo allo spazio dei nomi disponibile nella posizione identificata dallURN e lapplicazione di elaborazione in grado di recuperare tale schema. Lo schema contiene informazioni dettagliate relative agli elementi dello spazio dei nomi utilizzabili nel documento. SPAZIO DEI NOMI DEGLI ATTRIBUTI

http://www.html.it/xml/guida/spazio2.htm (2 di 3) [19/06/2001 14.11.24]

XML: Capitolo III: Definizione del tipo di documento (DTD) - Creazione di nomi univoci tramite gli spazi dei nomi XML

Gli spazi dei nomi sono applicabili cos come agli elementi, anche agli attributi. Ad esempio: <wf:product TYPE="plant" class:kingdom="plantae" xmlns:wf="urn:wildflowers:schemas:product" xmlns:class="urn:bio:botany:classification"> <PNAME>Test1</PNAME> <QUANTITY>1</QUNTITY> <PRICE>323</PRICE> <DATE>6/1</DATE> </wf:product> In questo esempio sia allelemento wf:product che allattributo class:kingdom sono associate dichiarazioni degli spazi dei nomi. Lo spazio dei nomi degli attributi viene utilizzato in modo simile allo spazio dei nomi degli elementi. Limportanza degli spazi dei nomi aumenta parallelemente allo sviluppo di nuovi vocabolari e di nuove tecnologie basate sul linguaggio XML. Sono comunque gi tecnologie che utilizzano gli spazi dei nomi, tra cui XML-Data, i tipi di dati XML e il linguaggio SMIL (Syncronized Multimedia Integration Language).

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/spazio2.htm (3 di 3) [19/06/2001 14.11.24]

XML: Capitolo IV: Ampliare i documenti XML

Ampliare i documenti XMLAmpliare i documenti XML


Abbiamo visto come, seguendo la specifica del linguaggio XML, sia possibile creare dei DTD personali e dei documenti XML. Il fatto che sia possibile creare dei DTD personali, rende lXML un metalinguaggio, cio un linguaggio di livello superiore con cui possibile creare altri linguaggi. Il gruppo di lavoro del W3C, fornita la prima versione stabile della specifica XML, ha orientato gran parte dei suoi sforzi proprio nello sviluppo di linguaggi di markup basati sullXML, orientati ad argomenti che fanno contorno allambiente in cui lXML si trova ad operare. Anche in questo caso lo scopo del gruppo di lavoro quello di creare degli standard per argomenti fondamentali quali i collegamenti ipertestuali, la rappresentazione di strutture dati relazionali o ad oggetti e i fogli di stile.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/amplia.htm [19/06/2001 14.11.28]

XML: Capitolo IV: Ampliare i documenti XML - XSL: l'XML con i fogli di stile

XSL: l'XML con i fogli di stile


LXML ha sempre riguardato i dati. LXML commenta semanticamente un documento, fornendo la struttura e il contesto per i dati che contiene. Non tuttavia indicato quale dovrebbe essere laspetto dei dati visualizzati. Lutilizzo diretto del linguaggio HTML certamente un modo efficace per formattare i documenti XML, ma esiste unalternativa: XSL (Extensible Stylesheet Language), ossia un linguaggio creato esclusivamente per lutilizzo con i documenti XML. LXSL unapplicazione di XML, quindi la sua struttura e la sua sintassi sono identiche a quelle dellXML.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/xsl.htm [19/06/2001 14.11.31]

XML: Capitolo IV: Ampliare i documenti XML - Nozioni fondamentali sul linguaggio XSL

Nozioni fondamentali sul linguaggio XSL


LXSL si basa su un meccanismo di fogli di stile. I fogli di stile vengono generalmente usati per applicare in modo coerente stili o formattazione ai documenti. Il tipo di foglio di stile pi utilizzato sul Web basato sulla specifica dei fogli di stile CSS (Cascading Style Sheets). Questi permettono agli utenti di definire le classi di stile che possono essere applicate al documento HTML. LXSL offre lo stesso livello di formattazione e di flessibilit dei fogli di stile CSS e molte altre caratteristiche, ma utilizza metodi diversi. LXSL si basa su modelli, che sono sotto alcuni aspetti analoghi alle regole dei fogli di stile e che offrono il meccanismo per lapplicazione di informazioni di formattazione ai dati che rispondono a un particolare pattern.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/nozioni.htm [19/06/2001 14.11.33]

XML: Capitolo IV: Ampliare i documenti XML - Componenti del linguaggio XSL

Componenti del linguaggio XSL


Il linguaggio XSL composto da due componenti: un linguaggio di trasformazione XSL e una specifica (vocabolario) di formattazione di un oggetto. Questi due elementi sono distinti, ma possibile utilizzarli insieme per ottenere funzionalit di formattazione sofisticate per la visualizzazione del documento. Il linguaggio di trasformazione XSL e la specifica di formattazione delloggetto vengono implementati come spazi dei nomi. LINGUAGGIO DI TRASFORMAZIONE XSL Il linguaggio di trasformazione XSL (spazio del nome xsl) dimostra come un elaboratore pu trasformare la struttura di un documento XML in unaltra struttura. Il processo di trasformazione converte quindi la struttura di un documento in unaltra struttura di documento. Lutilizzo di questo linguaggio quindi convertire un documento XML da una struttura semantica a una struttura di visualizzazione, quale la conversione di un documento XML in documento HTML. In realt, questa non lunica possibilit, dal momento che il processo di trasformazione totalmente indipendente dal risultato finale. Questo consente una grande flessibilit per il futuro, dal momento che lXSL, potrebbe trasformare documenti in nuove strutture. SPECIFICA DI FORMATTAZIONE DELLOGGETTO La specifica di formattazione delloggetto (spazio del nome fo) fornisce una nuova semantica di formattazione sviluppata come vocabolario XML. Un motore di visualizzazione pu quindi elaborare direttamente le informazioni di formattazione contenute nello spazio del nome fo (a differenza delle informazioni dello spazio del nome xsl) oppure un elaboratore pu trasformare le informazioni in altre strutture di formattazione, ad esempio in codice HTML. La differenza tra questo metodo e il metodo dello spazio del nome xsl consiste nel fatto che il metodo dello spazio del nome fo connesso in modo specifico alla formattazione della semantica, consentendo cos di sviluppare i vocabolari per applicazioni specifiche, quali le applicazioni multimediali. La funzionalit dello spazio del nome xsl finalizzata alla trasformazione del modello di oggetti Document ed indipendente dalla semantica di formattazione.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/compone.htm [19/06/2001 14.11.36]

XML: Capitolo IV: Ampliare i documenti XML - Fogli di stile XSL

Fogli di stile XSL


LXSL include la funzionalit di trasformazione del documento di origine XML in unaltra struttura. E possibile fare questo mediante luso di fogli di stile. I fogli di stile XSL indicano la procedura in base alla quale deve essere creata la struttura.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/fogli.htm [19/06/2001 14.11.38]

XML: Capitolo IV: Ampliare i documenti XML - Utilizzo dei modelli

Utilizzo dei modelli


Un foglio di stile comprende uno o pi modelli che a loro volta contengono dei pattern. I modelli forniscono la struttura dei documenti generati dal codice. Gli elementi generati possono essere di qualsiasi tipo, poich non necessario che i modelli XSL contengano riferimenti ai dati XML. La reale potenzialit dei fogli di stile consiste nel generare dati XML in nuovi documenti. I modelli XSL fanno riferimento ai dati XML mediante i pattern. PATTERN Il linguaggio XSL utilizza i pattern per specificare gli elementi XML a cui viene applicato il modello XSL. Questo metodo di corrispondenza dei pattern rende XSL un linguaggio di dichiarazioni in contrapposizione con i linguaggi basati sulle procedure. Questo significa che i pattern definiscono il "livello" specifico della struttura del documento da far corrispondere identificandone la gerarchia della struttura. Per avere unidea della struttura di un modello, sar sufficiente prendere in esame un semplice foglio di stile. Sar quindi necessario creare un documento XML a cui applicare il foglio di stile: <CATALOG> <PLANT> <COMMON>Bloodroot</COMMON> <BOTANICAL>Sanguinaria canadensis</BOTANICAL> <ZONE>4</ZONE> <LIGHT>Mostly Shady</LIGHT> <PRICE>$7.05</PRICE> <AVAILABILITY USONLY="true">02/01/99</AVAILABILITY> </PLANT> </CATALOG> Quindi procedere con la creazione di un foglio di stile XSL per un unico modello dellelemento Common: <?xml version="1.0"?> <xsl:template xmlns:xsl="uri:xsl"> <HTML> <BODY> <xsl:repeat for="CATALOG/PLANT"> <DIV> <SPAN STYLE="font-weight:bold; font-size:20"> <xsl:get-value for="COMMON"/> </SPAN> </DIV> </xsl:repeat> </BODY> </HTML> </xsl:template> Quando il documento XML viene elaborato con il foglio di stile XSL, lelaboratore genera il seguente codice HTML: <HTML> <BODY> <DIV> <SPAN STYLE="font-weight:bold; font-size:20"> Bloodroot </SPAN> </DIV> </BODY> </HTML>

http://www.html.it/xml/guida/modelli.htm (1 di 4) [19/06/2001 14.11.44]

XML: Capitolo IV: Ampliare i documenti XML - Utilizzo dei modelli

ANALISI DEL MODELLO Ogni modello comprende uno o pi pattern. Lesempio che segue riporta la sezione che contiene due pattern: <xsl:repeat for="CATALOG/PLANT"> <DIV> <SPAN STYLE="font-weight:bold; font-size:20"> <xsl:get-value for="COMMON"/> </SPAN> </DIV> </xsl:repeat> Il primo pattern specifica qualsiasi elemento Plant secondario allelemento Catalog. Il secondo pattern per questa regola specifica lelemento Common. In base alla regola, qualsiasi dato trovato nellelemento del pattern verr inserito nellelemento Span a cui viene quindi applicato lo stile "font-weight:bold; font-size:20". Questo modello espresso in modo discorsivo, sarebbe formulato nel seguente modo: "Ripetere quanto segue per ogni elemento Plant secondario dellelemento Catalog: prendere il valore dellelemento Common e inserirlo nellelemento Span applicando il grassetto e una dimensione di carattere pari a 20". Il modello viene applicato a ogni elemento che risponda al pattern o ai criteri definiti in esso. Questa una delle potenzialit del linguaggio XSL. Utilizzando le funzionalit di pattern matching, o corrispondenza dei pattern, del linguaggio XSL, possibile riorganizzare in modo efficiente i dati XML, per soddisfare esigenze precise. Se non si desidera includere uno o pi elementi nel risultato finale, sar sufficiente escludere il pattern relativo a tali elementi. Se invece si desidera includere un unico elemento in una sezione specifica del documento, possibile creare un pattern dettagliato per convertirlo per la visualizzazione. STRUTTURA A MODELLO SINGOLO Il modello inizia con il tag <xsl:template xmlns:xsl="uri:xsl"> e termina con il tag </xsl:template>. Questi due tag, o contenitori, facilitano lapplicazione di diverse sezioni del foglio di stile quando vengono utilizzati pi modelli. Dal momento che questo foglio di stile contiene un solo modello, possibile utilizzare anche il contenitore <xsl:document> </xsl:document>. Ad esempio il foglio di stile seguente equivale a quello precedente: <?xml version="1.0"?> <xsl:document xmlns:xsl="uri:xsl"> <HTML> <BODY> <xsl:repeat for="CATALOG/PLANT"> <DIV> <SPAN STYLE="font-weight:bold; font-size:20"> <xsl:get-value for="COMMON"/> </SPAN> </DIV> </xsl:repeat> </BODY> </HTML> </xsl:document> Ambedue i fogli di stile sono esempi di una struttura a modello singolo, ossia ciascuno dei due fogli di stile costituito da un unico modello. Ma un foglio di stile pu avere anche una struttura a pi modelli, nella quale il foglio di stile contiene pi modelli che possono essere applicati indipendentemente dagli altri. STRUTTURA A PIU MODELLI Un foglio di stile a pi modelli utilizza i tag <xsl:stylesheet> </xsl:stylesheet>, che a loro volta possono contenere diverse coppie di tag <xsl:template> </xsl:template>. Ciascuna di queste coppie pu essere applicata indipendentemente dalle altre. Nellesempio che segue possibile esaminare in modo pi approfondito questa struttura: <CATALOG> <PLANT BESTSELLER="no"> <NAME> <COMMON>Bloodroot</COMMON> <BOTAN>Sanguinaria canadensis</BOTAN> </NAME>

http://www.html.it/xml/guida/modelli.htm (2 di 4) [19/06/2001 14.11.44]

XML: Capitolo IV: Ampliare i documenti XML - Utilizzo dei modelli

<GROWTH> <ZONE>4</ZONE> <LIGHT>Mostly Shady</LIGHT> </GROWTH> <SALESINFO> <PRICE>$3.00</PRICE> <AVAILABILITY>4/21/99</AVAILABILITY> </SALESINFO> </PLANT> <PLANT BESTSELLER="yes"> <NAME> <COMMON>Columbine</COMMON> <BOTAN>Aquilegia canadensis</BOTAN> </NAME> <GROWTH> <ZONE>3</ZONE> <LIGHT>Mostly Shady</LIGHT> </GROWTH> <SALESINFO> <PRICE>$9.00</PRICE> <AVAILABILITY>4/10/99</AVAILABILITY> </SALESINFO> </PLANT> <PLANT BESTSELLER="no"> <NAME> <COMMON>Marsh Marigold</COMMON> <BOTAN>Caltha palustris</BOTAN> </NAME> <GROWTH> <ZONE>4</ZONE> <LIGHT>Mostly Sunny</LIGHT> </GROWTH> <SALESINFO> <PRICE>$9.00</PRICE> <AVAILABILITY>4/19/99</AVAILABILITY> </SALESINFO> </PLANT> </CATALOG> Nel listato seguente riportato il foglio di stile dellesempio precedente, il quale contiene diversi modelli che vengono applicati in modo indipendente alle diverse sezioni del documento XML: <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="uri:xsl"> <xsl:template match="/"> <HTML> <BODY> <TABLE BORDER="1"> <TR STYLE="font-weight:bold"> <TD>Common Name</TD> <TD>Botanical Name</TD> <TD>Zone</TD> <TD>Light</TD> <TD>Price</TD> <TD>Availability</TD> </TR> <xsl:for-each select="CATALOG/PLANT"> <TR> <xsl:apply-templates/> </TR> </xsl:for-each> </TABLE> </BODY> </HTML> </xsl:template> <xsl:template match="NAME"> <TD><xsl:value-of select="COMMON"/></TD> <TD><xsl:value-of select="BOTAN"/></TD> </xsl:template>

http://www.html.it/xml/guida/modelli.htm (3 di 4) [19/06/2001 14.11.44]

XML: Capitolo IV: Ampliare i documenti XML - Utilizzo dei modelli

<xsl:template match="GROWTH"> <TD><xsl:value-of select="ZONE"/></TD> <TD><xsl:value-of select="LIGHT"/></TD> </xsl:template> <xsl:template match="SALESINFO"> <TD><xsl:value-of select="PRICE"/></TD> <TD><xsl:value-of select="AVAILABILITY"/></TD> </xsl:template> </xsl:stylesheet> Il foglio di stile inizia con il tag <xsl:stylesheet> e termina con il tag </xsl:stylesheet>. La sigla xmlns una parola riservata e serve per identificare un particolare namespace; ad esempio in questo caso tutte le parole riservate che iniziano con xsl: fanno parte del vocabolario individuato dallURL htttp://www.w3.org/TR/WD-xsl. Dal momento che il documento XML pu avere un solo elemento principale e che lXSL un profilo di XML, il solo elemento xsl:stylesheet consente di includere pi elementi xsl:template nel foglio di stile. Il pattern di questo modello semplicemente "/" e definisce lelemento principale del documento XML. E presente anche lelemento xsl:for-each allinterno del modello, che definisce un altro pattern, CATALOG/PLANT, e stabilisce che la struttura generata che segue deve essere applicata a ogni sezione corrispondente al pattern. Allinterno di tale struttura contenuto lelemento xsl:apply-templates che avvia la ricerca da parte dellelaboratore di altri modelli nel foglio di stile, ciascuno con il suo pattern. Poich lelemento xsl:apply-templates si trova allinterno del pattern CATALOG/PLANT, gli altri modelli verranno applicati solo quando verr trovata una corrispondenza allinterno dellelemento. Ad esempio, il modello NAME verr applicato solo agli elementi nella gerarchia CATALOG/PLANT/NAME. Facciamo una sintesi di quanto visto fino ad ora. Il linguaggio XSL trasforma lXML in elementi di output. Questi elementi di output vengono tipicamente utilizzati per preparare i dati per la visualizzazione applicando formattazione ai dati XML, ma questo non ne costituisce lunico utilizzo possibile. Questa trasformazione avviene in questa sequenza: 1. Un foglio di stile specifica pattern che corrispondono ai dati rilevati nel documento XML. Questi pattern fanno parte di singoli modelli che contengono strutture di output.

2. Lelaboratore rileva i dati che corrispondono ai pattern e li converte nella


struttura di output.

3. Una volta elaborato lintero foglio di stile, nella memoria del computer esiste
una nuova struttura di dati basata sulloutput del foglio di stile.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/modelli.htm (4 di 4) [19/06/2001 14.11.44]

XML: Capitolo IV: Ampliare i documenti XML - Visualizzazione degli elementi di output

Visualizzazione degli elementi di output


A questo punto introduciamo un nuovo concetto relativo al linguaggio XSL: la visualizzazione. Fino a poco tempo non esistevano software XML che erano in grado di visualizzare un file XML secondo quanto espresso nei principi base del progetto del consorzio W3. La situazione era quindi tale che in attesa di un processore o di un browser che supportasse completamente XML si potevano seguire diverse strade, ad esempio visualizzare i file XML con viewer SGML, utilizzare lActive X Msxml, generare off-line dei file HTML da sorgenti XML e XSL utilizzando script . Questa ultima modalit consentiva di elaborare e visualizzare contemporaneamente il documento, in modo che lutente non doveva far altro che controllarne il risultato. Pur essendo una modalit ottima per una fase di passaggio pur sempre lontana dalla filosofia di partenza del progetto XML, che prevede lutilizzo diretto di XML sul Web, perch comunque deve sempre tener conto dei limiti di HTML. La Microsoft quella che per prima ha gi sviluppato due parser XML che si integrano con il suo ultimo browser. Infatti con lavvento di Microsoft Internet Explorer 5 possibile adesso visualizzare i dati XML utilizzando i fogli di stile XSL come dei file HTML e indipendentemente da questi. Per visualizzare un file XML utilizzando XSL bisogna indicare il tipo e la locazione del foglio di stile XSL con le istruzioni di elaborazione (PI). La forma base per queste istruzioni di elaborazione sono del tipo <?xml-stylesheet type="text/xsl" href="mystyle.xsl"?> Quando Internet Explorer 5 sfoglia il documento XML, elabora listruzione di elaborazione, scarica il foglio di stile e lo utilizza per visualizzare il documento XML. Il valore dellattributo type descrive il tipo del foglio di stile da attuare, se XSL "text/xsl" se CSS "text/css". Lattributo href un collegamento URL relativo al foglio di stile. Se il documento XML non contiene queste istruzioni di elaborazione, Internet Explorer 5 visualizzer il documento XML come un albero gerarchico con il codice di vario colore. Ecco come verr visualizzato lesempio utilizzato in questo capitolo usando Microsoft Explorer 5:

http://www.html.it/xml/guida/visual.htm (1 di 2) [19/06/2001 14.12.09]

XML: Capitolo IV: Ampliare i documenti XML - Visualizzazione degli elementi di output

Per quanto riguarda Netscape, che inizialmente non aveva dimostrato molto interesse verso XML, sembra essere ritornata sui suoi passi. La versione 5 del browser Navigator dovrebbe contenere un processore in grado di leggere e formattare i file XML.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/visual.htm (2 di 2) [19/06/2001 14.12.09]

XML: Capitolo IV: Ampliare i documenti XML - Estrazione dei dati dall'XML

Estrazione dei dati dall'XML


Molti elementi XSL possono essere utilizzati per recuperare dati dal documento XML. Gli elementi XSL combinati con gli attributi XSL forniscono altre prestazioni per il corretto recupero dei dati necessari dal documento XML. ELEMENTI XSL Gli elementi XSL si comportano come comandi e indicano allelaboratore XSL come gestire i dati. Di seguito riportiamo un elenco completo degli elementi XSL supportati: Elemento XSL Descrizione xsl:apply-templates xsl:attribute xsl:cdata xsl:choose Indica allelaboratore XSL di cercare il modello corretto da applicare, in base al pattern specificato. Genera un nodo di attributo e lo applica allelemento di output. Genera una sezione CDATA nelloutput. Consente di eseguire test condizionali. Questo elemento viene utilizzato in combinazione con gli elementi xsl:otherwise e xsl:when. Crea un commento nella struttura di output. Crea una copia del nodo di destinazione dalla fonte da includere nelloutput. Definisce un insieme di modelli a un specifico livello di validit. Genera un elemento nelloutput con il nome specificato. Genera un riferimento allentit nelloutput con il nome specificato. Valuta una stringa di testo, solitamente codice script. Applica lo stesso modello a pi nodi del documento. Consente test condizionali in un modello. Inserisce il nome del nodo corrente nelloutput come stringa di testo. Fornisce test condizionali. Questo elemento viene utilizzato in combinazione con gli elementi xsl:choose e xsl:when. Genera un istruzione di elaborazione nelloutput. Definisce dichiarazioni e funzioni di variabili globali. Definisce linsieme di modelli che vengono applicati alla struttura del documento di origine per generare il documento di output. Definisce un modello per loutput basato su un pattern specifico. Valuta un pattern XSL specificato nellattributo select e restituisce il valore del nodo identificato come testo, che verr poi inserito nel modello.

xsl:comment xsl:copy xsl:define-template-set xsl:element xsl:entity-ref xsl:eval xsl:for-each xsl:if xsl:node-name xsl:otherwise

xsl:pi xsl:script xsl:stylesheet

xsl:template xsl:value-of

http://www.html.it/xml/guida/estrazio.htm (1 di 2) [19/06/2001 14.12.46]

XML: Capitolo IV: Ampliare i documenti XML - Estrazione dei dati dall'XML

xsl:when

Fornisce test condizionali. Questo elemento viene utilizzato in combinazione con gli elementi xsl:choose e xsl:otherwise.

METODI XSL Oltre agli elementi, nellXSL sono inclusi anche metodi. Questi metodi possono essere chiamati dallelemento xsl:eval o da un normale codice script. Ad esempio, il metodo formatIndex potrebbe essere utilizzato come di seguito: <xsl:template match="NAME"> <TD STYLE="font-style:italic; font-size:20"> <xsl:value-of select="COMMON"/> item number: <xsl:eval> formatIndex(childNumber(this),"1") </xsl:eval> </TD> </xsl:template> Ecco un elenco dei metodi supportati: Metodo XSL AbsoluteChildNumber AncestorChildNumber ChildNumber Depth ElementIndexList

Descrizione

Restituisce il numero del nodo specificato relativo a tutti gli elementi di pari livello. Restituisce il numero del predecessore di un nodo con il nome specificato. Restituisce il numero del nodo relativo agli elementi di pari livello. Restituisce, per il nodo specificato, il livello gerarchico allinterno della struttura del documento. Restituisce una matrice di numeri secondari per il nodo specificato e per tutti i nodi principali. Questo elemento ricorsivo fino al nodo principale. Formatta la data mediante le opzioni di formattazione specificate. Formatta il numero intero fornito utilizzando il sistema numerico specificato. Formatta il numero fornito utilizzando il formato specificato. Formatta lora mediante le opzioni di formattazione specificate. Restituisce lunico identificatore per il nodo specificato.

FormatDate FormatIndex FormatNumber FormatTime UniqueID

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/estrazio.htm (2 di 2) [19/06/2001 14.12.46]

XML: Capitolo IV: Ampliare i documenti XML - XLL: collegamenti con il linguaggio XML

XLL: collegamenti con il linguaggio XML


Il linguaggio XML in grado di fornire un metodo pi efficiente per collegare le informazioni sul Web tramite unapplicazione XML denominata XLink e inoltre anche un meccanismo che consente i collegamenti a strutture interne di un documento XML denominato XPointer. Le principali propriet dellXLL sono:
q

Link multi direzionali: ad esempio lHTML fornisce solo link mono direzionali; per questo tipo di link lunico modo per tornare "indietro" quello di utilizzare lapposito pulsante. Invece in un link bi-direzionale per esempio, un utente pu tornare indietro utilizzando lo stesso link che gli ha permesso di arrivare a destinazione. Link a destinazione multipla: da un singolo link, un utente pu scegliere fra differenti destinazioni. Link ad effetto multiplo: si pu fare in modo che la risorsa collegata sostituisca il documento attivo, oppure che sia visualizzata in una nuova finestra, o infine che sia inserita direttamente nel documento attivo. Link ad attivazione multipla: si pu fare in modo che il link sia attivato da un click dellutente, oppure che sia attivato automaticamente quando individuato dallapplicazione di elaborazione.

q q

Vediamo in dettaglio le due componenti dellXLL.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/xll.htm [19/06/2001 14.13.04]

XML: Capitolo IV: Ampliare i documenti XML - XLink: il sistema per i collegamenti XML

XLink: il sistema per i collegamenti XML


LXLink utilizza il linguaggio XML per definire tutti i componenti necessari per creare collegamenti nei documenti XML e definisce due tipi di collegamenti fondamentali: i collegamenti semplici e i collegamenti estesi. Realizzato in modo tale da mantenere semplicit dei collegamenti HTML, lXLink fornisce tuttavia maggiori efficienza ed estensibilit.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/xlink.htm [19/06/2001 14.13.11]

XML: Capitolo IV: Ampliare i documenti XML - Collegamenti semplici nell'XML

Collegamenti semplici nell'XML


I collegamenti XML dovrebbero pi opportunamente essere considerati risorse di connessione. Questo significa che l'XLink in grado di fornire il collegamento a qualunque risorsa raggiungibile tramite un localizzatore nellelemento di collegamento. Questo concetto non specifico dellXLink: la nozione di risorse legata al funzionamento del World Wide Web. LXLink fornisce tuttavia una sintassi pi sofisticata per la definizione degli elementi e del comportamento dei collegamenti, ad esempio la capacit di un collegamento di funzionare in pi direzioni. LXLink inoltre pi flessibile e consente a un documento di collegarsi a qualsiasi tipo di risorsa raggiungibile sul Web. Come nellHTML, i collegamenti semplici sono collegamenti in linea, ovvero fanno parte dellelemento e funzionano in una sola direzione. Un collegamento semplice ha un solo identificatore di risorsa, o localizzatore. Il localizzatore, ad esempio lattributo HREF nellelemento Anchor, contiene i dati relativi al collegamento. NellXLink, tutte le informazioni sul localizzatore sono contenute allinterno dellelemento di collegamento. Pertanto, lapplicazione di elaborazione non avr bisogno di recuperare altre informazioni sul localizzatore. Il primo esempio di collegamento riportato contiene un collegamento XML semplice. La creazione di un elemento di collegamento semplice nellXML comporta maggiori difficolt rispetto alla creazione di un elemento Anchor e allassegnazione di un valore HREF. LXML un metalinguaggio, pertanto la creazione di un nuovo elemento che possa essere utilizzato in un documento richiede la dichiarazione dellelemento e di tutti i relativi attributi. Il linguaggio XML e la specifica XLink forniscono unampia gamma di efficienti opzioni per la creazione di collegamenti. Creiamo adesso un elemento di collegamento semplice, denominato MYLINK. Riportiamo la dichiarazione dellelemento e lelenco degli attributi cos come potrebbe comparire in una dichiarazione del tipo di documento (DTD). <!ELEMENT MYLINK ANY> <!ATTLIST MYLINK XML:LINK CDATA #FIXED "simple" HREF CDATA #REQUIRED INLINE (true|false) "true" ROLE CDATA #IMPLIED TITLE CDATA #IMPLIED SHOW (replace|new|embed) #IMPLIED ACTUATE (auto|user) #IMPLIED BEHAVIOR CDATA #IMPLIED CONTENT-ROLE CDATA#IMPLIED CONTENT-TITLE CDATA #IMPLIED >

XML:LINK
Gli sviluppatori dellXLink avrebbero potuto riservare un nome di tag (ad esempio <A> nellHTML), riservare un nome di attributo o lasciare la scelta al software dellapplicazione per riconoscere un elemento come elemento di collegamento. Decisero di adottare un nome di attributo, ritenendo che questo avrebbe consentito agli autori di definire elementi personalizzati e contemporaneamente mantenere lelemento di collegamento come parte del collegamento della struttura dellelemento. Il risultato lattributo XML:LINK, che pu avere valore simple o extended. Lesempio precedente assegna il valore simple, poich il collegamento in fase di creazione di tipo semplice. Lesempio seguente mostra come apparir lelemento Mylink in un documento: <MYLINK XML:LINK="simple" HREF="http://www.miosito.com"> My Home Page </MYLINK> Lattributo XML:LINK incluso nellelemento Mylink precedente, ma in quanto

http://www.html.it/xml/guida/semplici.htm (1 di 3) [19/06/2001 14.13.25]

XML: Capitolo IV: Ampliare i documenti XML - Collegamenti semplici nell'XML

dichiarato con un valore fisso nella dichiarazione dellelemento, non necessario che lelemento stesso includa lattributo XML:LINK. HREF Ciascun elemento di collegamento nellXML deve avere un localizzatore di risorsa che identifica la risorsa alla quale il collegamento fa riferimento. HREF lattributo del localizzatore nellXLink e funziona come nellHTML. INLINE Un elemento di collegamento XLink pu essere in linea o non in linea. Un collegamento in linea funziona come risorsa propria, ovvero lelemento di collegamento, analogamente alla destinazione del collegamento, fornisce contenuto. Anche in questo caso lelemento Anchor HTML rappresenta perfettamente questo tipo di collegamento. Cos come la destinazione del collegamento, lelemento Anchor fornisce anche contenuto. Nellesempio riportato il valore predefinito true fa parte della dichiarazione dellattributo INLINE. Non pertanto necessario specificare lattributo nellelemento. ROLE Lattributo ROLE indica al software dellapplicazione il significato del collegamento. Con questo attributo si intende fornire informazioni sul collegamento considerato come insieme e non solo come risorsa remota del collegamento. Queste applicazioni devono essere comprese dallapplicazione e non dagli utenti. Lutilizzo di ROLE consente di fornire allapplicazione informazioni dettagliate sui collegamenti che vanno oltre la semplice indicazione della risorsa a cui rimandano. Ad esempio, alcuni collegamenti potrebbero condurre a voci di glossario, altri a informazioni generali su un determinato argomento, altri ancora a informazioni sulle propriet di una risorsa, tra cui informazioni sulla versione. Le applicazioni possono ora ottenere questo tipo di informazioni direttamente dal collegamento e agire di conseguenza. TITLE Lattributo TITLE, simile al tag <ALT> dellHTML, contiene unetichetta visualizzabile o del testo che pu essere utilizzato per fornire informazioni supplementari allutente. Si tratta di un attributo per risorse remote: linformazione TITLE non intende correlarsi al collegamento nel suo insieme, bens fornire informazioni allutente sulla relazione esistente tra risorsa e collegamento. Mentre lattributo ROLE viene interpretato dal computer, lattributo TITLE si rivolge allutente. SHOW Lattributo SHOW fa parte della semantica per le risorse remote dellXML e rappresenta probabilmente uno dei miglioramenti pi rilevanti rispetto ai collegamenti HTML. Lattributo SHOW accetta valori come replace, new ed embed, che descrivono il modo in cui il collegamento dovr funzionare. Il valore replace indica che la risorsa locale viene sostituita da una risorsa remota. Questa tecnica tra le pi comunemente utilizzate dai collegamenti HTML. Il valore new specifica che la risorsa di destinazione deve essere aperta in un contesto nuovo. Una funzionalit simile fornita nellHTML dallattributo TARGET dellelemento Anchor: la destinazione del collegamento si apre in un nuovo contesto, in genere unaltra finestra del browser. Il valore embed indica la nuova tecnica relativa al funzionamento di un collegamento. Se viene specificato il valore embed, il contenuto della destinazione del collegamento viene incorporato nel contenuto dellorigine del collegamento. Quando lutente fa clic sul collegamento con il valore embed specificato, le informazioni vengono visualizzate nel contesto, direttamente allinterno del documento di origine. ACTUATE Lattributo ACTUATE specifica il modo in cui il collegamento deve essere attivato. Questo attributo pu accettare il valore auto o user. Il valore auto indica che il collegamento deve essere attivato automaticamente quando il collegamento viene elaborato dallapplicazione. Il valore user specifica che il collegamento deve essere attivato da un meccanismo esterno, ad esempio un clic del mouse. Combinando inoltre lattributo SHOW=embed con lattributo ACTUATE=auto possibile creare un documento contenente molti collegamenti incorporati. Quando un utente apre il documento, tutti i collegamenti vengono automaticamente attivati e incorporati direttamente nel documento. Il documento composto che ne deriva contiene informazioni raccolte da varie origini invisibili allutente. BEHAVIOR Lattributo BEHAVIOR fornisce allautore del collegamento uno spazio in cui

http://www.html.it/xml/guida/semplici.htm (2 di 3) [19/06/2001 14.13.25]

XML: Capitolo IV: Ampliare i documenti XML - Collegamenti semplici nell'XML

descrivere cosa accadr allattivazione del collegamento. Al collegamento possono ad esempio essere associati gli stati "precedente" e "successivo". Lo stato precedente corrisponde allaspetto del collegamento prima che venga attivato e pu includere tipo di carattere, colori e altri elementi di formattazione. Lo stato successivo rimanda a quanto si verifica dopo lattivazione del collegamento, ovvero al comportamento del collegamento. Lattributo BEHAVIOR non presenta vincoli e pu contenere qualunque tipo di istruzione che possa essere comunicata allapplicazione che elabora il collegamento. CONTENT-ROLE Questo attributo funziona in modo analogo allattributo ROLE, ma specifico delle risorse locali. Indica allapplicazione lo scopo della risorsa locale come parte del collegamento. Come lattributo ROLE, questa informazione viene utilizzata dallapplicazione e non dagli utenti. CONTENT-TITLE Anche CONTENT-TITLE un attributo della semantica delle risorse locali che fornisce informazioni allutente relativamente alla parte locale del collegamento. Svolge una funzione simile a quella dellattributo TITLE, ma si rivolge agli utenti.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/semplici.htm (3 di 3) [19/06/2001 14.13.25]

XML: Capitolo IV: Ampliare i documenti XML - Collegamenti estesi nell'XML

Collegamenti estesi nell'XML


Lutilizzo dei collegamenti estesi consente di definire gruppi di possibili destinazioni da ununica origine. I collegamenti estesi forniscono tutte le informazioni necessarie per consentire i collegamenti multipli. COLLEGAMENTI ESTESI IN LINEA Il miglioramento delle potenzialit ha portato con s un aumento delle complessit e in effetti i collegamenti estesi complicano lequazione. Vediamo un esempio di collegamento esteso: <!ELEMENT MYELINK ANY> <!ATTLIST MYELINK XML:LINK CDATA #FIXED "extended" INLINE (true|false) "true" ROLE CDATA #IMPLIED TITLE CDATA #IMPLIED SHOW (replace|new|embed) #IMPLIED ACTUATE (auto|user) #IMPLIED BEHAVIOR CDATA #IMPLIED CONTENT-ROLE CDATA#IMPLIED CONTENT-TITLE CDATA #IMPLIED > Il codice simile alla dichiarazione del collegamento semplice creato in precedenza, ma in questo caso lattributo XML:LINK contiene il valore extended anzich simple, poich si tratta di un collegamento esteso, e non vi sono attributi HREF dichiarati in quanto con i collegamenti estesi i localizzatori devono essere contenuti in un insieme separato di elementi. Questi elementi vengono identificati come localizzatori. Lutilizzo di questo metodo per la definizione dei localizzatori consente di specificare pi localizzatori per un solo elemento di collegamento. Non diversamente da altri elementi, anche il localizzatore deve essere dichiarato. Ecco un esempio di dichiarazione di localizzatore: <!ELEMENT ELOCATOR ANY> <!ATTLIST ELOCATOR XML:LINK CDATA #FIXED "locator" HREF CDATA #REQUIRED INLINE (true|false) "true" ROLE CDATA #IMPLIED TITLE CDATA #IMPLIED SHOW (replace|new|embed) #IMPLIED ACTUATE (auto|user) #IMPLIED BEHAVIOR CDATA #IMPLIED > Lattributo XML:LINK contiene il valore locator per identificare questo elemento come localizzatore XLink, inoltre utilizziamo lattributo HREF. A questo punto esaminiamo il modo in cui questa struttura potrebbe funzionare in un documento XML. Lelemento di collegamento avr aspetto simile al seguente codice: <MYELINK XML:LINK="extended">minivan review <ELOCATOR <ELOCATOR <ELOCATOR <ELOCATOR <ELOCATOR <ELOCATOR </MYELINK> COLLEGAMENTI ESTESI NON IN LINEA TITLE="Chrysler Town and Country" HREF="Chrysler.htm"/> TITLE="Ford Windstar" HREF="Ford.htm"/> TITLE="Chevrolet Venture" HREF="Chevy.htm"/> TITLE="Honda Odyssey" HREF="Honda.htm"/> TITLE="Nissan Quest" HREF="Nissan.htm"/> TITLE="Toyota Sienna" HREF="Toyota.htm"/>

http://www.html.it/xml/guida/estesi.htm (1 di 4) [19/06/2001 14.13.42]

XML: Capitolo IV: Ampliare i documenti XML - Collegamenti estesi nell'XML

Un collegamento in linea richiede il testo del collegamento affinch il collegamento stesso risulti completo. I collegamenti estesi consentono di creare collegamenti in cui la risorsa locale non appartiene al collegamento. Questo significa che un elemento o una porzione di contenuto pu costituire un collegamento, bench non sia stato creato con questo obiettivo. Questi collegamenti, definiti collegamenti non in linea, forniscono un modo potente e flessibile per collegare informazioni. Per creare un collegamento non in linea utilizzeremo la stessa dichiarazione degli elementi del collegamento esteso e la stessa dichiarazione degli elementi localizzatori create per il collegamento esteso in linea. Nel tag dellelemento occorre impostare lattributo INLINE su false per indicare che lelemento un collegamento non in linea. <MYELINK XML:LINK="extended" INLINE="false"> <ELOCATOR <ELOCATOR <ELOCATOR <ELOCATOR <ELOCATOR <ELOCATOR </MYELINK> <REVIEW ID="Chrysler"> <TITLE="Chrysler Town and Country"</TITLE> <!--Questa la sezione della Chrysler-- > </REVIEW> <REVIEW ID="Ford"> <TITLE ="Ford Windstar"</TITLE> <!--Questa la sezione della Ford-- > </REVIEW> <REVIEW ID="Chevy"> <TITLE ="Chevrolet Venture"</TITLE> <!--Questa la sezione della Chevrolet -- > </REVIEW> <REVIEW ID="Honda"> <TITLE ="Honda Odyssey"</TITLE> <!--Questa la sezione della Honda-- > </REVIEW> REVIEW ID="Nissan"> <TITLE ="Nissan Quest"</TITLE> <!--Questa la sezione della Nissan-- > </REVIEW> REVIEW ID="Toyota"> <TITLE ="Toyota Sienna"</TITLE> <!--Questa la sezione della Toyota-- > </REVIEW> In questo esempio i localizzatori sono mantenuti nella relativa sezione e non sono vincolati ad alcuna risorsa di collegamento locale. I localizzatori contengono tutte le informazioni necessarie per fornire le connessioni alle sezioni appropriate nel documento, ma compito dellapplicazione visualizzare i collegamenti per lutente. Lapplicazione potrebbe ad esempio fornire un elenco separato dal contenuto che consenta allutente di connettersi allelemento desiderato in qualunque momento. In questo modo vengono impostati collegamenti realmente multidirezionali, eliminando i collegamenti con spostamento "avanti e indietro" che per la maggior parte degli utenti Web consuetudine utilizzare. A questo punto, si immagini un documento XML contenente nella DTD le dichiarazioni degli elementi Myelink ed Elocator precedentemente utilizzati. Supponiamo inoltre che il documento includa nellelemento Document i seguenti localizzatori: <MYELINK XML:LINK="extended" INLINE="false"> <ELOCATOR <ELOCATOR <ELOCATOR <ELOCATOR <ELOCATOR <ELOCATOR TITLE="Chrysler Town and Country" HREF="Chrysler.htm"/> TITLE="Ford Windstar" HREF="Ford.htm"/> TITLE="Chevrolet Venture" HREF="Chevy.htm"/> TITLE="Honda Odyssey" HREF="Honda.htm"/> TITLE="Nissan Quest" HREF="Nissan.htm"/> TITLE="Toyota Sienna" HREF="Toyota.htm"/> TITLE="Chrysler Town and Country" HREF="#Chrysler"/> TITLE="Ford Windstar" HREF="#Ford"/> TITLE="Chevrolet Venture" HREF="#Chevy"/> TITLE="Honda Odyssey" HREF="#Honda"/> TITLE="Nissan Quest" HREF="#Nissan"/> TITLE="Toyota Sienna" HREF="#Toyota"/>

http://www.html.it/xml/guida/estesi.htm (2 di 4) [19/06/2001 14.13.42]

XML: Capitolo IV: Ampliare i documenti XML - Collegamenti estesi nell'XML

</MYELINK> Poich i localizzatori sono contenuti in documento distinto, qualsiasi applicazione che utilizzi questo documento sar in grado di rendere disponibili tali collegamenti. Anche in questo caso, la struttura creata per i collegamenti multidirezionale in quanto da qualunque documento sar possibile accedere a un collegamento a qualsiasi altro documento. Un ulteriore vantaggio deriva dalla possibilit di gestire lelenco dei collegamenti in maniera separata dai documenti nei quali vengono utilizzati, grazie al fatto che lelenco dei localizzatori risiede in un documento specifico. Questo tipo di struttura consente inoltre di aggiungere collegamenti a documenti che normalmente non possono essere modificati in modo tale da contenere collegamenti in linea propri. Lapplicazione pu infine verificare che i documenti identificati nei localizzatori siano disponibili anche prima che i collegamenti vengano visualizzati, evitando in tal modo linterruzione dei collegamenti. La configurazione di destinazioni multiple per i collegamenti, i collegamenti non in linea estesi e i collegamenti multidirezionali sono gestiti da un numero esorbitante di collegamenti. LXLink fornisce un metodo in grado di risolvere alcuni di questi aspetti: i gruppi di collegamenti estesi. GRUPPI DI COLLEGAMENTI ESTESI I gruppi di collegamenti estesi semplificano la gestione delle informazioni sui collegamenti correlati impostando elementi contenenti elenchi di documenti correlati. Supponiamo di pubblicare mensilmente per una rivista di consumo un servizio sulle novit automobilistiche. Anzich creare un singolo documento contenente elenchi di tutte le automobili delle varie categorie per ogni mese, possibile raggruppare gli elenchi in modo da renderli pi facilmente gestibili. Per utilizzare i gruppi di collegamento estesi, sono necessari due elementi, uno per definire il gruppo (GROUP) e laltro per specificare i documenti appartenenti al gruppo (DOCUMENT). Ecco un esempio di dichiarazioni: <!ELEMENT GROUP (DOCUMENT*)> <!ATTLIST GROUP XML:LINK CDATA #FIXED "group" STEPS CDATA #IMPLIED > <!ELEMENT DOCUMENT EMPTY> <!ATTLIST DOCUMENT XML:LINK CDATA #FIXED "document" HREF CDATA #REQUIRED > STEPS consiste nellindicare allapplicazione il numero di livelli dei documenti in cui eseguire la ricerca prima di terminarla. Questo attributo risulta particolarmente utile quando il gruppo contiene documenti nel quale sono inclusi altri gruppi, a loro volta contenenti nuovi documenti che contengono ulteriori gruppi e cos via. Dopo aver predisposto le dichiarazioni degli elementi, necessario aggiungere gli elementi Group e Document. Gli elementi Document contengono semplicemente HREF che portano lapplicazione che li elabora ai documenti allinterno dei quali devono essere cercati i collegamenti. Quando lapplicazione raggiunge uno di questi elementi, carica i documenti specificati dagli attributi HREF degli elementi Document in Group. Essa controlla quindi questi documenti alla ricerca di collegamenti al documento originale, costruendo una tabella di collegamenti. Lapplicazione di elaborazione caricher tutti i documenti ed elaborer linformazione di collegamento in essa contenuta; questa la fase uno. Se lattributo STEPS maggiore di 1, lapplicazione caricher i documenti ai quali i documenti originali erano collegati dal primo gruppo di collegamenti caricati (STEPS evita che i documenti carichino centinaia di altri documenti). In questo modo viene creato il gruppo di collegamenti: <GROUP STEP=1> <DOCUMENT HREF="cousin2.htm"/> <DOCUMENT HREF="cousin3.htm"/> <DOCUMENT HREF="cousin4.htm"/> <DOCUMENT HREF="cousin5.htm"/> </GROUP> I gruppi di collegamenti estesi rendono possibile centralizzare linformazione di collegamento, sostituendo un labirinto di collegamenti (figura A) con un sistema di comunicazione centralizzato (figura B) che consente agli sviluppatori di esaminare e gestire collegamenti senza dover leggere documenti senza fine. Esso inoltre riduce loccupazione del sistema consentendo agli sviluppatori di richiedere a un documento XML di scaricare solo un ulteriore documento (o eventualmente alcuni) per creare un

http://www.html.it/xml/guida/estesi.htm (3 di 4) [19/06/2001 14.13.42]

XML: Capitolo IV: Ampliare i documenti XML - Collegamenti estesi nell'XML

elenco completo di collegamenti.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/estesi.htm (4 di 4) [19/06/2001 14.13.42]

XML: Capitolo IV: Ampliare i documenti XML - XPointer

XPointer
Un altro linguaggio basato sullXML lXPointer che consente di ottenere collegamenti ancora pi precisi allinterno di documenti XML. Lobiettivo principale dellXPointer quello di fornire un metodo di indirizzamento della struttura interna di un documento XML. Negli esempi precedenti, per fare riferimento a una porzione specifica di un documento, utilizzavamo un identificatore di frammento che richiedeva che lelemento utilizzasse un attributo ID. Il linguaggio XPointer stato realizzato in modo da fare riferimento alle strutture interne di un documento, sia che includano o meno attributi ID.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/xpointer.htm [19/06/2001 14.13.49]

XML: Capitolo IV: Ampliare i documenti XML - Concetti fondamentali relativi al linguaggio XPointer

Concetti fondamentali relativi al linguaggio XPointer


Lazione dellXPointer interna agli elementi e alle strutture che costituiscono il documento XML. Un elemento XPointer contiene una serie di termini di localizzazione che specifica una posizione nella struttura ad albero del documento. Bench molto pi sofisticato degli identificatori di frammento HTML, lXPointer pu essere utilizzato in maniera analoga. I termini di localizzazione utilizzano la sintassi indicata nei seguenti esempi: HREF="uri#Xpointer" HREF="uri|Xpointer" Se come separatore si utilizza il simbolo di cancelletto (#), tale simbolo indica che il client deve elaborare la connessione. Se si utilizza invece il simbolo pipe (|), il meccanismo della connessione rimane aperto. In questo modo, la connessione del collegamento pu essere gestita sul lato server, consentendo un potenziale risparmio di larghezza di banda. Un termine di localizzazione richiede unorigine di localizzazione. Si tratta di un metodo che consente di indicare a XPointer il punto in cui iniziare ad operare nella struttura del documento. Ogni termine di localizzazione utilizza una parola chiave e pu contenere argomenti. La parola chiave specifica lorigine di localizzazione, ad esempio Root o Id, che indica a XPointer dove iniziare. Gli argomenti forniscono ulteriori informazioni sul percorso che XPointer dovr compiere allinterno dellorigine. Un esempio di termine di localizzazione il seguente: Child(2,PRODUCT) In cui viene indicato il secondo elemento Product tra gli elementi secondari correnti.. I termini di localizzazione possono essere associati a posizioni assolute, posizioni relative, posizioni con spanning, posizioni di attributi o posizioni di stringhe. TERMINI DI LOCALIZZAZIONE ASSOLUTI Un termine di localizzazione assoluto fa riferimento a un punto specifico nella struttura del documento. Non richiede alcuna origine di localizzazione e pu essere utilizzato per stabilire unorigine di localizzazione o come elemento XPointer autonomo. I termini di localizzazione assoluti supportano le seguenti parole chiave: q Root() La parola chiave Root specifica che lorigine di localizzazione coincide con lelemento principale della risorsa con funzione di contenitore. Se non vengono specificate altre parole chiave, considerata la parola chiave predefinita. Poich lo scopo di un termine di localizzazione di puntare a un documento, questa parola chiave raramente utilizzata.
q

Origin() Genera unorigine di localizzazione particolarmente utile se, a causa di una richiesta quale un collegamento, lXPointer in fase di elaborazione. Se XPointer inizia con Origin, lorigine di localizzazione corrisponde alla risorsa da cui partita la richiesta. Id(Name) La parola chiave Id utilizza la tecnica pi comune di spostamento attraverso i documenti, ovvero la coppia ID e NAME. Lo spostamento inizia al livello dellelemento con ID corrispondente al NAME specificato. Html(NameValue) Questa parola chiave emula lazione eseguita dallidentificatore di frammento in un documento HTML. Contiene un attributo NAMEVALUE. Lorigine di localizzazione il primo elemento Anchor contenente un attributo NAME il cui valore corrisponde a quello dellattributo NAMEVALUE nel termine di localizzazione.

Un esempio di termine di localizzazione assoluto il seguente: HREF="http://www.foo.com/br.xml#Id(PRODUCT)" Identifica lelemento PRODUCT allinterno del documento br.xml.
http://www.html.it/xml/guida/xpoint.htm (1 di 3) [19/06/2001 14.14.07]

XML: Capitolo IV: Ampliare i documenti XML - Concetti fondamentali relativi al linguaggio XPointer

TERMINI DI LOCALIZZAZIONE RELATIVI Le parole chiave per i termini di localizzazione relativi dipendono dalla disponibilit di unorigine di localizzazione. Se non esiste alcuna origine, XPointer fa riferimento allelemento principale della risorsa che contiene il termine. I termini di localizzazione relativi supportano le seguenti parole chiave:
q

Child Se viene specificata, la parola chiave Child identifica i nodi secondari dellorigine di localizzazione. Seleziona tutti i nodi secondari dellorigine di localizzazione. Descendant Specifica i nodi del documento che si trovano a qualunque livello allinterno del contenuto dellorigine di localizzazione. Ancestor Specifica i nodi contenenti lorigine di localizzazione o i relativi elementi principali. Preceding Specifica i nodi che compaiono nella struttura ad albero del documento prima dellorigine di localizzazione. Psibiling Specifica gli elementi di pari livello che compaiono prima dellorigine di localizzazione. Gli elementi di pari livello condividono lo stesso elemento principale. Following Specifica i nodi che compaiono nella struttura ad albero del documento dopo lorigine di localizzazione. Fsibling Specifica gli elementi di pari livello che compaiono dopo lorigine di localizzazione.

q q q q

q q

Un esempio di termine di localizzazione relativo il seguente: Child(2,SECTION) Identifica il secondo figlio di tipo SECTION. TERMINI DI LOCALIZZAZIONE CON SPANNING Un termine di localizzazione con spanning punta a una sottorisorsa individuando i dati presenti tra i due argomenti. Nellesempio seguente, gli argomenti sono relativi allorigine di localizzazione per il termine di localizzazione con spanning: Id(PRODUCT).Span(Child(1),Child(3)) Si seleziona dal primo al terzo figlio dellelemento PRODUCT. TERMINI DI LOCALIZZAZIONE DI ATTRIBUTI Il termine di localizzazione di un attributo esamina il nome di un attributo, individua lattributo e ne restituisce il valore. Lesempio seguente mostra lutilizzo di questo termine: Id(PRODUCT).Attr(N) Si seleziona il valore dellattributo N dellelemento PRODUCT. TERMINI DI LOCALIZZAZIONE DI STRINGHE Il termine di localizzazione di una stringa seleziona una o pi stringhe o posizioni tra stringhe nellorigine di localizzazione. I termini di localizzazione delle stringhe supportano le seguenti parole chiave: q InstanceOrAll Identifica loccorrenza ordinale della stringa specificata. Se il numero positivo, XPointer inizia a contare a partire dallinizio dellorigine di localizzazione. Se il numero negativo, XPointer inizia a contare in senso inverso a partire dalla fine dellorigine di localizzazione. Se si utilizza il valore All, verranno utilizzate tutte le occorrenze della stringa.
q q q

SkipLit Specifica la stringa da individuare nellorigine di localizzazione. Position Specifica loffset di carattere dallinizio della stringa o delle stringhe allinizio della corrispondenza di stringa finale. Length Specifica il numero di caratteri da selezionare nella stringa.

Un esempio di termine di localizzazione di stringa il seguente: Id(PRODUCT).String(3,"widget") Si seleziona il terzo elemento di PRODUCT contenente la stringa "widget". Infine un semplice esempio di utilizzo di un XPointer : HREF="http://www.foo.com/br.xml#id(list).child(3,item)"

http://www.html.it/xml/guida/xpoint.htm (2 di 3) [19/06/2001 14.14.07]

XML: Capitolo IV: Ampliare i documenti XML - Concetti fondamentali relativi al linguaggio XPointer

viene selezionato il terzo elemento item che si trova allinterno dellelemento list del documento br.xml.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/xpoint.htm (3 di 3) [19/06/2001 14.14.07]

XML: Capitolo IV: Ampliare i documenti XML - XML-Data

XML-Data
LXML un linguaggio orientato agli oggetti e, come altri linguaggi di questo tipo, permette di creare oggetti e di specificare i loro attributi. In generale si fa riferimento ad un oggetto XML come ad un elemento XML. LXML Data un DTD costruito secondo le specifiche XML, che pu essere utilizzato per rappresentare strutture dati comunque complesse attraverso uno schema. XML-Data quindi un linguaggio utilizzato per creare uno schema, che identifica la struttura e i vincoli per un particolare documento XML. Molti sviluppatori che operano allinterno di aziende pensavano che il linguaggio del meccanismo DTD non fosse adeguato alle necessit delle applicazioni XML presenti e future. Di conseguenza, diverse aziende e istituti di studio di ricerca, quali Microsoft, DataChannel e luniversit di Edinburgo, hanno espresso lesigenza di un nuovo meccanismo che svolgesse le stesse funzioni di base del meccanismo DTD, fornendo allo stesso tempo maggiori potenzialit e flessibilit. Attenendosi al vocabolario specificato nel DTD dellXML Data, facile rappresentare basi di dati relazionali o ad oggetti. Un aspetto molto positivo che utilizzando lXML Data schema possiamo evitare di creare un nostro DTD specifico; quindi siamo sicuri che lo schema cos creato sar interpretato da qualunque DBMS che conosce il DTD XML Data.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/xmldata.htm [19/06/2001 14.14.11]

XML: Capitolo IV: Ampliare i documenti XML - Gli obiettivi di XML-Data

Gli obiettivi di XML-Data


XML-Data stato creato per eliminare alcuni limiti della DTD. Ecco come XML-Data raggiunge tali obiettivi. 1. Gestione dei documenti dello schema senza necessit di utilizzo di strumenti speciali. Le DTD vengono scritte utilizzando una sintassi particolare specifica. Per questo motivo, la funzionalit dellXML per lutilizzo delle DTD richiede non solo autori esperti del linguaggio DTD, ma anche strumenti speciali in grado di leggere e scrivere nelle DTD, per ogni strumento XML sviluppato. Il primo obiettivo di XML-Data quindi leliminazione dellutilizzo di strumenti speciali ed raggiunto mediante il semplice utilizzo della sintassi XML per il linguaggio.

2. Flessibilit degli schemi. Gli schemi devono essere sufficientemente flessibili


per consentirne ladattamento a unapplicazione specifica, eliminando i relativi vincoli. In altre parole, non necessaria la flessibilit dellapplicazione per lo schema. Questa flessibilit ottenuta mediante una sintassi di definizione aperta dello schema, con la quale uno schema pu essere reso specifico aggiungendo elementi o attributi. 3. Semplicit del linguaggio al fine di consentirne limplementazione in tutti gli elaboratori XML. Questo obiettivo garantisce che il linguaggio XML-Data non sia complesso e possa quindi essere implementato da tutti gli sviluppatori di elaboratori XML. Questo obiettivo pu essere raggiunto utilizzando la sintassi XML per definire il linguaggio dello schema. In questo modo, limplementazione viene semplificata e non pi necessario disporre di un particolare elaboratore per analizzare lo schema. 4. XML-Data deve soddisfare i requisiti delle applicazioni Web (ad esempio le applicazioni per scambi commerciali) che riguardano la convalida dei dati aggiuntivi e di quelli espressi dalla DTD corrente. La DTD definisce la struttura e le regole del documento, ma presenta dei limiti nella definizione dei tipi di dati e nella convalida dei dati. Il linguaggio XML-Data definisce i tipi di dati primitivi e permette di determinare intervalli di valori di dati, ad esempio, consentendo allautore di determinare i valori massimi e minimi. Questo tipo di caratteristiche sono tipiche dei linguaggi di database relazionali, come SQL (Structured Query Language), e dei linguaggi di programmazione pi recenti. 5. Il linguaggio dello schema deve supportare la funzionalit che consente ai singoli documenti di comprendere parti definite in fonti di dati diverse. I documenti XML, come sappiamo, possono comprendere altri documenti o parti di altri documenti mediante linserimento di puntatori allinterno della DTD. Questo obiettivo stabilisce che XML-Data, fornir una funzionalit simile, ottenuta mediante lutilizzo dello spazio dei nomi negli schemi XML-Data.

6. XML-Data deve essere totalmente compatibile con XML 1.0. Lo scopo di


questo obiettivo minimizzare i problemi relativi al superamento delle tecnologie dovuto a nuove versioni o a aggiornamenti della tecnologia stessa. Lo scopo diffondere lutilizzo di XML-Data, grazie anche al fatto che utilizza la sintassi XML. Questo obiettivo ne amplia il campo di azione poich prevede che XML-Data sia compatibile con XML 1.0.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/obietti.htm [19/06/2001 14.14.15]

XML: Capitolo IV: Ampliare i documenti XML - Linguaggio schema XML-Data

Linguaggio schema XML-Data


Qualsiasi schema di XML-Data un documento XML ben formato e, in quanto tale, pu costituire anche un documento XML valido. Il linguaggio XML-Data si basa sulla DTD XML-Data. Un documento pu essere valido, se fa riferimento a tale DTD, ma risulta un documento ben formato anche se conforme alla specifica XML-Data, nonostante nel prologo non vi sia alcun riferimento della DTD.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/schema.htm [19/06/2001 14.14.18]

XML: Capitolo IV: Ampliare i documenti XML - Struttura del documento dello schema

Struttura del documento dello schema


Un documento XML di base composto da un prologo e da un elemento Document. Anche il documento dello schema XML-Data composto da questi componenti. Esiste tuttavia una differenza tra i due, ossia che un documento dello schema non contiene alcuna DTD. La struttura del documento infatti definita allinterno di un elemento Schema che costituisce lelemento Document, o Root, in una definizione di schema. Questo documento pu essere utilizzato nel seguente modo: <?xml version="1.0"?> <Schema name="nomeschema" xmlns="urn:schemas-microsoft-com:xml-data"> <!-- Qui vi sono le dichiarazioni --> <ElementType name="nomeelemento" content="tipocontent"/> </Schema> Lelemento Schema deve essere derivato dallo spazio del nome xml-data urn:schemas-microsoft-com:xml-data. Non necessario dichiarare lo spazio del nome nel prologo dello schema. Le dichiarazioni dello schema possono avere aree di validit diverse. Questo significa che possono essere sia dichiarazioni di primo livello sia dichiarazioni di livello locale. Larea di validit di una dichiarazione identifica dove e come viene utilizzato un elemento dichiarato allinterno di un documento dello schema. DICHIARAZIONI DI PRIMO LIVELLO Le dichiarazioni di primo livello includono qualsiasi tipo di elemento o di attributo dichiarato allinterno dellelemento Schema. I tipi di elemento o attributo dichiarati nellarea di validit di primo livello possono essere indicati nella dichiarazione del contenuto di altri tipi di elemento presenti nello stesso schema. Ad esempio, nello schema che segue, il nome del tipo di elemento dichiarato al primo livello e ne facciamo riferimento anche nella dichiarazione del tipo di elemento Plant: <Schema name="wildflowers" xmlns="urn:schemas-microsoft-com:xml-data"> <ElementType name="name" content="textOnly"/> <ElementType name="plant"> <element type="name"/> </ElementType> </Schema> DICHIARAZIONI DI LIVELLO LOCALE Una dichiarazione che appare allinterno di unaltra dichiarazione, che non di primo livello, considerata di area di validit di livello locale. E possibile fare riferimento alla dichiarazione di livello locale solo allinterno della dichiarazione in cui contenuta. Ad esempio, se aggiungiamo una dichiarazione dellattributo di livello locale alla dichiarazione del tipo di elemento Plant otteniamo quanto segue: <Schema name="wildflowers" xmlns="urn:schemas-microsoft-com:xml-data"> <ElementType name="name" content="textOnly"/> <ElementType name="plant"> <element type="name"/> <attribute name="bestseller" values="yes no"/> </ElementType> </Schema> Lattributo bestseller pu essere utilizzato solo nella dichiarazione del tipo di elemento Plant.

Lezione successiva
http://www.html.it/xml/guida/schema2.htm (1 di 2) [19/06/2001 14.14.21]

XML: Capitolo IV: Ampliare i documenti XML - Struttura del documento dello schema

[Sommario]

http://www.html.it/xml/guida/schema2.htm (2 di 2) [19/06/2001 14.14.21]

XML: Capitolo IV: Ampliare i documenti XML - Dichiarazioni del tipo di elemento

Dichiarazioni del tipo di elemento


Il tipo di elemento dichiarato nellelemento ElementType. Ogni dichiarazione del tipo di elemento deve includere un attributo Name, che definisce il tipo di elemento. Ad esempio. La dichiarazione del tipo di elemento riportata di seguito dichiara un tipo di elemento con il nome Plant: <ElementType name="plant"> Il tipo di contenuto di elemento pu essere dichiarato con lattributo content. In questo modo il contenuto dellelemento vincolato al tipo specificato. TIPO DI CONTENUTO Ogni tipo di elemento pu contenere una delle quattro categorie relative al contenuto: vuoto, solo testo, solo sottoelementi o una combinazione di testo e sottoelementi. I valori possibili sono i seguenti: q empty - non contiene alcun tipo di contenuto
q q q

textOnly - contiene solo testo eltOnly - contiene solo sottoelementi mixed - contiene una combinazione di testo e sottoelementi

Oltre ai vincoli relativi al contenuto, una dichiarazione del tipo di elemento pu anche specificare il pattern in cui gli elementi nella dichiarazione appaiono, utilizzando lattributo order. ORDINAMENTO DEL CONTENUTO Lattributo order vincola il pattern per i tipi di elementi dichiarati in una dichiarazione del tipo di elemento. I valori possibili sono i seguenti: q seq - Gli elementi devono apparire nella stessa sequenza degli elementi a cui si fa riferimento nella dichiarazione del tipo di elemento. Questo il pattern predefinito per il contenuto eltOnly.
q q

one - Un sottoelemento del tipo dichiarato nella dichiarazione del tipo di elemento deve essere contenuto nellelemento principale. all - Un elemento di ogni tipo dichiarato nella dichiarazione del tipo di elemento deve comparire come sottoelemento, ma i sottoelementi possono avere un ordine qualsiasi. many - Ciascuno degli elementi dichiarati nella dichiarazione del tipo di elemento pu avere un ordine qualsiasi. Questo il pattern predefinito per il contenuto mixed.

Lesempio seguente mostra la dichiarazione del tipo di elemento Plant, che contiene i sottoelementi che devono essere ordinati in modo sequenziale: <ElementType name="name" content="textOnly"/> <ElementType name="growth" content="mixed"/> <ElementType name="saleinfo" content="mixed"/> <ElementType name="plant" content="eltOnly" order="seq"> <element type="name"/> <element type="growth"/> <element type="saleinfo"/> </ElementType> E possibile applicare altri vincoli raggruppando i riferimenti degli elementi mediante lelemento Group. Questo elemento supporta lattributo order con gli stessi valori utilizzati per lelemento ElementType. Ecco un esempio che utilizza lelemento Group: <ElementType name="name" content="textOnly"/> <ElementType name="zone" content="textOnly"/> <ElementType name="light" content="textOnly"/>

http://www.html.it/xml/guida/dichielem.htm (1 di 3) [19/06/2001 14.14.29]

XML: Capitolo IV: Ampliare i documenti XML - Dichiarazioni del tipo di elemento

<ElementType name="price" content="textOnly"/> <ElementType name="plant" content="eltOnly" order="seq"> <element type="name"/> <group order="one"> <element type="zone"/> <element type="light"/> <element type="price"/> </group> </ElementType> In questo caso il tipo di elemento Plant deve contenere un nome a cui deve seguire uno degli elementi Zone, Light o Price. QUANTITA DI ELEMENTI E GRUPPI Come nelle DTD XML, possibile applicare vincoli in modo da determinare la posizione e il numero delle volte in cui un elemento o un gruppo pu essere ripetuto allinterno di un documento. Gli attributi minOccurs e maxOccurs possono essere specificati negli elementi Element e Group. Lattributo minOccurs specifica il numero minimo delle ripetizioni di un elemento, mentre maxOccurs quello massimo. Nella seguente tabella indichiamo le possibili combinazioni di valori per gli attributi minOccurs e maxOccurs con i relativi significati: Numero di ripetizioni dellelemento minOccurs maxOccurs o del gruppo 1 o non specificato 0 Maggiore di 1 Maggiore di 1 0 1 Maggiore di 0 Qualsiasi valore 1 o non specificato 1 o non specificato Maggiore di n Minore di 1 "*" "*" "*" 0 1 (Necessario) 0 o 1 (opzionale) Almeno minOccurs ripetizione, ma non pi di maxOccurs 0 Qualsiasi numero di ripetizioni Almeno unoccorrenza Almeno minOccurs ripetizioni 0

Il valore predefinito per ambedue gli attributi minOccurs e maxOccurs 1. Questo significa che, se non specificato diversamente, gli elementi devono occorrere una sola volta allinterno di un determinato tipo di elemento. Nellesempio che segue il gruppo deve occorrere almeno una volta, quindi anche pi volte: <ElementType name="name" content="textOnly"/> <ElementType name="zone" content="textOnly"/> <ElementType name="light" content="textOnly"/> <ElementType name="price" content="textOnly"/> <ElementType name="plant" content="eltOnly" order="seq"> <element type="name"/> <group minOccurs="1" maxOccurs="*" order="one"> <element type="zone"/> <element type="light"/> <element type="price"/> </group> </ElementType>

http://www.html.it/xml/guida/dichielem.htm (2 di 3) [19/06/2001 14.14.29]

XML: Capitolo IV: Ampliare i documenti XML - Dichiarazioni del tipo di elemento

Lezione

successiva

[ S o m m a r i o ]

http://www.html.it/xml/guida/dichielem.htm (3 di 3) [19/06/2001 14.14.29]

XML: Capitolo IV: Ampliare i documenti XML - Dichiarazioni del tipo di attributo

Dichiarazioni del tipo di attributo


Un tipo di attributo viene dichiarato allinterno di un elemento AttributeType. XML-Data supporta gli stessi tipi di attributo disponibili nella DTD XML. ELEMENTI AttributeType Come per lelemento ElementType, in ogni elemento AttributeType deve essere specificato un nome. Le dichiarazioni del tipo di attributo sono di primo livello e indipendenti dalle dichiarazioni del tipo di elemento. Si pu fare riferimento in qualsiasi dichiarazione del tipo di elemento. Eccone un esempio: <AttributeType name="bestseller"/> <ElementType name="plant"> <attribute type="bestseller"/> </ElementType> VALORI PREDEFINITI Un riferimento o una dichiarazione di un tipo di attributo pu includere anche un attributo default, che indica il valore predefinito dellattributo. Ad esempio, nello schema che segue, lattributo default incluso nella dichiarazione del tipo di attributo: <AttributeType name="bestseller" default="yes"/> <ElementType name="plant"> <attribute type="bestseller"/> </ElementType> In questo modo viene specificato che il valore dellattributo default verr applicato ogniqualvolta il tipo di attributo viene utilizzato in un elemento. ATTRIBUTO required Un riferimento o una dichiarazione del tipo di attributo pu contenere un attributo required che specifica se necessario che lattributo abbia un valore. <ElementType name="plant"> <attribute type="bestseller" default="no" required="yes"/> </ElementType>

Lezione

successiva

[ S o m m a r i o ]

http://www.html.it/xml/guida/dichiattr.htm [19/06/2001 14.14.33]

XML: Capitolo IV: Ampliare i documenti XML - Tipi di dati

Tipi di dati
XML-Data supporta una gamma di tipi di dati pi vasta rispetto ai 10 tipi di dati dellXML. Come gli schemi sono definiti dallo spazio dei nomi xml-data, alo stesso modo i tipi di dati sono definiti dallo spazio dei nomi datatypes, come il seguente esempio: <Schema name="wildflowers" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"> <AttributeType name="dateorder"/> <ElementType name="plant"> <attribute type="dateorder"/> </ElementType> </Schema> ATTRIBUTO type Un tipo di dati viene definito riferendosi ad esso con lattributo type nello spazio dei nomi datatypes. Nellesempio seguente, viene specificato un tipo di dati per il tipo di attributo dateorder: <AttributeType name="dateorder" dt:type="dateTime"/> <ElementType name="plant"> <attribute type="dateorder"/> </ElementType> I tipi di dati degli elementi pi usati sono: q char
q q q q q q q

string int float boolean number uri uuid

VINCOLI DEI TIPI DI DATI E possibile applicare vincoli a valori dei tipi di dati. I vincoli facilitano lidentificazione del tipo dei dati contenuti in un elemento o attributo. min e max Gli attributi min e max definiscono i limiti e superiori inclusi relativi ai dati contenuti in un elemento o attributo. enumeration A volte necessario enumerare i valori di un elemento o attributo. Questo possibile mediante il tipo di dati enumeration e lattributo values. maxLength Lattributo maxLength specifica la lunghezza del valore in numero di caratteri.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/tipidati.htm [19/06/2001 14.14.36]

XML: Capitolo IV: Ampliare i documenti XML - Funzionamento degli schemi

Funzionamento degli schemi


Dal momento che uno degli obiettivi principali di XML-Data di fornire una valida alternativa alle DTD, riprendiamo lesempio di DTD del messaggio di posta elettronica e trasformiamolo in uno schema XML-Data. In questo modo sar possibile evidenziare le corrispondenze tra DTD e schemi. MESSAGGIO DI POSTA ELETTRONICA Il documento XML utilizzato nei capitoli precedenti era un messaggio di posta elettronica che comprendeva le informazioni dellintestazione e il contenuto del documento. Ecco il codice XML che appartiene a quel documento: <?xml version="1.0"?> <!DOCTYPE EMAIL SYSTEM "my.dtd"> <EMAIL LANGUAGE="Western" ENCRYPTED="128" PRIORITY="HIGH"> <TO>Marco@msn.com</TO> <FROM>&SIGNATURE;@msn.com</FROM> <CC>Giuseppe@msn.com</CC> <BCC>Naomi@msn.com</BCC> <SUBJECT>Congratulazioni</SUBJECT> <BODY> Ciao, questo e' un esempio di file XML ! </BODY> </EMAIL> Il documento contiene attributi, entit interne e riferimenti alla DTD nel prologo. DTD Una delle operazioni che verranno effettuate sar la sostituzione della DTD con uno schema. Prima di tutto sar necessario rivedere la DTD: <?xml version="1.0"?> <!ELEMENT EMAIL (TO+, FROM, CC*, BCC*, SUBJECT?, BODY?)> <!ATTLIST EMAIL LANGUAGE (Western|Greek|Latin|Universal) "Western" ENCRYPTED CDATA #IMPLIED PRIORITY (NORMAL|LOW|HIGH) "NORMAL"> <!ELEMENT TO (#PCDATA)> <!ELEMENT FROM (#PCDATA)> <!ELEMENT CC (#PCDATA)> <!ELEMENT BCC (#PCDATA)> <!ATTLIST BCC HIDDEN CDATA #FIXED "TRUE"> <!ELEMENT SUBJECT (#PCDATA)> <!ELEMENT BODY (#PCDATA)> <!ENTITY SIGNATURE "Flavio"> Sar necessario incorporare alcuni elementi della DTD nello schema. Oltre a definire la struttura generale di un messaggio di posta elettronica, il DTD contiene altri elementi specifici. q Lelemento To dichiarato con un segno (+), a indicare che dovr occorrere una o pi volte.
q q

Lelemento From dichiarato senza alcun simbolo, a indicare che dovr occorrere una sola volta. Gli elementi Cc e Bcc sono dichiarati con un asterisco (*), a indicare che gli

http://www.html.it/xml/guida/funzio.htm (1 di 5) [19/06/2001 14.14.45]

XML: Capitolo IV: Ampliare i documenti XML - Funzionamento degli schemi


q

elementi sono opzionali, ma possono occorrere pi di una volta. Gli elementi Subject e Body sono dichiarati con un punto di domanda (?), a indicare che gli elementi sono opzionali, ma possono essere ripetuti pi di una volta. Gli elementi Email e Bcc hanno attributi associati, con valori predefiniti. La maggior parte degli elementi sono dichiarati come elementi di testo (#PCDATA). Lentit Signature dichiarata e contiene un valore.

q q q

Gli elementi indicano quanto necessario per creare un documento dello schema che soddisfi i criteri di corrispondenza con la DTD. Lultimo elemento necessario per utilizzare questi esempi una pagina XSL utilizzata come modello per visualizzare i dati. PAGINA XSL La pagina XSL utilizzata per visualizzare il contenuto XML la seguente: <?xml version="1.0"?> <xsl:template xmlns:xsl="uri:xsl"> <DIV STYLE="font-weight:bold;font-size:20"> To: <SPAN STYLE="font-weight:normal;color:red"> <xsl:value-of select="EMAIL/TO"/> </SPAN> </DIV> <BR></BR> <DIV STYLE="font-weight:bold;font-size:20"> From: <SPAN STYLE="font-weight:normal;color:red"> <xsl:value-of select="EMAIL/FROM"/> </SPAN> </DIV> <BR></BR> <DIV STYLE="font-weight:bold;font-size:20"> Cc: <SPAN STYLE="font-weight:normal;color:red"> <xsl:value-of select="EMAIL/CC"/> </SPAN> </DIV> <BR></BR> <DIV STYLE="font-weight:bold;font-size:20"> Subject: <SPAN STYLE="font-weight:normal;color:red"> <xsl:value-of select="EMAIL/SUBJECT"/> </SPAN> </DIV> <HR></HR> <SPAN STYLE="font-style:italic;font-size:32;color:orange"> <xsl:value-of select="EMAIL/BODY"/> </SPAN> </xsl:template> La visualizzazione del documento la seguente:

http://www.html.it/xml/guida/funzio.htm (2 di 5) [19/06/2001 14.14.45]

XML: Capitolo IV: Ampliare i documenti XML - Funzionamento degli schemi

clicca qui per vedere l'esempio email.xml (solo MSIE 5.0 o superiore) SCHEMA A questo punto procediamo con la creazione dello schema. E necessario innanzitutto creare il documento dello schema. Le regole semantiche e strutturali dovranno essere le stesse utilizzate nella DTD. Lesempio seguente contiene il codice dello schema: <?xml version="1.0"?> <Schema name="email" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes"> <AttributeType name="language" dt:type="enumeration" dt:values="Western Greek Latin Universal"/> <AttributeType name="encrypted"/> <AttributeType name="priority" dt:type="enumeration" dt:values="NORMAL LOW HIGH"/> <AttributeType name="hidden" default="true"/> <ElementType name="to" content="textOnly"/> <ElementType name="from" content="textOnly"/> <ElementType name="cc" content="textOnly"/> <ElementType name="bcc" content="mixed"> <attribute type="hidden" required="yes"/> </ElementType> <ElementType name="subject" content="textOnly"/> <ElementType name="body" content="textOnly"/> <ElementType name="email" content="eltOnly"> <attribute type="language" default="Western"/> <attribute type="encrypted"/> <attribute type="priority" default="NORMAL"/> <element type="to" minOccurs="1" maxOccurs="*"/> <element type="from" minOccurs="1" maxOccurs="1"/> <element type="cc" minOccurs="0" maxOccurs="*"/> <element type="bcc" minOccurs="0" maxOccurs="*"/> <element type="subject" minOccurs="0" maxOccurs="1"/> <element type="body" minOccurs="0" maxOccurs="1"/> </ElementType> </Schema> Lo schema molto diverso dalla DTD, tuttavia si tratta sempre di codice XML, per cui la sintassi e limpostazione sono familiari. A questo punto controlliamo il codice in base al seguente elenco di requisiti.

http://www.html.it/xml/guida/funzio.htm (3 di 5) [19/06/2001 14.14.45]

XML: Capitolo IV: Ampliare i documenti XML - Funzionamento degli schemi

Lelemento To dichiarato in modo che sia ripetuto una o pi volte. I riferimenti allelemento To sono gli attributi minOccurs="1" e maxOccurs="*", che indicano che lelemento deve occorrere almeno una volta e che il numero di ripetizioni illimitato. Lelemento From dichiarato in modo che occorra una sola volta. I riferimenti allelemento From sono minOccurs="1" e maxOccurs="1", che indicano che lelemento deve occorrere una sola volta. Gli elementi Cc e Bcc sono dichiarati in modo che gli elementi siano opzionali e occorrano pi di una volta. Ambedue gli elementi devono contenere gli attributi minOccurs="0" e maxOccurs="*", che indicano che sono opzionali e che il numero di occorrenze illimitato. Gli elementi Subject e Body sono dichiarati in modo che gli elementi siano opzionali e che possano occorrere una sola volta. Gli attributi minOccurs="0" e maxOccurs="1" indicano che gli elementi sono opzioni e che possono apparire una sola volta. Gli elementi Email e Bcc hanno attributi associati, con valori predefiniti dove necessario. I tipi di attributi sono dichiarati nel livello superiore del documento e vi viene fatto riferimento nelle rispettive dichiarazioni dei tipi di elemento. Non occorre dichiarare i tipi di attributi al livello superiore, poich sufficiente che siano dichiarazioni a livello locale. La maggior parte degli elementi dichiarata come elementi di testo. La maggior parte delle dichiarazioni include lattributo content"textOnly", che indica che esse contengono solo testo. Leccezione rappresentata dallelemento Email, che contiene solo sottoelementi, e dallelemento Bcc, che contiene un attributo oltre al testo. Lentit Signature dichiarata e contiene un valore. Le entit non sono ancora supportate negli schemi XML-Data, per cui non necessario aggiungere nulla. Se lo schema soddisfa tutti i requisiti relativi al messaggio di posta elettronica, possibile passare alla modifica dellelemento XML per utilizzarlo con lo schema, nel modo seguente: <?xml version="1.0"?> <em:email xmlns:em="x-schema:myschema.xml" language="Western" encrypted="128" priority="HIGH"> <em:to>Marco@msn.com</em:to> <em:from>Flavio@msn.com</em:from> <em:cc>Giuseppe@msn.com</em:cc> <em:subject>Congratulazioni</em:subject> <em:body>Ciao, questo e' un esempio di file</em:body> </em:email> In questo modo possibile notare due importanti differenze rispetto alla versione DTD nel documento XML. Innanzitutto, invece del riferimento alla DTD nel prologo, nellelemento em:email presente lo spazio del nome dello schema. Inoltre nel documento tutti i tag degli elementi contengono il prefisso em, che li identifica come parte di un namespace associato. Ad eccezione di queste due piccole ma importanti differenze, il documento fondamentalmente lo stesso utilizzato per lesempio del messaggio di posta elettronica iniziale. Le regole strutturali del documento sono uguali perch da un punto di vista funzionale lo schema corrisponde alla DTD creata precedentemente. Per formattare il documento XML, viene utilizzato lo stesso foglio di stile XSL del messaggio di posta elettronica con lunica differenza che nei pattern viene inserito il prefisso em. <?xml version="1.0"?> <xsl:template xmlns:xsl="uri:xsl"> <DIV STYLE="font-weight:bold;font-size:20"> To: <SPAN STYLE="font-weight:normal;color:red"> <xsl:value-of select="em:email/em:to"/> </SPAN> </DIV> <BR></BR> <DIV STYLE="font-weight:bold;font-size:20"> From: <SPAN STYLE="font-weight:normal;color:red"> <xsl:value-of select="em:email/em:from"/> </SPAN>

http://www.html.it/xml/guida/funzio.htm (4 di 5) [19/06/2001 14.14.45]

XML: Capitolo IV: Ampliare i documenti XML - Funzionamento degli schemi

</DIV> <BR></BR> <DIV STYLE="font-weight:bold;font-size:20"> Cc: <SPAN STYLE="font-weight:normal;color:red"> <xsl:value-of select="em:email/em:cc"/> </SPAN> </DIV> <BR></BR> <DIV STYLE="font-weight:bold;font-size:20"> Subject: <SPAN STYLE="font-weight:normal;color:red"> <xsl:value-of select="em:email/em:subject"/> </SPAN> </DIV> <HR></HR> <SPAN STYLE="font-style:italic;font-size:32;color:orange"> <xsl:value-of select="em:email/em:body"/> </SPAN> </xsl:template> E possibile notare che nonostante il codice sia molto diverso rispetto ai documenti di origine, il risultato pressoch lo stesso. Inoltre si ottiene un documento convalidato con i vantaggi offerti da uno schema, invece di una DTD, insieme alle potenzialit e alla flessibilit dellXSL per la formattazione.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/funzio.htm (5 di 5) [19/06/2001 14.14.45]

XML: Capitolo V: Applicazioni dell'XML

Channel Definition Format (CDF)


Channel Definition Format (CDF) una applicazione XML sviluppata dalla Microsoft che permette di creare un file che descrive un canale Web. Nel World Wide Web un canale un sito Web che presenta informazioni aggiornate periodicamente; un utente pu abbonarsi a tale canale e ricevere in modo automatico le informazioni aggiornate. Per utilizzare questo servizio lutente ha bisogno del browser Microsoft Internet Explorer 4.0 o successive edizioni.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/cdf.htm [19/06/2001 14.14.50]

XML: Capitolo V: Applicazioni dell'XML - Webcasting (tecnologia push)

Webcasting (tecnologia push)


CDF implementa la tecnologia Webcasting (detta anche tecnologia push) che in generale permette di aggiornare informazioni che risiedono sul computer di un utente. Tale aggiornamento avviene periodicamente tramite il World Wide Web. La tecnologia Webcasting stata implementata sia dalla Microsoft (MSIE), che dalla Netscape (Netcaster, componente della suite Communicator). Nel Web esistono anche altri servizi che implementano tale tecnologia, come Pointcast e Backweb. In generale quando si naviga in Internet il browser recupera le pagine da un server WWW. Questo recupero viene spesso definito pulling (estrarre): il browser estrae le pagine dal server e le invia al desktop. Con la tecnologia Webcasting si pu fare molto di pi: il server WWW che "spinge" le informazioni nel client (per questo viene chiamata anche tecnologia push) senza che lutente ne faccia specifica richiesta (a parte ovviamente la richiesta di abbonamento iniziale). In questo modo laccesso alle informazioni da parte dellutente avviene senza ritardi dovuti al download. Laccesso pu avvenire anche off-line (utente non collegato ad Internet) poich le informazioni vengono memorizzate in una cache; inoltre lutente sicuro di rimanere sempre aggiornato. In pratica il modo push di raccolta delle informazioni possibile solo in ambiente intranet perch il server sicuro di trovare i client sempre disponibili a ricevere le informazioni aggiornate. In un ambiente home (utente che si collega saltuariamente ad Internet) il modo di raccolta delle informazioni detto smart pull: il browser estrae le informazioni dal server WWW ma con due differenze molto importanti rispetto il modo pulling: q Il browser sa dove cercare le informazioni che interessano, quindi non si devono pi sprecare ore per la loro ricerca.
q

Si pu impostare il browser in modo che controlli automaticamente le nuove informazioni sul server WWW quando ci colleghiamo ad Internet.

In una soluzione smart pull esiste sul client un programma detto scheduler che automaticamente controlla via HTTP la presenza di informazioni aggiornate sul server WWW che ospita il canale a cui ci siamo abbonati. Per programmare lo scheduler deve esistere un file che contenga informazioni sul canale, quali lURL del canale stesso, la frequenza con cui vengono aggiornate le informazioni, etc. CDF una proposta della Microsoft per standardizzare file di questo tipo.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/push.htm [19/06/2001 14.14.52]

XML: Capitolo V: Applicazioni dell'XML - Struttura di un file CDF

Struttura di un file CDF


Un file CDF deve essere preparato dallamministratore del canale; contiene tutte le informazioni sul canale e tutte le informazioni su come il client deve eseguire lo smart pull. Vediamo un semplice esempio di file CDF: <?XML version="1.0"?> <CHANNEL HREF="http://www.miosito.com/index.html" LASTMOD="1998-07-07T12.00" LEVEL="2" PRECACHE="YES"> <TITLE>Il mio sito</TITLE> <ABSTRACT>Nel mio sito potete trovare informazioni molto utili su tutto</ABSTRACT> <SCHEDULE> <INTERVALTIME DAY="1"/> </SCHEDULE> <LOGO HREF="http://www.miosito.com/images/logo.gif" STYLE="IMAGE"/> </CHANNEL> La prima istruzione specifica che il file CDF un documento XML. A questo proposito, MSIE 4 include al suo interno un processore XML scritto in C++ per interpretare i file CDF. Channel lelemento root; lattributo Href identifica il canale (tramite URL). Lattributo Lastmod specifica la data dellultimo aggiornamento del canale quindi devono essere scaricate tutte le pagine che sono state modificate dopo le ore dodici del 7 Luglio 1998; lattributo Level specifica che devono essere scaricate anche tutte la pagine collegate alle pagine del canale (fino al secondo livello). Infine lattributo Precache specifica che il contenuto scaricato deve essere memorizzato nella cache del client. Lelemento Title contiene il titolo del canale e lelemento Abstract una descrizione dettagliata del suo contenuto. Lelemento Schedule serve per specificare al client la frequenza degli aggiornamenti; nellesempio il client sa che ogni giorno sono disponibili nuovi aggiornamenti. Per specificare la frequenza in base alla quale un canale deve essere aggiornato, possibile utilizzare un programma (schedule). possibile utilizzare anche lattributo Hour: <SCHEDULE> <INTERVALTIME HOUR="12"/> <ERLIESTTIME HOUR="1"/> <LATESTTIME HOUR="2"/> </SCHEDULE> Il codice riportato specifica che gli aggiornamenti si verificano ogni dodici ore (in generale il primo aggiornamento parte sempre a mezzanotte). Per evitare che il server subisca degli overload nelle ore specificate (nellesempio a mezzanotte e a mezzogiorno), lamministratore del canale inserisce anche gli elementi Earliesttime e Latesttime, che obbliga il client a collegarsi fra luna e le due e fra le tredici e le quattordici (naturalmente le ore sono riferite a questo esempio). In Schedule possibile specificare anche gli attributi Startdate e Stopdate per specificare la data di inizio e di fine del programma: <SCHEDULE STARTDATE="1998-01-01" STOPDATE="1998-12-31"> <INTERVALTIME DAY="1"/> </SCHEDULE> Infine lelemento Logo associa al canale unimmagine; lattributo Style specifica le dimensioni dellimmagine: Value Size "ICON" 16H x 16W
http://www.html.it/xml/guida/strutturacdf.htm (1 di 3) [19/06/2001 14.15.04]

XML: Capitolo V: Applicazioni dell'XML - Struttura di un file CDF

"IMAGE" 32H x 80W "IMAGE-WIDE" 32H x 194W Se un canale diviso in varie sezioni, possibile impostare delle gerarchie nel file CDF. Lelemento root Channel pu contenere altri elementi Channel; ogni elemento Channel pu contenere degli elementi Item. Vediamo un esempio: <?XML VERSION="1.0"?> <CHANNEL BASE="http://www.stream.it/iechannel/" HREF="home/stream.htm"> <TITLE>I Canali Stream</TITLE> <ABSTRACT>I canali Stream: intrattenimento, viaggi, news... e molto altro!</ABSTRACT> <LOGO HREF="images/80x32.gif" STYLE="IMAGE"/> <SCHEDULE> <INTERVALTIME DAY="1"/> <EARLIESTTIME HOURS="6"/> </SCHEDULE> <CHANNEL HREF="games/news/gamenews.htm"> <TITLE>InGame</TITLE> <ABSTRACT>Giochi sempre nuovi, insieme a tutte le news dal mondo ludico</ABSTRACT> <LOGO HREF="games/16_ingame.ico"STYLE="ICON"/> <ITEM HREF="games/fotomisteriosa/fotomisteriosa.html" LASTMOD="1997.09.30T14:49+0100" PRECACHE="YES" LEVEL="1"> <TITLE>La foto misteriosa</TITLE> <ABSTRACT>Confrontati con questo rompicapo... Buon divertimento</ABSTRACT> <LOGO HREF="games/fotomisteriosa/icona.ico" STYLE="ICON"/> </ITEM> </CHANNEL> <CHANNEL HREF="plugintv/root.htm"> <TITLE>PlugINTV</TITLE> <ABSTRACT>La televisione a portata di click</ABSTRACT> <LOGO HREF="plugintv/16_plugintv.ico" STYLE="ICON"/> </CHANNEL> <CHANNEL HREF="cinema/default.htm"> <TITLE>Cinematografo</TITLE> <ABSTRACT>Cinematografo: tutto sui nuovi film nelle sale e in videocassetta</ABSTRACT> <LOGO HREF="cinema/16_cinematografo.ico" STYLE="ICON"/> </CHANNEL> <CHANNEL HREF="tecnologia/default.htm"> <TITLE>Tecnologia</TITLE> <ABSTRACT>Informazioni sulle ultime novit della tecnologia</ABSTRACT> <LOGO HREF="tecnologia/16_tecnologia.ico" STYLE="ICON"/> </CHANNEL> <CHANNEL HREF="viaggi/viagginews.htm"> <TITLE>Canale Viaggi</TITLE> <ABSTRACT>Viaggi, con informazioni su paesi e itinerari consigliati</ABSTRACT> <LOGO HREF="viaggi/16_canaleviaggi.ico" STYLE="ICON"/> </CHANNEL> <ITEM HREF="meteo/default.htm" LASTMOD="1997.09.30T14:06+0100" PRECACHE="YES" LEVEL="1"> <TITLE>Meteo</TITLE> <ABSTRACT>Previsioni meteorologiche sull'Italia e l'Europa aggiornate costantemente</ABSTRACT> <LOGO HREF="16_meteo.ico" STYLE="ICON"/> </ITEM> </CHANNEL> Lattributo Base dellelemento root Channel specifica lURL di tutti gli elementi innestati (Channel e Item). Ogni elemento innestato ha chiaramente il suo URL relativo. Per ogni elemento innestato pu essere specificato oltre allURL relativo, il titolo (Title), la

http://www.html.it/xml/guida/strutturacdf.htm (2 di 3) [19/06/2001 14.15.04]

XML: Capitolo V: Applicazioni dell'XML - Struttura di un file CDF

descrizione dettagliata (Abstract) e il logo (Logo). Gli attributi dellelemento Item sono Href, Lastmode, Precache e Level (gi descritti per lelemento Channel). Questo file CDF di esempio viene visualizzato da MSIE 4 nella barra dei canali come in Fig. 5.1.

Fig. 5.1: Esempio di file CDF visualizzato nella barra dei canali di MSIE.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/strutturacdf.htm (3 di 3) [19/06/2001 14.15.04]

XML: Capitolo V: Applicazioni dell'XML - Utilizzo del file CDF

Utilizzo del file CDF


Il file CDF che descrive il canale deve semplicemente essere inserito nella directory root del sito Web. Quindi nella home page si inserisce licona caratteristica Add Active Channel che deve essere collegata al file CDF. Quando lutente accede al sito per abbonarsi al canale deve semplicemente cliccare sullicona Add Active Channel (Fig 5.2)

Fig. 5.2 Pulsante per aggiungere un canale Il browser MSIE 4 (necessario per questo tipo di servizio) riconosce il canale e guida lutente nella procedura di abbonamento. La procedura di abbonamento consiste nello scaricare sul client il file CDF e il relativo logo; quindi viene visualizzata una finestra di dialogo che permette di personalizzare la modalit di abbonamento al canale (Fig. 5.3).

Fig. 5.3: Finestra di dialogo per personalizzare labbonamento ad un canale Le scelte disponibili sono le seguenti: q Aggiungere alla barra dei canali: viene semplicemente aggiunto il canale alla barra dei canali; la funzione meno interessante.
q q

Aggiungere e comunicare: il canale viene aggiunto e viene notificato via e-mail quando il suo contenuto sul server cambiato. Aggiungere e scaricare: lopzione che sfrutta pienamente la potenza dei canali. Ogni volta che ci colleghiamo ad Internet, MSIE controlla automaticamente se sono disponibili nuovi aggiornamenti (dallelemento Schedule del file CDF) e in caso affermativo effettua il download delle pagine, memorizzandole nella cache, in modo che siano disponibili anche off-line.

Effettuata la scelta, la procedura di abbonamento conclusa e da quel momento si abbonati al canale.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/utilizzo.htm [19/06/2001 14.15.09]

XML: Capitolo V: Applicazioni dell'XML - Esempio di un canale

Esempio di un canale
Questo un semplice esempio su come far diventare il proprio sito Web un canale con tecnologia CDF. Questo il file HTML:

<HTML> <HEAD> <TITLE>Marco Giann - Canale Personale/TITLE> </HEAD> <BODY BGCOLOR="#FFFFFF" LINK="#800000" VLINK="#000080"> <BR><BR> <H1> Salve,</H1> <IMG SRC="casa.gif" BORDER="0" ALIGN="right"> <H3>sono Marco Giann e questo il mio canale personale. Qui potete trovare le informazioni sulle mie ricerche.</H3> <H2>Sottoscriviti, gratis</H2> <BR> <A HREF="javascript:window.external.addChannel ('http://www.miosito.com/mio.cdf')"> <IMG SRC="ieaddchanne.gif" BORDER="0"> </A> <BR> </BODY> </HTML>
Lelemento significativo il valore di Href dellancora A, che richiama una funzione javascript che MSIE utilizza per effettuare la procedura di abbonamento. Questo il file CDF: <?XML VERSION="1.0"?> <CHANNEL HREF="http://www.miosito.com/index.htm"> <TITLE>Marco Giann- Canale Personale</TITLE> <ABSTRACT>Mia homepage</ABSTRACT> <SCHEDULE> <INTERVALTIME DAY="1"/> </SCHEDULE> </CHANNEL> La Fig. 5.4 mostra la pagina del canale.

http://www.html.it/xml/guida/esempcdf.htm (1 di 2) [19/06/2001 14.15.20]

XML: Capitolo V: Applicazioni dell'XML - Esempio di un canale

Fig. 5.4: Un esempio di canale.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/esempcdf.htm (2 di 2) [19/06/2001 14.15.20]

XML: Capitolo V: Applicazioni dell'XML - Synchronized Multimedia Integration Language (SMIL)

Synchronized Multimedia Integration Language (SMIL)


Il linguaggio SMIL (Synchronized Multimedia Integration Language) stato progettato per permettere lintegrazione di un assortimento di oggetti multimediali in modo sincronizzato. SMIL permette la creazioni di presentazioni ed progettato per mettere insieme sul Web i componenti multimediali. SMIL 1.0 stato recentemente rilasciato come raccomandazione W3C. Una delle funzioni affascinanti che tutta la presentazione viene coordinata in una descrizione di facile lettura. La sintassi utilizzata il linguaggio XML. Lo standard proposto dallo SMIL definisce i tag (per esempio, <audio> per i file audio, <video> per i file video, <text> per i file di testo, <img> per le immagini), ma lo standard non stabilisce un formato particolare per un determinato tag. Si pu decidere di utilizzare il formato di file Wav per il suono, il formato di file Mpeg per il video e i formati Gif, Jpeg e/o Png per le immagini. Il linguaggio SMIL stato progettato sulla base di alcune idee e su due concetti: le presentazioni parallele e quelle in sequenza. Le prime combinano contemporaneamente componenti multimediali per fornire unimmagine completa; le seconde vengono fornite in una serie di fasi individuali.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/smil.htm [19/06/2001 14.15.23]

XML: Capitolo V: Applicazioni dell'XML - Struttura di SMIL

Struttura di SMIL
Una descrizione SMIL incorporata allinterno del tag SMIL. I documenti SMIL sono composti da due parti: una testa e un corpo. Ognuna di queste parti potrebbe contenere istruzioni XML speciali, quali commenti e istruzioni di elaborazione. La testa di un documento indicata dal tipo di elemento Head, il corpo dal tipo di elemento Body. <smil> <head> <!-- questa la parte della testa --> </head> <body> <!-- Questa al parte del corpo --> </body> </smil> IN TESTA La sezione della testa di un documento SMIL viene utilizzata per descrivere gli aspetti legati al layout della presentazione e contiene alcune metainformazioni sulla presentazione. I metadati possono stabilire che un documento SMIL non abbia limiti precisi. La sintassi ufficiale per descrivere alcuni metadati : <meta name="NomeDellaVariabile" content="ValoreDellaVariabile" /> Il linguaggio SMIL ha alcuni nomi predefiniti per i metadati: q sync: la sincronizzazione di una presentazione SMIL pu essere definita come rigida o flessibile. Rigida significa che un interprete SMIL deve seguire le regole di sincronizzazione per le presentazioni per le preentazioni parallele degli oggetti multimediali proprio come sono state definite. Flessibile significa che viene data una certa libert di azione durante lesecuzione.
q q

title: serve per assegnare un nome alla presentazione. pics-label: PICS lacronimo di Platform for Internet Content Selection. Le eticehtte PICS vengono utilizzate per fornire un controllo migliore sul contenuto al quale pu accedere un determinato pubblico. NEL CORPO

Si possono definire tre stili di presentazione diversi nel corpo di una presentazione SMIL, due dei quali di particolare importanza, lo stile parallelo e quello in sequenza.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/strutturasmil.htm [19/06/2001 14.15.26]

XML: Capitolo V: Applicazioni dell'XML - Stile parallelo

Stile parallelo
Lo stile parallelo viene utilizzato per descrivere come due oggetti sono presentati contemporaneamente e come linizio e la fine sono correlati tra di loro (Fig. 5.5).

Fig. 5.5 Oggetti multimediali in stile parallelo Un blocco parallelo viene indicato dal tag <par>. Per esempio, un oggetto audio e un oggetto immagine per lo stile parallelo possono essere descritti in questo modo: <par> <audio ... /> <img ... /> </par> Per default, lora di conclusione di una presentazione parallela lora massima di conclusione di tutti gli oggetti. Tuttavia si pu controllare lora di conclusione. Lattributo facoltativo endsync specifica che la fine della sezione parallela dipende dal tempo specificato di conclusione di uno dei suoi figli. Esso pu avere due valori distinti e ha una sintassi generica: q last: questo valore conclude la presentazione quando lultimo oggetto termina.
q q

first: questo lopposto di last id-ref: il progettista pu rendere la durata di questo gruppo parallelo dipendente dalla conclusione dellazione di un oggetto specifico.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/paral.htm [19/06/2001 14.15.30]

XML: Capitolo V: Applicazioni dell'XML - Stile in sequenza

Stile in sequenza
Una sequenza definisce una serie di oggetti che devono essere eseguiti in ordine sequenziale. Per esempio, prima si vede video 1 e poi video 2 (Fig. 5.6).

Fig. 5.6 Una sequenza semplice La sintassi generale per una sequenza la seguente : <seq> <!-- primo oggetto --> <!-- secondo oggetto --> </seq> Il primo oggetto inizia la presentazione nel momento in cui stato programmato che tutta la sequenza abbia inizio. Il resto degli oggetti avvia la propria azione quando terminano i suoi predecessori. La sequenza completa finisce quando lultimo membro ha terminato la sua presentazione. ATTRIBUTI BEGIN ED END Gli attributi begin ed end cambiano il tempo di inizio e di fine di default di un elemento. In base al tipo di oggetto al quale sono applicati questi attributi, la semantica differente. I valori che questi attributi possono avere sono valori di offset oppure eventi qualificati. Nelle sequenze, il valore di offset determina il tempo tra la fine delloggetto precedente e linizio di quello successivo. Nella specifica parallela lattributo begin specifica un ritardo rispetto al tempo globale di inizio delloggetto parallelo.

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/seque.htm [19/06/2001 14.15.33]

XML: Capitolo V: Applicazioni dell'XML - Specifiche dell'impostazione

Specifiche dell'impostazione
La specifica SMIL afferma che possibile utilizzare un assortimento di formati di specifica dellimpostazione differenti insieme alla presentazione SMIL. Tuttavia, SMIL viene fornito con una proposta di un semplice meccanismo di specifica dellimpostazione. SMIL utilizza il concetto dei canali per specificarne limpostazione. Un canale definisce la posizione, le dimensioni e la scala di un oggetto multimediale. I canali che si sovrappongono sono gestiti da un processo denominato clipping (ritagliare), che si occupa di gestire le immagini che sono troppo grandi o troppo piccole per essere inserite perfettamente in una determinata area. Ogni canale definito deve avere un ID univoco mediante il quale viene identificato. Si pu anche utilizzare limpostazione di default inserendo questo frammento di codice nella descrizione SMIL: <layout type="text/smil - basic"></layout> La posizione di un canale viene definita dai valori seguenti: q top: questo valore viene definito come la distanza rispetto alla parte superiore dellarea di rappresentazione.
q

left: questo valore descrive la distanza rispetto allangolo sinistro della finestra di rappresentazione.

Le proporzioni di un canale sono definite dalla larghezza e dallaltezza: q width: questo tag, se disponibile, definisce la larghezza di un oggetto. Se non viene specificato un valore, width viene definito come lo spazio tra la posizione left e langolo destro dellarea di rappresentazione.
q

height: questo tag la controparte di width e segue le stesse regole. Se non viene specificata unaltezza, il valore viene calcolato come lo spazio tra una coordinata top e la parte inferiore dellarea di rappresentazione.

Figura La definizione delle coordinate dello schermo CLIPPING La funzione di ritaglio (clipping) permette di gestire quelle situazioni nelle quali le dimensioni effettive delloggetto non corrispondono alle proporzioni specificate nella definizione del canale. Il linguaggio SMIL fornisce un insieme di attributi che possono essere utilizzati per controllare la strategia del ritaglio, se una cosa di questo tipo dovrebbe verificarsi. Il nome dellattributo clip e i possibili valori sono i seguenti:

http://www.html.it/xml/guida/imposta.htm (1 di 2) [19/06/2001 14.15.37]

XML: Capitolo V: Applicazioni dell'XML - Specifiche dell'impostazione


q

meet (valore di default): indica al software di presentazione scalare di un oggetto, pur mantenendo il rapporto, fino a quando laltezza o la larghezza delloggetto non rientra nel canale. slice: questo valore indica che un oggetto viene scalato, mantenendo il rapporto fino a quando laltezza o la larghezza non rientra nelle proporzioni del canale. fill: si comporta in modo simile al tag di immagine HTML (<img>). Allunga la larghezza e laltezza delloggetto in modo ceh corrisponda alle proporzioni del canale. visible: questo valore significa che la larghezza e laltezza di un elemento sono ampliate per contenere tutto il contenuto rappresentato. hidden: simile a slice; lunica differenza che il software SMIL non regola la larghezza o laltezza per adattare loggetto, perlomeno per quanto riguarda uno degli assi. auto: questo valore lascia allapplicazione il compito di gestire le immagini che non si adattano alle dimensioni.. scroll: questo valore indica che devono essere aggiunte le barre di scorrimento al canale.

q q

q q

q q

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/imposta.htm (2 di 2) [19/06/2001 14.15.37]

XML: Capitolo V: Applicazioni dell'XML - Switching

Switching
Spesso la descrizione di una presentazione come quella SMIL, dovrebbe fornire un metodo per descrivere una serie di alternative dalle quali possibile effettuare una selezione in base allinput dellutente o alle variabili di ambiente. Il linguaggio SMIL utilizza la primitiva switch per fornire questa funzione. Lo switching SMIL si basa su alcuni attributi predefiniti. Ma, nello spirito dellXML, si possono specificare i propri attributi di switching. BITRATE Bitrate permette al progettista di una presentazione di fornire oggetti multimediali alternativi in base allampiezza di banda del consumatore. In questo modo, possibile raggiungere un maggiore equilibrio tra velocit, dimensioni e qualit delloutput. Per gli utenti moderni, un bitrate tipico dovrebbe essere 14.000 bps (bit per secondo), 28.000 bps, 56.000 bps oppure 128.000 bps nel caso di una linea ISDN. Con questo tipo di informazioni, lapplicazione potrebbe scegliere un oggetto particolare in base a quello che sa sulla velocit di downloading del proprio ambiente. In alternativa, potrebbe richiedere allutente di scegliere un oggetto. Ecco un esempio: <switch> <par bitrate="14400"> <!-- alcuni oggetti multimediali --> </par> <par bitrate="28800"> <!-- alcuni oggetti multimediali -- > </par> <par bitrate="56000"> <!-- alcuni oggetti multimediali --> </par> </switch> LINGUA Lattributo lang in SMIL fornisce semplicemente un elenco di opzioni ed diverso dallattributo lang in XML, che si occupa invece della codifica delle lingue. Ecco il codice per la sintassi di queste specifiche di lingua : <switch> <audio src="interview-in-french" language="fr"/> <audio src="interview-in-german" language="de"/> <audio src="interview-in-english" language="en"/> </switch> DIMENSIONI DELLO SCHERMO Il linguaggio SMIL permette di specificare un parametro per le dimensioni dello schermo disponibili per la presentazione. Il numero che si utilizza indica il numero delle unit di pixel che sono disponibili sullo schermo. Ecco un esempio: <switch> <par screen-size="640x480"> <!-- oggetti multimediali per 640x480 --> </par> <par screen-size="1280x1024"> <!-- oggetti multimediali per 1280x1024 --> </par> </switch> PROFONDITA DELLO SCHERMO La profondit della tavolozza di colori dello schermo una caratteristica del supporto di output che rende difficile al progettista fornire una soluzione che risponda a tutte le

http://www.html.it/xml/guida/switch.htm (1 di 2) [19/06/2001 14.15.41]

XML: Capitolo V: Applicazioni dell'XML - Switching

esigenze. I valori tipici per la profondit dello schermo sono 8, 16 e 32. Il codice seguente quello dellesempio precedente con laggiuta dei valori di attributo per screen-depth: <switch> <par screen-size="640x480" screen-depth="32"> <!-- oggetti multimediali per 640x480 --> </par> <par screen-size="1280x1024" screen-depth="16"> <!-- oggetti multimediali per 1280x1024 --> </par> </switch>

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/switch.htm (2 di 2) [19/06/2001 14.15.41]

XML: Capitolo V: Applicazioni dell'XML - Esempio SMIL

Esempio SMIL
Bench Microsoft Internet Explorer e Netscape Navigator non siano al momento in grado di supportare direttamente il linguaggio SMIL, diversi produttori forniscono il supporto browser necessario. Per visualizzare quindi un file SMIL possibile utilizzare un utilit o un plug-in separato di riproduzione, quale RealPlayer G2 sviluppato da RealNetworks. Comunque, nel tentativo di non essere completamente esclusa dal gioco, Microsoft ha recentemente annunciato una controproposta di standard chiamata HTML+TIME. Vediamo un esempio realizzato con SMIL Composer, un software gratuito che permette di creare un file SMIL in modo semplice e veloce e che potr poi essere visualizzato con RealPlayer. <smil> <head> <meta name="author" content="Marco"/> <meta name="title" content="Demo"/> <meta name="copyright" content=" 1999"/> <layout> <root-layout height="196" width="136"/> <region id="composer_Region" left="0" top="0" height="100" width="106" z-index="1"/> <region id="my_Region" left="0" top="0" height="196" width="136" z-index="0"/> </layout> </head> <body> <seq> <video id="composer" src="media/composer.rm" region="composer_Region" system-bitrate="13178"/> <par> <img id="my" src="media/my.rp" region="my_Region" system-bitrate="12000"/> <switch> <audio id="france" src="media/france.ra" system-language="fr" system-bitrate="8041"/> <audio id="usa" src="media/usa.ra" system-language="en" system-bitrate="8041"/> <audio id="turkey" src="media/turkey.ra" system-language="tr" system-bitrate="8041"/> </switch> </par> </seq> </body> </smil> La parte destra della schermata nella figura seguente mostra il codice SMIL della presentazione multimediale.

http://www.html.it/xml/guida/esempsmil.htm (1 di 2) [19/06/2001 14.16.04]

XML: Capitolo V: Applicazioni dell'XML - Esempio SMIL

Conclusa la presentazione, il programma stesso consente di visualizzare lanteprima lanciando automaticamente il player.

clicca qui per vedere l'esempio demo.smi (solo con RealPlayer G2)

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/esempsmil.htm (2 di 2) [19/06/2001 14.16.04]

XML: Conclusioni

Conclusioni
Lenorme sviluppo di Internet degli ultimi anni ha creato un interesse sempre maggiore verso questa tecnologia. Sempre pi persone utilizzano la rete per lavorare, comunicare, giocare, comprare, cercare informazioni di ogni genere. Grazie alla sua interfaccia attraente e amichevole, il World Wide Web lo strumento di Internet pi utilizzato. La grande eterogeneit dei servizi che deve fornire, ha messo in crisi lHTML, il linguaggio utilizzato per condividere le informazioni nel WWW. Lorigine di tale crisi da ricercarsi nel fatto che lHTML un linguaggio non estensibile e quindi incapace di adattarsi a tutti i compiti che chiamato a risolvere. Per questo motivo stato creato un nuovo linguaggio, lXML, che ha come punto di forza proprio la capacit di essere estensibile, quindi di permettere ai progettisti di documenti di gestire fonti multiple di dati e di creare ambienti personalizzati per tipi speciali di dati. Lanalisi svolta ha riguardato i seguenti punti: q Limportanza dellXML: partendo dai limiti dellHTML, si cercato di capire quali sono i punti di forza dellXML, e come questo linguaggio potrebbe risolvere molti dei problemi presenti nel Web.
q q

Le basi dellXML: dalla specifica del linguaggio si cercato di capire come costruire e utilizzare nel Web documenti XML. Lutilizzo del linguaggio XML: dalla definizione di metalinguaggio si cercato di capire come ampliare i documenti XML con altri linguaggi derivati quali lXLL, lXSL e lXML-Data. Le applicazioni dellXML: sono state studiate due applicazioni che si basano sullXML: il CDF e lo SMIL.

Dallanalisi svolta sono emersi i seguenti importanti fattori: q La semplicit del linguaggio XML: le descrizioni della sintassi nella specifica XML utilizza una grammatica formale concisa, semplice da capire e facile da trasformare in codice di programmazione.
q

La semplicit dei documenti XML: il concetto di documento ben formattato consente limmediata comprensione della struttura dati presente nel documento stesso. L'estensibilit dei tag permette di comprendere in modo semplice e intuitivo il significato dei dati presenti nel documento. Questi due aspetti sono molto utili sia per le applicazioni che per gli sviluppatori software. La semplicit degli strumenti software XML: il software XML menzionato in precedenza tutto scritto in Java. Questo semplifica molto la codifica di tali strumenti; inoltre, visto lambiente in cui si trovano ad operare, molto importante che la dimensione sia contenuta (si pensi infatti ad un applet Java che deve essere scaricato assieme al dati). Pur essendo gli strumenti analizzati molto semplici, prevedibile che in futuro anche applicazioni pi complesse rimangano aderenti a questa filosofia.

chiaro allora che il grosso punto di forza del linguaggio rispetto ad altri dello stesso tipo la sua grande semplicit. Questo non un caso visto che lXML un sottoinsieme dellSGML, linguaggio molto potente e flessibile, ma anche molto complicato e difficile. LXML unisce la potenza e la flessibilit dellSGML, con la semplicit e la facilit duso. Le classi di applicazioni che trarranno il maggior beneficio dallXML sono lo scambio dei dati e la costruzione di pagine Web. Questo nuovo linguaggio avr probabilmente un impatto deciso nel campo di Internet nel prossimo futuro e cambier completamente lo scenario a cui gli utenti sono ora abituati.

Lezione

successiva

http://www.html.it/xml/guida/conclu.htm (1 di 2) [19/06/2001 14.16.09]

XML: Conclusioni

[Sommario]

http://www.html.it/xml/guida/conclu.htm (2 di 2) [19/06/2001 14.16.09]

XML: Appendice A: Strumenti software - Il processore XML

Il processore XML
Un processore XML un modulo software utilizzato per leggere documenti XML e verificare che soddisfino la specifica XML. La sua funzione principale consiste nellanalisi e nella convalida dei dati XML. Un processore XML fornisce anche il contenuto di un documento ad una eventuale applicazione; questo vuol dire che una qualsiasi applicazione che deve interagire con documenti XML deve avere al suo interno un processore XML. Un processore pu essere utilizzato in modo standalone, per verificare che un documento appena scritto soddisfi la specifica XML, quindi che sia o ben formattato (se non accompagnato da nessun DTD) o valido (se accompagnato da DTD). dunque uno strumento necessario per chi scrive file XML in generale. Per indicare al processore a quale specifica un documento si riferisce bisogna sempre indicare nella prima istruzione il numero di versione di tale specifica: <?xml version="1.0"?> Chiaramente un processore segnala errore se riceve un documento con un numero di versione che non supporta. In generale gli errori che un processore riporta sono di due tipi: q Error: violazione di una regola della specifica; il processore notifica allapplicazione lerrore rilevato e continua sia ad analizzare il documento, sia a fornirne il contenuto allapplicazione; questultima che deve decidere il comportamento rispetto allerrore (ignorarlo, cercare di correggerlo, etc.).
q

Fatal error: grave violazione di una regola della specifica; il processore notifica allapplicazione lerrore rilevato e pu o meno continuare lanalisi del documento per cercare altri errori; non deve per continuare a fornire il contenuto del documento allapplicazione.

Ad esempio una violazione di un vincolo espresso in un DTD (chiaramente non il DTD dellXML, ma un DTD scritto dallutente) considerata un "error"; una violazione di una regola di buona formattazione invece considerata un "Fatal error" (violare una regola di buona formattazione vuol dire violare un vincolo espresso nel DTD dellXML). Ci sono due tipi di processori XML: validating e non-validating (in genere un processore di tipo validating viene chiamato parser). Sia i processori validating che quelli non-validating, devono riportare le violazioni delle regole di buona formattazione incontrate nellentit documento ed in generale in una qualsiasi entit parsed. Un processore validating deve anche riportare le violazioni dei vincoli espressi attraverso le dichiarazioni nel DTD; per far questo deve poter leggere e processare lintero DTD. Un processore non-validating deve poter accedere allintera entit documento, incluso leventuale DTD interno (ma solo per verificare che anche questa parte del documento sia ben formattata); questultimo fornisce vantaggi nelle prestazioni dato che non deve leggere ed elaborare la DTD. Allo stato attuale sono disponibili alcuni processori di pubblico dominio (shareware e freeware) che possono essere utilizzati in modo standalone. La maggior parte degli elaboratori disponibili viene creata mediante il linguaggio di programmazione Java e anche le applicazioni tendono ad essere pi lente rispetto alle applicazioni basate su C++; Java consente spesso di utilizzare piattaforme multiple. Per controllare che gli esempi forniti in questa tesi fossero conformi alle specifiche XML, ho utilizzato il processore fornito dalla Microsoft, lelaboratore Msxml. Microsoft Internet Explorer dotato di un elaboratore di XML incorporato. Questo elaboratore, Msxml, progettato come componente di Windows e pu essere utilizzato come controllo Active X nelle pagine Web o nelle applicazioni di Visual Basic o C++. Microsoft ha inoltre contribuito allo sviluppo di un elaboratore di XML su Java.

http://www.html.it/xml/guida/processore.htm (1 di 2) [19/06/2001 14.16.15]

XML: Appendice A: Strumenti software - Il processore XML

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/processore.htm (2 di 2) [19/06/2001 14.16.15]

XML: Appendice A: Strumenti software - Il parser XML

Il parser Msxml
Il processore fornito dalla Microsoft pu essere scaricato allindirizzo http://www.microsoft.com/xml/parser/xmlinst.exe. Questo pacchetto contiene oltre al processore anche unutile serie di esempi su come utilizzare documenti XML nelle pagine Web. Il processore di tipo validating, ed scritto in Java; pu essere utilizzato al prompt del DOS o con un applet Java fornito nel pacchetto della Microsoft. Al prompt del DOS basta semplicemente digitare: C:\> jview msxml -d [nome del documento] Il processore notifica eventuali errori rilevati durante lanalisi. Se ad esempio la prima riga del documento la seguente: <?xml version="1.0"> il processore notifica: C:\> jview msxml -d [nome del documento] Expected ?> instead of tag end(>) Location: file:/C:// [nome del documento](2,-1) Context: <xml> Se invece il file non presenta errori il processore fornisce sullo standard output lo stesso file nel formato originale XML, mettendo in evidenza la struttura dati ivi contenuta utilizzando opportune indentazioni. Il Java applet XMLViewer fornito dalla stessa Microsoft pu essere utilizzato assieme al processore per visualizzare la struttura dati di un file, come mostra la Fig. A.1.

Fig. A.1: Il Java applet XML Viewer visualizza la struttura dati di un file XML.

http://www.html.it/xml/guida/parser.htm (1 di 2) [19/06/2001 14.16.22]

XML: Appendice A: Strumenti software - Il parser XML

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/parser.htm (2 di 2) [19/06/2001 14.16.22]

XML: Appendice A: Strumenti software - Panorama del software

Panorama del software


Per quanto riguarda i browser lunica soluzione fino a pochi mesi fa consisteva nell'utilizzo di appositi browser SGML, magari integrati nei tradizionali programmi di navigazione. Attualmente sul mercato esistono sostanzialmente dei Software: Panorama, prodotto dalla SoftQuad, una delle aziende leader nel settore SGML, Multidoc PRO, della finlandese Citec e Jumbo, una applicazione Java usata per Chemical Markup Language (CML), un'applicazione specifica di XML. Panorama disponibile in due versioni, una commerciale e l'altra gratuita. La versione commerciale, a sua volta, consiste di due moduli: Panorama Publisher, un browser stand-alone dotato di strumenti per la creazione di fogli di stile e reti ipertestuali tra pi documenti; Panorama Viewer, un plug-in per Netscape ed Explorer che pu solo visualizzare i documenti (di quest'ultimo viene distribuita una versione di prova, con alcune limitazioni funzionali, sul sito della SoftQuad). La versione gratuita invece basata sulla release 1 del browser ed reperibile dal sito Web della OCLC al proprio indirizzo. Multidoc Pro, disponibile solo in versione commerciale, ma chi interessato pu scaricarne una versione funzionante per tre settimane presso il sito della Citec. Jumbo disponibile in versione freeware presso il sito della "Venus". La Microsoft ha finalmente rilasciato la versione 5 del suo browser che, oltre a contenere un processore XML di tipo validating e supportare pienamente la specifica XML 1.0 i Namespace e gli schemi (XML-Data), in grado di visualizzare le pagine XML come se fossero pagine HTML grazie al supporto dellXSL. Per quanto riguarda i parser il panorama molto pi variegato. A parte i software che permettono anche la visualizzazione, di cui si parlato, che ovviamente prima eseguono il controllo formale, esistono in versione freeware molti parser, tra i quali vanno ricordati Sax della "Microstar Software Ltd.", XML for Java da IBM AlphaWorks, TclXML. Infine i tool di sviluppo. Recentemente Microsoft ha rilasciato la prima release di un tool per la costruzione di file XML; si chiama "XML Notepad" ed disponibile freeware nel sito della societ Americana. Anche la "Arbortext", che da tempo produce software per SGML ha implementato un tool di sviluppo "XML Styler, la "Vervet Logic" commercializza un tool "XML Pro" ", ed infine anche la "Architag" ha sviluppato il "Real-Time XML Editor" che molto semplice da imparare per creare documenti XML in quanto avverte in tempo reale se si stanno commettendo errori (fig. A.2).

http://www.html.it/xml/guida/softwa.htm (1 di 2) [19/06/2001 14.16.37]

XML: Appendice A: Strumenti software - Panorama del software

Fig. A.2: Real-Time XML Editor

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/softwa.htm (2 di 2) [19/06/2001 14.16.37]

XML: Appendice A: Strumenti software - Esempio di file XML

Esempio di file XML


Ecco un esempio di file XML e XSL che potrete trovare all'indirizzo http://digilander.iol.it/oldani/HomePino. Il file XML il seguente: <?xml version="1.0" standalone="no"?> <?xml:stylesheet type="text/xsl" href="curric.xsl" ?> <!DOCTYPE radice SYSTEM "Curriculum.dtd"> <radice> <curriculum> <dati> <nome>Luca</nome> <cognome>Rossi</cognome> <sesso>Maschile</sesso> <indirizzo> <via>Via Degli Angeli 35</via> <cap>21057</cap> <city>Olgiate Olona</city> <provincia>VA</provincia> <nazione>Italia</nazione> </indirizzo> <telefono>03313434322</telefono> <posta>rossi@mail.com</posta> </dati> <studi> <maturita> <titolo>Maturita' Scientifica</titolo> <voto>48/60</voto> </maturita> <laurea> <universita>Statale di Milano</universita> <facolta>Informatica</facolta> <votol>110</votol> </laurea> </studi> <esperienze>Da 3 anni responsabile tecnico "Inforscuola"</esperienze> <lingua>Inglese</lingua> </curriculum> <curriculum> <dati> <nome>Marco</nome> <cognome>Colombo</cognome> <sesso>Maschile</sesso> <indirizzo> <via>Via De Amicis 3</via> <cap>21057</cap> <city>MILANO</city> <provincia>VA</provincia> <nazione>Italia</nazione> </indirizzo> <telefono>0231534322</telefono> <posta>colombo@hotmail.com</posta> </dati> <studi> <maturita> <titolo>Maturita' Classica</titolo> <voto>54/60</voto> </maturita> <laurea>

http://www.html.it/xml/guida/esempxml.htm (1 di 5) [19/06/2001 14.16.46]

XML: Appendice A: Strumenti software - Esempio di file XML

<universita>Statale di Milano</universita> <facolta>Filosofia</facolta> <votol>90</votol> </laurea> </studi> <esperienze>Da 2 anni collabora con l'ufficio Arte e cultura del Corriere</esperienze> <lingua>Spagnolo</lingua> </curriculum> <curriculum> <dati> <nome>Francesca</nome> <cognome>Marillo</cognome> <sesso>femminile</sesso> <indirizzo> <via>Via Piave 7</via> <cap>21057</cap> <city>Como</city> <provincia>CO</provincia> <nazione>Italia</nazione> </indirizzo> <telefono>031634340</telefono> <posta>marillo@tin.it</posta> </dati> <studi> <maturita> <titolo>Maturita' Scientifica</titolo> <voto>38/60</voto> </maturita> <laurea> <universita>Cattolica</universita> <facolta>Scienze Politiche</facolta> <votol>106</votol> </laurea> </studi> <esperienze>Nessuna</esperienze> <lingua>Tedesco</lingua> </curriculum> <curriculum> <dati> <nome>Stefano</nome> <cognome>Bassi</cognome> <sesso>maschile</sesso> <indirizzo> <via>Via Piave 7</via> <cap>21057</cap> <city>Como</city> <provincia>CO</provincia> <nazione>Italia</nazione> </indirizzo> <telefono>031908765</telefono> <posta>stefano@cio.it</posta> </dati> <studi> <maturita> <titolo>Maturita' Tecnica Industriale in meccanica</titolo> <voto>42/60</voto> </maturita> <laurea> <universita>Politecnico</universita> <facolta>Ingegneria Civile</facolta> <votol>106</votol> </laurea> </studi> <esperienze>Impiegato al comune di Como</esperienze> <lingua>Tedesco</lingua> </curriculum> <curriculum>

http://www.html.it/xml/guida/esempxml.htm (2 di 5) [19/06/2001 14.16.46]

XML: Appendice A: Strumenti software - Esempio di file XML

<dati> <nome>Paolo</nome> <cognome>Bellucci</cognome> <sesso>maschile</sesso> <indirizzo> <via>Via Piave 7</via> <cap>21057</cap> <city>Seregno</city> <provincia>MI</provincia> <nazione>Italia</nazione> </indirizzo> <telefono>0234546787</telefono> <posta>bellucci@dido.it</posta> </dati> <studi> <maturita> <titolo>Maturita' Artistica</titolo> <voto>60/60</voto> </maturita> <laurea> <universita>Politecnico</universita> <facolta>Architettura</facolta> <votol>101</votol> </laurea> </studi> <esperienze>Nessuna</esperienze> <lingua>Tedesco</lingua> </curriculum> <curriculum> <dati> <nome>Camilla</nome> <cognome>Silvestri</cognome> <sesso>femminile</sesso> <indirizzo> <via>Via Piave 7</via> <cap>21057</cap> <city>Torino</city> <provincia>TO</provincia> <nazione>Italia</nazione> </indirizzo> <telefono>03434322098</telefono> <posta>camilla@tin.it</posta> </dati> <studi> <maturita> <titolo>Maturita' Scientifica</titolo> <voto>46/60</voto> </maturita> <laurea> <universita>Cattolica</universita> <facolta>Scienze Ambientali</facolta> <votol>106</votol> </laurea> </studi> <esperienze>Lavora part-time presso uno studio veterinario</esperienze> <lingua>Inglese</lingua> </curriculum> </radice> Il DTD il seguente: <!ELEMENT radice (curriculum+)> <!ELEMENT curriculum (dati, studi, esperienze, lingua, hobbies*)> <!ELEMENT dati (nome+, cognome, sesso, indirizzo, telefono*, posta*)> <!ELEMENT nome (#PCDATA)> <!ELEMENT cognome (#PCDATA)> <!ELEMENT sesso (#PCDATA)> <!ELEMENT indirizzo (via, cap, city, provincia, nazione)> <!ELEMENT via (#PCDATA)> <!ELEMENT cap (#PCDATA)> <!ELEMENT city (#PCDATA)> <!ELEMENT provincia (#PCDATA)>

http://www.html.it/xml/guida/esempxml.htm (3 di 5) [19/06/2001 14.16.46]

XML: Appendice A: Strumenti software - Esempio di file XML

<!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT

nazione (#PCDATA)> telefono (#PCDATA)> posta (#PCDATA)> studi (maturita*, laurea*)> maturita (titolo, voto)> laurea (universita, facolta, votol)> titolo (#PCDATA)> voto (#PCDATA)> universita (#PCDATA)> facolta (#PCDATA)> votol (#PCDATA)> esperienze (#PCDATA)> lingua (#PCDATA)>

Il file XSL che permette la visualizzazione con MSIE 5 il seguente: <?xml version="1.0"?> <HTML xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <BODY STYLE="font-family:Arial, helvetica, sans-serif; font-size:22pt"> <xsl:for-each select="radice/curriculum"> <DIV STYLE="background-color:teal; color:white; margin-bottom:0.5em"> <xsl:value-of select="dati/nome"/> <xsl:value-of select="dati/cognome"/> </DIV> <DIV STYLE="margin-left:20px; margin-bottom:1em; font-size:18pt;font-style:italic"> Indirizzo: <xsl:value-of select="dati/indirizzo/via"/> <DIV STYLE="margin-left:100px;font-style:italic;font-size:18pt"> <xsl:value-of select="dati/indirizzo/cap"/> <SPAN> <xsl:value-of select="dati/indirizzo/city"/> </SPAN> <SPAN> <xsl:value-of select="dati/indirizzo/provincia"/> </SPAN> </DIV> <DIV> Telefono:<xsl:value-of select="dati/telefono"/> </DIV> E-mail :<xsl:value-of select="dati/posta"/> </DIV> <DIV STYLE=" font-size:24;font-style:verdana; color:black;background-color:#EEEEEE"> Studi</DIV> <xsl:for-each select="studi/maturita"> <DIV STYLE="font-style:arial; color:black;font-size:18pt; margin-top:1em;margin-left:20px"> Media Superiore: <SPAN STYLE="color:teal"> <xsl:value-of select="titolo"/> </SPAN> - Voto : <SPAN STYLE="color:teal"&g; <xsl:value-of select="voto"/> </SPAN> </DIV> </xsl:for-each> <xsl:for-each select="studi/laurea"> <DIV STYLE="font-style:arial; color:black; font-size:18pt; margin-left:20px"> Universita': <SPAN STYLE="color:teal"> <xsl:value-of select="universita"/> </SPAN> - Corso di Laurea: <SPAN STYLE="color:teal"> <xsl:value-of select="facolta"/> </SPAN> - Voto : <SPAN STYLE="color:teal"> <xsl:value-of select="votol"/> </SPAN> </DIV> </xsl:for-each> <DIV STYLE="background-color:#EEEEEE; color:black; margin-top:1em; font-size:24"> Esperienze Lavorative </DIV> <DIV STYLE="font-style:italic; color:teal;font-size:18pt; margin-top:0.5em; margin-left:20px"> <xsl:value-of select="esperienze"/> </DIV>

http://www.html.it/xml/guida/esempxml.htm (4 di 5) [19/06/2001 14.16.46]

XML: Appendice A: Strumenti software - Esempio di file XML

<DIV STYLE="background-color:#EEEEEE; color:black; margin-top:0.5em; font-size:24"> Lingua Straniera </DIV> <DIV STYLE="font-style:italic; color:teal;font-size:18pt; margin-top:0.5em; margin-bottom:2em; margin-left:20px"> <xsl:value-of select="lingua"/> </DIV> </xsl:for-each> </BODY> </HTML> Il risultato questo :

clicca qui per vedere l'esempio curriculum.xml (solo MSIE 5.0 o superiore)

Lezione

successiva

[Sommario]

http://www.html.it/xml/guida/esempxml.htm (5 di 5) [19/06/2001 14.16.46]

XML: Bibliografia

Bibliografia
Extensible Markup Language (XML) 1.0, W3C Recommendation 10 February 1998, http://www.w3.org/TR/1998/REC-xml-19980210.
q

Interessante corso sull'XML sviluppato da tre studenti milanesi http://digilander.iol.it/oldani/HomePino. Extensible Stylesheet Language (XSL) Specification, W3C Working Draft, http://www.w3.org/TR/1999/WD-xsl-19990421. XML Namespace, W3C Working Draft, http://www.w3.org/TR/1998/WD-xml-names-19990114. Synchronized Multimedia Integration Language (SMIL) 1.0 Specification, W3C Recommendation, http://www.w3.org/TR/1998/REC-smil-19980615. XML in Action, William J.Pardi - Microsoft. XML Le Basi, Simon St.Laurent - Tecniche Nuove. Un sito interamente dedicato ad XML, http://www.xml.com. Luniversit di XML, http://www.xmlu.com. Il sito della Microsoft su XML, http://msdn.microsoft.com/xml/index.asp. Prime informazioni, approfondimenti, domande, http://xml.org, http://www.xmlinfo.com. Software XML, http://www.xmlsoftware.com. Il consorzio W3C, http://www.w3c.org. Un enorme elenco di link a risorse relative a XML, http://www.cs.caltech.edu/~adam/local/xml.html. Il sito di un noto esperto, Robin Cover, http://www.sil.org/sgml/xml.html. Le FAQ (Frequented Ask Question) dei membri dellXML W3C, http://www.ucc.ie.xml/.

q q q q q q

q q q

q q

[Sommario]

http://www.html.it/xml/guida/biblio.htm [19/06/2001 14.16.51]

HTML.it - Tutorial XML-DOM

di Enrico Modanese emodanese@html.it

Con XML possibile avere un'unica piattaforma di sviluppo per scambiarsi ed elaborare i dati provenienti da varie fonti. Il Tutorial di Enrico Modanese per HTML.it vi condurr all'elaborazione e alla scrittura di strumenti che utilizzano Javascript, XML e la standard DOM per accedere ai documenti XML e manipolarli.

Percorso consigliato: esperti Livello di difficolt: Introduzione 1. Cosa potete trovare in questo tutorial
Programmare con xml dentro e fuori il web: una rapida rassegna di ci che troverete in questo tutorial

Come manipolare dati xml tramite l'interfaccia dom 2. Cosa vuol dire usare XML in una applicazione?
Introduzione al tutorial e prime indicazione sull'uso del linguaggio XML

3. Cosa vuol dire leggere e scrivere dati da un file XML?


Le principali caratteristiche di manipolazione di file XML attraverso semplici esempi

4. DOM: l'interfaccia standard per usare XML


Descrizione dell'interfaccia Document Object Model che permette di accedere ai documenti XML

5. Struttura ad oggetti dell'interfaccia DOM


L'intefaccia DOM si comporta come un linguaggio di programmazione ad oggetti

6. Modifiche agli oggetti dell'interfaccia DOM


Come manipolare o dati di un documento XML da un'interfaccia DOM

Lavorare subito (gratis) con xml: tutti gli esempi che vi servono 7. Lavorare con XML: come creare un oggetto da un file XML
Gli strumenti da utilizzare per lavorare con XML li avete gi tutti nel vostro Personal Computer

8. "Navigare" nel nuovo oggetto XML


Come poter operare sull'oggetto creato dal documento XML? Attraverso il DOM.

9. Importanti accorgimenti per lavorare senza errori


Consigli pratici su cosa dover sempre evitare scrivendo codice XML

10. Contenuto della libreria per Javascript


Riunendo alcune alcune righe di codice in una libreria di funzioni risparmiamo tempo e spazio

Utilizzare dom per creare applicazioni web object - oriented

http://www.html.it/xml/tutorial/index.html (1 di 3) [19/06/2001 14.17.03]

HTML.it - Tutorial XML-DOM

11. Introduzione: i due "trucchi" di base


Due "trucchi" per poter arricchire Javascript con delle funzioni avanzate per le quali non era stato progettato.

12. Far comunicare le pagine tramite gli input di tipo "hidden"


Il primo "trucco": il metodo degli input hidden.

13. Le strutture logiche di una pagina multi - oggetto


Una pagina multi - oggetto composta da un albero gerarchico di videate

14. Dichiarazione e passaggio di stringhe


Come poter evitare di incorrere in comuni errori di compilazione. Due esempi di gestione del codice.

15. XML come base dati: creare e scrivere file


Utilizzare gli srtumenti ActiveX di Microsoft per accedere al nostro Hard Disk: il FileSystemObject.

Esempi di codice 16. Introduzione: quali esempi potete trovare


Gli esempi commentati di alcune applicazioni per il web ampiamente descritte nei capitoli precedenti.

17. Esempio 1: un test per i visitatori


Il primo esempio un semplice test, diviso in pi schermate, da sottoporre ai vostri visitatori.

18. Esempio 2 e 3: il carrello accompagna il cliente


Il secondo esempio rappresentato dalla nota metafora del carrello, usata soprattutto nei siti di commercio elettronico.

19. Esempio 2: il carrello nel frame "invisibile"


Un evoluzione dell'esempio precedente, il carrello questa volta viene "nascosto" in un frame invisibile.

20. Esempio 3: il carrello registrato come file fisico locale


Il contenuto del carrello viene scritto sull'Hard Disk del visitatore che lo avr disponibile accedendo nuovamente al sito.

21. Esempio 4: panoramica del sito senza un solo "click"


Un utilissimo esempio delle potenzialit dell'XML: in questo modo potrete creare una mappa del vostro sito navigabile senza clik.

22. Esempio 5: morte al "file not found"


Impariamo a rendere pi user friendly le nostre pagine: manteniamo una pagina sempre aggiornata

Creare eseguibili formati da oggetti web 23. Introduzione: i vantaggi di programmare per il browser
Iniziamo a conoscere i vantaggi di una programmazione di scripting orientata al browser. I vantaggi di programmare per i browser

24. Struttura complessiva di eseguibile ad oggetti per il browser


Iniziamo a conoscere la struttura di un software object-oriented da far girare sul nostro browser

25. La chiamata di un oggetto


Vediamo cosa accade nella esecuzione di una funzione del nostro piccolo software: verifichiamo la funzione di apertura di un file

26. Esempio 6: un SW in 15 KB
Un piccolo software leggibile direttamente dal browser e dal peso di soli 15 Kbyte: usiamo le librerie grafiche del browser

27. Bibliografia
La bibliografia per saperne di pi e appronfondire gli argomenti di questo tutorial

http://www.html.it/xml/tutorial/index.html (2 di 3) [19/06/2001 14.17.03]

HTML.it - Tutorial XML-DOM

Appendice: standard e strumenti per xml 28. Caratteri speciali ed escape dell'XML 1.0
Un breve elenco dei caratteri speciali supportati da XML

29. Specifica completa del modello DOM


utile conoscere e imparare le specifiche ufficiali di un linguaggio: in questo paragrafo vengono descritti i principali standard per il modello DOM

30. Parserizzatori
Un parserizzatore ci permette di verificare la correttezza del nostro codice e di eseguirlo. Microsoft Internet Explorer.

31. Interfaccia FSO (FileSystenObject) per creare e salvare file


Analisi del FileSystemObject, lo strumento che ci permette di accedere all'Hard Disk del nostro computer

http://www.html.it/xml/tutorial/index.html (3 di 3) [19/06/2001 14.17.03]

XML: Cosa potete trovare in questo tutorial

Cosa potete trovare in questo tutorial

ormai comune sentire parlare di XML (eXtensible Mark-up Language) e soprattutto sentirne parlare bene, con grandi aspettative. Pi difficile invece osservare realmente XML all'opera, perch: q su Internet solo alcuni siti specializzati usano oggi XML;
q

nelle applicazioni pochi produttori fanno uso effettivo di XML e quei pochi lo limitano ad un livello molto basso, di solito invisibile all'utente.

Ma veramente possibile usare XML anche nella programmazione? E nella programmazione per il web? Ebbene, questo tutorial stato scritto proprio per chi ha una mezza idea di cosa sia XML e vorrebbe cominciare ad usarlo realmente, senza eccessivi impegni di tempo o denaro. Se siete interessati vi anticipiamo che: q nel 90% dei casi avrete gi tutto il sofware che vi serve: Windows ed Internet Explorer 5, niente altro! gli esempi sono realizzati tutti in Javascript, un linguaggio di scripting diffuso e facile da imparare. CAPITOLO 1 Qui troverete tutte le basi per riuscire ad utilizzare XML nel codice dei vostri programmi e script, in particolare il potente strumento denominato DOM (Document Object Model).
q

CAPITOLO 2 Qui tutte le regole del capitolo 1 vengono applicate, in esempi realizzati in Javascript. Con questi esempi potrete cominciare immediatamente a maneggiare XML. Studiato per rendervi subito operativi, questo capitolo pu essere letto anche senza passare per il capitolo 1. CAPITOLO 3 Qui vengono finalmente descritte alcune applicazioni molto interessanti della coppia XML + DOM per risolvere problemi comuni fra i programmatori web. In questo capitolo trovate soprattutto le tecniche di base. CAPITOLO 4 Qui trovate la descrizione degli esempi allegati al tutorial e dedicati al web. Per comprendere le tecniche consigliabile leggere prima il capitolo 3, ma le descrizioni del funzionamento sono sufficienti per provare subito gli esempi. CAPITOLO 5 Qui trovate la descrizione dell'esempio di programmazione su browser, che spiega come XML + DOM vi permettano di creare menu a discesa e comandi anche molto complessi con un semplice file html. Il tutto per sfruttare le librerie grafiche del browser. BIBLIOGRAFIA APPENDICE: STANDARD E STRUMENTI PER XML Non solo per i pi esperti, ma anche per chi desidera semplicemente saperne di pi, questa parte fornisce una descrizione completa degli standard usati, indicazioni di strumenti SW, bibliografia web e cartacea. Se comincerete a "masticare" l'XML, finirete di sicuro spesso in questa sezione. LIBRERIA JAVASCRIPT Per farvi risparmiare tempo, abbiamo preparato delle funzioni preconfezionate per le operazioni pi comuni. I nomi sono esplicativi (cerca, copia, incolla...) e gli esempi ne

http://www.html.it/xml/tutorial/xml_00.htm (1 di 2) [19/06/2001 14.17.13]

XML: Cosa potete trovare in questo tutorial

fanno largo uso. Potete agganciare queste funzioni direttamente ai vostri script salvandole in un file con estensione .js. ELENCO DEGLI ESEMPI: 1 - Un test per i visitatori 2 - Il carrello nel frame "invisibile" 3 - Il carrello registrato come file fisico locale 4 - Panoramica del sito senza un solo click 5 - Morte al "file not found" 6 - Un software in 15 KB Se non avete mai letto niente a riguardo di XML vi consigliamo di cominciare con una guida di base. Se invece siete dei programmatori esperti potrete fare tesoro degli esempi che seguiranno, perch la loro struttura di base pu essere trasportata dal linguaggio di scripting verso qualsiasi altro linguaggio orientato agli oggetti. Se infine siete degli appassionati di Internet e volete imparare cosa si pu ottenere con uno strumento potente come XML, allora cominciate a leggere il prossimo paragrafo.

Attenzione! In questo tutorial non compaiono per nulla XSL e DTD: abbiamo scelto di non utilizzarli per mostrare come il solo XML "nudo e crudo" sia gi un campo di sperimentazione potente e divertente. Ci non esclude la possibilit di ulteriori futuri interessamenti.

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_00.htm (2 di 2) [19/06/2001 14.17.13]

XML: DOM: l'interfaccia standard per usare XML

DOM: l'interfaccia standard per usare XML

Ritornando al paragone fra XML ed il filesystema del nostro PC, sappiamo bene che possibile inserire un file in una cartella, ma non un file dentro un altro file. Nell'insieme delle parti componenti un filesystem le cartelle ed i file appartengono a due classi separate, caratterizzate da propriet diverse:

Alla classe generica "parte del filesystem" sono associate diverse propriet possedute da tutti i suoi appartenenti: q attributi (ad esempio il nome dell'elemento); metodi: le operazioni possibili sull'oggetto (ad esempio il copia/incolla). Le due sottoclassi "cartelle" e "file" ereditano dalla classe pi generale questi attributi e metodi per ognuno dei propri appartenenti e ne aggiungono di ulteriori, pi specifici.
q

Classi, oggetti, attributi, metodi ed eredit sono i concetti di base del modo di ragionare "object oriented" (orientato agli oggetti), utilizzato dai pi moderni linguaggi di programmazione. Se vogliamo utilizzare un file XML con tali linguaggi dobbiamo essere in grado di descriverlo in termini ad oggetti, come abbiamo appena abbozzato per il filesystem. La descrizione corretta e ufficiale stata proposta dal W3C (l'ente che cura gli standard di Internet) ed detta interfaccia DOM (Document Object Model). Perch abbiamo definito il DOM "interfaccia"? Quando il parserizzatore ha letto il nostro file XML e ci ha restituito un oggetto utilizzabile nel codice del programma, a noi non interessa quali e quante variabili siano state utilizzate per crearlo. L'unica nostra preoccupazione che l'interfaccia dell'oggetto (cio i metodi e gli attributi) con il resto del codice sia aderente alle regole DOM. Ecco quindi lo schema finale della chiamata, nel codice di un programma, di un oggetto XML parserizzato secondo le specifiche DOM:

http://www.html.it/xml/tutorial/xml_03.htm (1 di 2) [19/06/2001 14.17.19]

XML: DOM: l'interfaccia standard per usare XML

Nel paragrafo successivo vedremo nel dettaglio i componenti dell'interfaccia DOM. Il codice utilizzato universale, perch la forma di attributi e metodi di DOM dovrebbe essere valida indipendentemente dal linguaggio con cui lavorate. Gli esempi pratici in Javascript si possono trovare nel capitolo 2, ordinati per tipo di operazione.

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_03.htm (2 di 2) [19/06/2001 14.17.19]

XML: struttura ad oggetti dell'interfaccia DOM

Struttura ad oggetti dell'interfaccia DOM

In questo paragrafo viene usata la notazione standard per i linguaggi ad oggetti: nomeoggetto.metodo(parametri del metodo) nomeoggetto.attributo La notazione usata anche "case sensitive", cio sensibile alla differenza fra caratteri maiuscoli o minuscoli. Gli esempi pratici in Javascript si possono trovare nel capitolo 2, ordinati per tipo di operazione. La struttura dell'interfaccia DOM si basa su classi a pi livelli (riportiamo solo i componenti pi utili). I nomi sono quelli originali del W3C, ma la traduzione abbastanza semplice:

La classe pi importante quella di nodo (Node), che comprende qualsiasi elemento dell'albero XML: radice, ramo, foglia. Allo stesso livello della classe Node, ma senza figli, troviamo le classi NodeList e NodeNamedMap. Si tratta di oggetti temporanei che vengono generati durante la lettura dell'albero XML, per memorizzare dei gruppi di fratelli (ad esempio tutti i figli o tutti gli attributi di un elemento): li analizzeremo pi avanti. Intanto descriviamo attributi e metodi principali posseduti da tutti gli oggetti della classe Node:
q

Attributi della classe Node che danno informazioni sul nodo: - nodeName: restituisce il nome del nodo, quello indicato fra i "tag": <nome>..</nome>. Se si tratta del documento stesso il nome sar "#document", per un nodo di testo invece "#text". - nodeType: DOM assegna un valore numerico ai diversi tipi di nodo esistenti. Potrebbe servirvi per fare alcuni controlli. Per i nodi pi importanti: elemento = 1, attributo = 2, testo = 3, documento = 9. - nodeValue: restituisce il valore del nodo corrente. Serve soprattutto per i nodi di testo, per la maggiorparte degli altri dar risultato "null". Attributi della classe Node per muoversi nell'albero XML. Quando creiamo un oggetto XML possiamo usare una o pi variabili come "cursori" per memorizzare posizioni nell'albero. Ogni spostamento da una posizione nota si pu effettuare con uno degli attributi che seguono. - ownerDocument: ci permette di saltare, ovunque ci troviamo, alla radice del nostro albero.

http://www.html.it/xml/tutorial/xml_04.htm (1 di 3) [19/06/2001 14.17.24]

XML: struttura ad oggetti dell'interfaccia DOM

- parentNode: restituisce il nodo genitore dell'attuale. - childNodes: restituisce i nodi figli del nodo attuale, racchiusi in un oggetto NodeList. - firstChild, lastChild: restituiscono rispettivamente il primo e ultimo nodo figli dell'attuale. - previousSibling, nextSibling: restituiscono rispettivamente il fratello precedente e seguente del nodo attuale. Precedente e seguente fanno riferimento all'ordine con cui i nodi si trovano nel testo del file XML. - attributes: restituisce gli attributi del nodo corrente, racchiusi in un oggetto NodeNamedMap.
q

Metodi della classe Node: la maggiorparte di questi metodi serve per creare nuovi nodi dell'albero XML e sar descritta nel prossimo paragrafo. - hasChildNodes(): restituisce un valore booleano (true o false) in risposta alla domanda se il nodo ha dei nodi figli (compresi i nodi di testo).

La sottoclasse di nodi chiamata "Document" indica proprio il documento XML e contiene un unico (obbligatoriamente unico) oggetto, la radice dell'albero. Vediamo attributi e metodi:
q

Metodi della classe Document: la maggiorparte di questi metodi serve per creare nuovi nodi dell'albero XML e sar descritta nel prossimo paragrafo. - getElementsByTagName(tag): permette di cercare tutti gli elementi con un certo nome al di sotto della radice. Gli elementi vengono messi in un oggetto NodeList. Il carattere " * " funziona come jolly per individuare tutti gli elementi.

La sottoclasse di nodi "Element" la pi popolosa e contiene tutti i rami dell'albero XML, in pratica ogni elemento al di sotto della radice che sia stato dichiarato con una coppia di "tag": <elemento></elemento>.
q

Metodi della classe Element: la maggiorparte di questi metodi serve per creare nuovi nodi dell'albero XML e sar descritta nel prossimo paragrafo. - getElementsByTagName(tag): equivalente all'omonimo per Document. - getAttribute (attributo): restituisce il valore, per l'elemento attuale, dell'attributo indicato. - getAttributeNode(attributo): restituisce l'attributo specificato come nodo.

La sottoclasse di nodi "Attribute" indica gli attributi degli elementi. Gli attributi ereditano solo una parte delle propriet dei nodi, perch non possono essere innestati gli uni dentro agli altri. Non vale quindi per essi la maggiorparte dei metodi per muovere il cursore entro l'albero: nextSibling, previousSibling, firstChild etc... Per scorrere gli attributi occorre usare l'oggetto NamedNodeMap generato dal comando "attributes". Vediamo alcune propriet caratteristiche solo degli attributi:
q

Attributi della classe Attribute: - name: restituisce il nome dell'attributo. - specified: restituisce un valore booleano (true o false) che indica se all'attributo stato assegnato un valore.

La sottoclasse CharacterData la "mamma" di testi e commenti del file XML. Nell'albero parserizzato il testo diventa un nodo di nome "#text". I metodi della classe servono per modificare il testo e saranno descritti nel prossimo paragrafo. Vediamo qui invece due attributi molto importanti:
q

Attributi della classe CharacterData: - data: restituisce il testo vero e proprio contenuto nel nodo #text. - length: restituisce il numero di caratteri che formano il testo.

Veniamo ora alle due classi NodeList e NamedNodeMap. Quando l'esito di un metodo pu essere composto di pi parti, viene creato automaticamente un oggetto di una di queste due classi per contenere i risultati. Un oggetto Nodelist un vettore di elementi con un indice numerico, NamedNodeMap possiede le stesse propriet di Nodelist ed in pi permette di individuare gli elementi con dei nomi oltre che con
http://www.html.it/xml/tutorial/xml_04.htm (2 di 3) [19/06/2001 14.17.24]

XML: struttura ad oggetti dell'interfaccia DOM

l'indice. Vediamo prima attributi e metodi di NodeList:


q

Attributi della classe NodeList: - length: restituisce il numero di elementi del vettore. Metodi della classe NodeList: - item(n): restituisce l'elemento nella posizione n. L'elemento pu essere un oggetto della classe Node, con le relative propriet. L'indice progressivo delle posizioni del vettore non parte da 1, bens da 0: 0,1,2... Perci la lunghezza del vettore uguale all'ultima posizione + 1.

La classe NamedNodeMap possiede le stesse propriet di Nodelist pi la seguente:


q

Metodi della classe NamedNodeMap: - getNamedItem(nome): restituisce l'elemento che corrisponde al nome indicato.

Con queste due ultime classi dovrebbe ora risultare chiaro il funzionamento di tutti gli attributi e metodi visti. Per ora si trattato di propriet di sola lettura: nel prossimo paragrafo descriveremo come l'interfaccia DOM ci permetta anche di apportare modifiche agli oggetti dell'albero XML.

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_04.htm (3 di 3) [19/06/2001 14.17.24]

XML: modifiche agli oggetti dell'interfaccia DOM

Modifiche agli oggetti dell'interfaccia DOM

Come abbiamo in parte anticipato lo standard DOM permette anche di modificare l'albero XML. Abbiamo riservato a queste istruzioni un paragrafo separato perch per poterle usare occorre conoscere due facili ma importanti regole sul comportamento del DOM:
q

le azioni di cancellazione o copia possono essere operate direttamente sugli oggetti desiderati. l'azione di creazione di un nuovo nodo operata solo tramite metodi dell'oggetto Document. In poche parole, un nuovo nodo pu essere generato sempre e solo dalla radice dell'albero. Appena creato il nuovo nodo esiste ma non ha una posizione nell'albero. Per questo il nodo va "installato", con appositi metodi, nel nodo padre scelto.

Con queste premesse vediamo ora le istruzioni. Partiamo questa volta dalla classe Document per vedere subito come si crea un nuovo nodo.
q

Metodi della classe Document: - createElement(nome): crea un elemento col nome dato. - createAttribute(nome): crea un attributo col nome dato. - createTextNode(stringa): crea un nodo di testo contenente la stringa data. Metodi della classe Node: gli oggetti maneggiati da questi metodi possono essere nuovi nodi appena creati e non ancora posizionati oppure nodi gi presenti. Se le operazioni hanno esito positivo, i metodi restituiscono l'oggetto appena movimentato: - appendChild(nodo): aggiunge un nodo ai figli; se il nodo era gi presente in un'altra posizione viene prima rimosso. - removeChild(nome nodo): elimina un nodo figlio, restituisce il nome del nodo rimosso. - replaceChild(nome nodo 1, nodo 2): sostituisce il figlio nodo 1 con il nodo 2. Se il nodo era gi presente in un'altra posizione viene prima rimosso. - insertBefore(nodo 1, nome nodo 2): inserisce il nodo 1 prima del figlio nodo 2. Se il 2 non indicato l'operazione identica a .appenChild. Se il nodo era gi presente in un'altra posizione viene prima rimosso. - cloneNode(true/false): copia il nodo e tutto il sottoalbero (true), oppure il nodo solo con gli attributi (false), ma non il testo (che un nodo figlio).

Restituisce il nodo senza posizione, come se fosse stato creato.


q

Metodi della classe Element: riguardano tutti gli attributi. Ricordiamo che anche se gli attributi non vengono trattati ufficialmente come figli, sono comunque dei nodi sottostanti al loro elemento. Perci va considerata la differenza fra "nodo" attributo e valore dell'attributo stesso. - setAttribute(nome): imposta il valore dell'attributo indicato, che deve essere gi esistente. - removeAttribute(nome): resetta il valore dell'attributo. - setAttributeNode(nodo attributo): aggiunge un attributo a quelli del nodo. Se viene rimpiazzato un attributo esistente il metodo restituisce tale attributo, altrimenti il valore null. - removeAttributeNode: rimuove l'attributo ed il suo contenuto. Metodi della classe CharacterData: - appenData(stringa): aggiunge la stringa data a quella nel nodo testo. Non restituisce alcun valore. - insertData(stringa, posizione): inserisce la stringa data della posizione

http://www.html.it/xml/tutorial/xml_05.htm (1 di 2) [19/06/2001 14.17.28]

XML: modifiche agli oggetti dell'interfaccia DOM

indicata. Il contatore delle posizioni inizia da 0 e non da 1. - deleteData(posizione, lunghezza): elimina un certo numero di caratteri dopo la posizione indicata. - replaceData(posizione, lunghezza, stringa): sostituisce il segmento indicato da posizione e lunghezza con la stringa data.
q

Metodi della classe NodeNamedMap: - setNamedItem(nome): aggiunge al vettore un nodo col nome dato. - removeNamedItem(nome): elimina dal vettore il nodo dato.

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_05.htm (2 di 2) [19/06/2001 14.17.28]

XML: lavorare in pratica con XML: come creare un oggetto da un file XML

Lavorare in pratica con XML: come creare un file XML

oggetto da un

Questo paragrafo risponde alla domanda: come si crea una variabile a partire da un file XML, per poi poterla utilizzare nel codice di un programma? Se avete installato sul vostro computer MS Windows e MS Internet Explorer 5 allora avete gi tutto quello che vi serve per cominciare. Microsoft ha inserito nel suo browser un "parserizzatore" (lo strumento che "legge" gli alberi di informazioni XML) sotto forma di controllo ActiveX (un componente di Windows). Facciamo subito un esempio pratico. Di seguito trovate una pagina html con uno script Javascript che carica e visualizza un piccolo file XML: Javascript - XML

Se copiate il testo in un file html e lo aprite con Internet Explorer 5 vi apparir una finestra di messaggio con il titolo di questo tutorial ed il suo editore. Questi due nomi si trovano gi nella pagina, in un mini-file XML assegnato alla variabile "testo_XML". Noi li abbiamo caricati come due elementi indipendenti e li abbiamo scritti a video. Come abbiamo fatto? Il caricamento avviene in tre passi.
q

Chiamare l'ActiveX "MSXML"

var file_XML = new ActiveXObject("Microsoft.XMLDOM"); file_XML.async = false


Con questa istruzione diciamo ad Internet Explorer di richiamare l'AcvtiveX di nome MSXML, che un parserizzatore. MSXML prepara un oggetto (con l'interfaccia DOM che abbiamo descritto nei paragrafi precedenti della guida) utilizzabile dallo script. L'oggetto ancora vuoto, ma ha un nome (file_XML) e possiede gi una serie di propriet che vedremo nei prossimi paragrafi.
q

Caricare il file XML

file_XML.loadXML(testo_XML)
Con questa istruzione abbiamo assegnato all'oggetto file_XML un contenuto: una radice, un ramo "titolo" ed un ramo "editore". Il contenuto stato prelevato da una semplice variabile di testo, ma ora il parserizzatore ha creato una struttura dati ben pi complessa e soprattutto, come vedremo, perfettamente manipolabile.
q

Posizionarsi alla "radice" dell'albero XML per leggerlo.

http://www.html.it/xml/tutorial/xml_06.htm (1 di 2) [19/06/2001 14.17.36]

XML: lavorare in pratica con XML: come creare un oggetto da un file XML

var root = file_XML.documentElement;

Questa istruzione ci serve per posizionarci alla base dell'albero che abbiamo creato (la radice o "root"). Infatti dobbiamo indicare al programma come "entrare" nella struttura che abbiamo creato e riempito, per cominciare a leggere e scrivere. Riassumiamo in una figura i tre momenti del caricamento del file XML.

Nel nostro esempio abbiamo messo il nostro file XML in una variabile di testo dentro lo script. Normalmente invece il file esterno e deve essere richiamato. In questo caso il cambiamento richiesto minimo: per prima cosa dobbiamo cambiare di poco l'istruzione 2:

file_XML.load ("Mio_file.xml")

poi dobbiamo indicare nome e posizione del file da caricare. Create un file con Notepad o Wordpad di Windows, copiate nel file la stringa XML dell'esempio iniziale, chiamate il file Mio_file.xml (non dimenticate l'estensione .xml!) e salvatelo come file di testo nella stessa cartella dove avete creato il file html iniziale. Se ricaricate il file html non vedrete nessun cambiamento apparente, ma i dati che leggete nell'avviso non provengono pi dallo script, bens dal file XML esterno. Per verificare provate a modificare Mio_file.xml mettendo al posto del titolo un'altra parola (senza cambiare la posizione dei tag!) e ricaricate di nuovo. Quello che avete appena fatto banale ma molto potente: avete appena caricato in una pagina web dei dati esterni senza utilizzare fonti ODBC o altri rompicapi simili, bens tramite un semplice, piccolo testo (XML per!). Per riassumere il contenuto di questo paragrafo: q con l'uso dell'ActiveX MSXML si carica un file XML in tre mosse;
q

le sorgenti XML possono essere di due tipi: un file con estensione .xml oppure una stringa di testo; basta inserire una piccola modifica nella seconda istruzione; per utilizzare l'oggetto occorre posizionarsi alla sua radice.

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_06.htm (2 di 2) [19/06/2001 14.17.36]

XML: "Navigare" nel nuovo oggetto XML

"Navigare" nel nuovo oggetto XML

Come si utilizza l'oggetto che abbiamo creato da un file XML? Nel capitolo 1 potete trovare la risposta teorica completa a questa domanda: il nuovo oggetto possiede un'interfaccia standard denominata DOM (Document Object Model). Qui invece vi proponiamo uno schema molto semplice che vi permette di cominciare subito a lavorare con codice Javascript (e non solo). Lo schema semplice perch le tecniche di trattamento dell'XML vi consentono di vedere il vostro file (sia che sia in formato testo originale, sia che sia stato caricato in una variabile) sempre e solo come un "albero". Potete perci fare sempre riferimento al concetto di "nodo" dell'albero:

Consideriamo di aver inserito il nodo della figura dentro alla variabile chiamata nodo_attuale e vediamo come si eseguono tutte le operazioni pi importanti indicate in figura:
q

Leggere la "carta d'identit" del nodo: nome e tipo del nodo (per il significato del tipo vedi il capitolo 1)

http://www.html.it/xml/tutorial/xml_07.htm (1 di 4) [19/06/2001 14.17.42]

XML: "Navigare" nel nuovo oggetto XML

var nome = nodo_attuale.nodeName /* restituisce il nome posseduto dal nodo dentro il file XML, cio fra i tag: <nome></nome> */ var tipo = nodo_attuale.nodeType /* restituisce un valore da 1 a 12 che identifica il tipo del nodo */
q

Risalire al padre: il padre unico e l'istruzione veramente semplice

var padre = nodo_attuale.parentNode


Volendo si pu anche risalire da qualsiasi punto alla radice dell'albero, cio all'oggetto documento, per leggere magari il nome e la posizione del file XML originale:

var documento = nodo_attuale.ownerDocument; var file_originale = documento.url


q

Cercare i figli. Purtroppo i figli possono essere numerosi: o ne scegliamo uno in particolare, oppure li riuniamo tutti in un vettore: - scegliere un solo figlio: possiamo prendere il primo o l'ultimo

var figlio = nodo_attuale.firstChild var figlio = nodo_attuale.lastChild


- scegliere pi figli insieme:

var vettore_figli = nodo_attuale.childNodes

http://www.html.it/xml/tutorial/xml_07.htm (2 di 4) [19/06/2001 14.17.42]

XML: "Navigare" nel nuovo oggetto XML

Questa istruzione crea un vettore (con indice numerico che parte da 0) contenente tutti i figli. Il ciclo for riportato di seguito legge il vettore e dovrebbe essere abbastanza chiaro:

for (var contatore = 0; contatore < vettore_figli.length; contatore++) { alert (vettore_figli.item(contatore)) }


Riassumendo: le due istruzioni per il vettore dei figli sono .length per conoscere la lunghezza e .item(i) per conoscere la posizione i-esima. - cercare nel sottoalbero: la seguente istruzione permette addirittura di cercare in tutto il sottoalbero del nodo gli elementi con un certo nome, per metterli in un vettore

var vettore_sottoalbero = nodo_attuale.getElementsByTagName(nome nodo)


q Cercare i fratelli: con le seguenti istruzioni si possono cercare il fratello che precede e quello che segue il nodo attuale nel file XML:

var fratello = nodo_attuale.nextSibling var fratello = nodo_attuale.previousSibling


q

Leggere gli attributi: come i figli anche gli attributi possono essere numerosi:

- leggere un solo attributo:

var valore_attributo = nodo_attuale.getAttribute(nome)


- leggere tutti gli attributi

http://www.html.it/xml/tutorial/xml_07.htm (3 di 4) [19/06/2001 14.17.42]

XML: "Navigare" nel nuovo oggetto XML

var vettore_attributi = nodo_attuale.attributes


Quest'ultima istruzione genera un vettore come nel caso dei figli. Ma, poich gli attributi hanno un nome prima che un valore, le posizioni di questo vettore sono richiamabili, oltre che con un indice numerico, anche col nome dell'attributo corrispondente:

vettore_attributi.item(0) vettore_attributi.getNamedItem(nome attributo)


Entrambe le istruzioni precedenti sono valide.
q

Leggere il testo: nel codice il testo viene trasformato in un nodo figlio di tipo "text". Per leggerlo occorre ripescare il figlio adatto: se avete la cura di scrivere il testo all'inizio baster richiamare l'istruzione .firstChild, altrimenti dovrete scorrervi tutti i figli per trovarne uno di tipo testo. Vedremo come scorrere i figli nei prossimi paragrafi, intanto riassumiamo alcune istruzioni utili per i testi: - leggere il contenuto del nodo testo: esistono due possibilit:

var testo = nodo_testo.data var testo = nodo_testo.nodeValue


- leggere tutto il testo contenuto nel sottoalbero: si pu compiere questa strana ma potentissima operazione con l'istruzione:

var testo = nodo_attuale.text

Lezione successiva
[Sommario]

http://www.html.it/xml/tutorial/xml_07.htm (4 di 4) [19/06/2001 14.17.42]

XML: importanti accorgimenti per lavorare senza errori

Importanti accorgimenti per lavorare senza errori

Javascript un linguaggio gentile e riservato: se qualche istruzione manca di senso l'esecuzione cerca di procedere senza disturbarci. L'unico caso in cui il sistema si arrabbia seriamente quando il codice cerca di operare su di una variabile vuota. Questa situazione molto frequente lavorando con XML: esplorando progressivamente l'albero si arriva prima poi a rami terminali e si pu rischiare di "procedere nel vuoto". Ecco un esempio tipico di un'istruzione a serio rischio di blocco:

var figlio = nodo_attuale.firstChild; alert (figlio.nodeName)

Se nodo_attuale non ha figli la prima riga viene eseguita senza problemi, ma la variabile figlio assume valore nullo. Al passo successivo l'esecuzione si blocca perch figlio non un oggetto XML e quindi non supporta l'attributo .nodeName. Il sistema emette un segnale di errore con la spiegazione "Oggetto mancante". Come evitare questo genere di errori? In genere pi che sufficiente porsi sempre due domande mentre si scrive il codice: - in quale "mondo" esiste il mio oggetto XML? - dove termina il mio albero?
q In quale "mondo" esiste il mio oggetto XML? La risposta semplice ma molto importante: tutte le variabili di uno script rimangono dichiarate e posseggono un valore finch la pagina web che contiene lo script stesso rimane attiva nel browser. Appena effettuiamo un click per spostarci perdiamo ogni parte del nostro codice e della sua esecuzione. Se torniamo indietro ritroviamo i nostri oggetti resettati.

L'oggetto XML dichiarato tramite l'istruzione "new ActiveXObject" segue questo destino e con esso ogni variabile che abbiamo generato nella navigazione. Questa struttura a "scomparti stagni" un grosso vincolo per i creatori di script. Esiste un metodo per permettere il colloquio fra scomparti? Certamente s, se avete letto i paragrafi precedenti lo avete gi utilizzato: il file di testo XML. Una fonte esterna XML in cui leggere e scrivere permette agli script di pagine diverse di passarsi dati. Per ora siamo capaci di leggere, nei prossimi capitoli impareremo anche a scrivere. Riassumendo: l'oggetto XML ottenuto per parserizzazione ed ogni parte del suo albero "vivono" finch il nostro utilizzatore non fa click verso un'altra pagina. Tuttavia possiamo usare il file XML di testo per salvare e riutilizzare i dati.
q

Dove termina il mio albero? Esistono alcune istruzioni che ci permettono di non "avanzare nel vuoto" quando ci muoviamo verso la periferia dell'albero, cio di verificare se un nodo ha figli o attributi prima di provare a leggerli. - Verificare l'esistenza dei figli: ecco come l'esempio visto a inizio paragrafo pu essere reso sicuro da errori:

http://www.html.it/xml/tutorial/xml_08.htm (1 di 2) [19/06/2001 14.17.47]

XML: importanti accorgimenti per lavorare senza errori

if (nodo_attuale.hasChildNodes()) { var figlio = nodo_attuale.firstChild; alert (figlio.nodeName) } else alert ("Fine dell'albero")

Il metodo hasChildNodes() restituisce il valore booleano true se il nodo ha figli (compreso il nodo figlio di testo), false altrimenti. Verificare che un nodo esista prima di leggerlo: abbiamo visto che assegnare una variabile nulla, ma accorgersi del suo stato prima di operarvi, non genera errore. Questo controllo particolarmente utile quando non possiamo interrogare il padre (con l'istruzione hasChildNodes) oppure nelle condizioni di uscita dei cicli che leggono i vettori di nodi figli:

if (nodo attuale != null) { /* operazione sul nodo */ } var figlio = nodo_attuale.firstChild while (figlio != null) { /* operazione sul nodo */ figlio = figlio.nextSibling }
Per concludere questo paragrafo raccomandiamo di ricordare che ognuno hai i suoi alberi preferiti, cio che i file XML degli utilizzatori possono avere forme molto diverse, a cui un programma deve esser preparato. nella filosofia di XML l'essere un linguaggio universale: imporre degli standard come quello di fissare i nomi dei nodi o la loro posizione non rientra in questa filosofia.

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_08.htm (2 di 2) [19/06/2001 14.17.47]

XML: contenuto della libreria per Javascript

Contenuto della libreria per Javascript

I comandi previsti dallo standard DOM sono potenti, ma spesso diventano un po' ripetitivi. Quando in particolare dobbiamo trovare un elemento fra molti (i figli o gli attributi di un nodo) il ciclo di ricerca richiede diverse istruzioni facilmente riutilizzabili. Abbiamo riunito le righe di codice pi ripetitive in alcune funzioni, che vi permettono di muovervi nell'albero XML utilizzando una o due righe di codice per movimento, anche se si tratta di ricerche fra i rami figli. Le funzioni sono dichiarate in Javascript come nuovi oggetti, aventi come attributi i risultati della funzione stessa. Ecco un piccolo esempio:

var risultato_funzione = new funzione(parametro 1, .. ,parametro n); var risultato_1 = risultato_funzione.attributo_1; var risultato_2 = risultato_funzione.attributo_2;
Nelle nostre funzioni in genere i risultati saranno due:
q

funzione.Sysubrc = valore booleano (true/false) che indica che la funzione stata eseguita con successo funzione.SyBuffer = risultato della funzione.

La prima variabile vi permette di programmare usando gli accorgimenti contro gli errori descritti in uno dei paragrafi precedenti, cio assicurandovi che il risultato della funzione esista prima di utilizzarlo. Ecco un esempio di chiamata di funzione sicuro da errori:

http://www.html.it/xml/tutorial/xml_09.htm (1 di 3) [19/06/2001 14.17.51]

XML: contenuto della libreria per Javascript

var risultato_funzione = new funzione(parametro 1, .. ,parametro n); if (risultato_funzione.sySubrc) { /* operazioni su risultato_funzione.syBuffer */ }


La libreria di funzioni gi pronta per essere utilizzata: potete leggerla come esempio oppure copiarla e salvarla in un file testuale con estensione .js. Ripetiamo brevemente la chiamata di script esterni un file html:

<head> <script language="Javascript" src="nome_file.js"> </script> </head>


(la posizione in head non obbligatoria, ma permette al vostro script di valere per tutti gli eventi generati nella pagina) Di seguito riportiamo un elenco delle funzioni nella libreria ed una breve descrizione per ognuna di esse:
q

loadXMLFile(filePath) dato il percorso del file XML lo parserizza; syBuffer restituisce l'elemento documento, sySubrc assicura sia che il percorso non sia nullo sia che il file non esista, non sia vuoto o contenente XML non ben formattato. loadXMLString(string) data una stringa XML la parserizza; syBuffer restituisce l'elemento documento, sySubrc assicura sia che la stringa non sia nulla sia che contenga XML ben formattato e che la parserizzazione abbia buon esito. findChilds (currentNode, childName) dato il nodo currentNode ne ricerca il figlio di nome childName; syBuffer restituisce un vettore contenente tutti i figli col nome richiesto, sySubrc assicura che il vettore non si vuoto o che gli input non siano nulli. findAttribute (currentNode, attributeName) dato il nodo currentNode ne ricerca l'attributo di nome attributeName; syBuffer restituisce il valore dell'attributo, sySubrc assicura che l'attributo esista, che non sia vuoto o che gli input non siano nulli. findText (currentNode) dato il nodo currentNode ne restituisce il testo; syBuffer contiene la stringa, sySubrc assicura che il

http://www.html.it/xml/tutorial/xml_09.htm (2 di 3) [19/06/2001 14.17.51]

XML: contenuto della libreria per Javascript

testo esista o che gli input non siano nulli.

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_09.htm (3 di 3) [19/06/2001 14.17.51]

XML: introduzione: i due "trucchi" di base

Introduzione: i due "trucchi" di base

Javascript, che abbiamo fin qui usato per manipolare XML, stato studiato per essere diffuso in Internet e possiede, accanto ad una grande facilit d'uso, anche qualche aspetto un po' ostico. Per motivi di sicurezza (il web non un posto tanto tranquillo):
q

due pagine web non scambiano solitamente dati tra di esse, ma solo attraverso il DB del server che le ha generate; lo script ha un accesso limitato al filesystem del nostro PC, permettendoci di operare ben pochi salvataggi. Esistono alcune eccezioni alle precedenti regole. Ne citiamo due:

tramite le propriet "parent" e "opener" la pagina corrente pu leggere e modificare un'altra pagina aperta. In particolare gli input di tipo "hidden" possono funzionare come dei canali di scambio dei dati senza modificare la parte visibile; tramite l'interfaccia Microsoft "FileSystemObject", basata su di un ActiveX abbastanza diffuso, gli script possono accedere al filesystem del client per tutte le operazioni di lettura e modifica. I due "trucchi" citati hanno una limitazione teorica: possono trasmettere dati solamente in formato testo:

gli input hidden possono contenere stringhe, ma non variabili complesse come gli array; l'interfaccia FileSystemObject pu generare e leggere solamente file con estensione .txt. Anche questa una scelta di sicurezza: il formato testo visto solitamente come "innocuo" e poco potente. Ebbene: cosa XML se non testo? Utilizzando XML possiamo trasmettere dati strutturati ovunque sia previsto lo scambio di stringhe di caratteri. Nei seguenti paragrafi utilizzeremo la coppia XML + DOM ed i due trucchi precedenti per superare alcuni dei limiti dei linguaggi di scripting, permettendo alle pagine Javascript di funzionare come dei veri e propri oggetti di programmazione, dotati di un nucleo eseguibile e di un interfaccia di input- output completa. Nel capitolo 4 queste tecniche ed altre ancora verranno applicate in esempi che tentano di risolvere alcuni dei pi diffusi problemi di programmatori web e non solo.

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_10.htm [19/06/2001 14.17.54]

XML: far comunicare le pagine tramite gli input di tipo "hidden"

Far comunicare le pagine tramite gli input di tipo

"hidden"

Come promesso, vediamo i passaggi del trucco basato sugli input di tipo "hidden" (consideriamo noti la sintassi e l'uso delle propriet "opener" e "parent"). Metodo degli input hidden, variante "parent" (pagine con frame). Questa variante si basa sulla possibilit, nelle pagine con pi frame, di navigare in una sezione, mentre in un secondo settore la pagina rimane fissa e pu registrare dati provenienti dai nostri spostamenti. di solito utile che i dati registrati non siano mostrati direttamente all'utente: se il frame statico visibile sufficiente utilizzare campi di tipo hidden, ma il metodo migliore si basa sull'utilizzo di un frame "invisibile", poich dichiarato di dimensione = 0. Ecco i passi necessari:
q

si crea un pagina con un frame "invisibile":

<frameset rows="*" border="0"> <frameset cols="0,*"> <frame name="invisibile" src="..."> <frame name=""visibile" src="..."> </frameset> </frameset>
q

nella pagina corrispondente al frame invisibile si inserisce un campo di input (non indispensabile che sia hidden, perch la pagina gi nascosta):

<form name="..."> <input type="hidden" name="..." value=""> </form>

le pagine nel frame visibile possono scrivere nell'input appena creato con l'istruzione:

parent.frames[0].document.nomeform.nomeinput.value = x
Metodo degli input hidden, variante "opener" (pagine generate dinamicamente). Questa variante si basa sull'insieme formato da una pagina "padre" e dalle pagine "figlie" che essa genera dinamicamente. Salvando dei dati in campi hidden presso il padre, le figlie possono comportarsi come degli oggetti, che vengono chiamati e restituiscono un risultato. Ecco i passi necessari:
q

si crea una pagina iniziale con un modulo contenente un input "hidden":

<form name="modulo"> <inpu type="hidden" name="interface" value=""> </form>


http://www.html.it/xml/tutorial/xml_11.htm (1 di 2) [19/06/2001 14.17.57]

XML: far comunicare le pagine tramite gli input di tipo "hidden"

si inserisce nella pagina iniziale un comando di apertura di una nuova pagina:

var nuova = window.open ("", "Nuova pagina"); var nuovaPagina = nuova.document; nuovaPagina.writeln ( /* testo HMTL della pagina */ )

se nella nuova pagina si ottiene un dato che si vuole salvare, lo si pu inviare alla pagina "genitore", con il seguente comando:

window.opener.document.modulo.interface.value = /* variabile da salvare */

In entrambe le varianti, XML + DOM rappresentano il passaggio fondamentale per sfruttare il trucco. Un campo hidden accetta solo testo e quindi non pu contenere variabili complesse come array. La soluzione usare un oggetto XML: con il comando "variabile.xml" lo si trasforma in una stringa e lo si invia alla pagina "genitore":

stringaXML = variabileXML.xml; window.opener.document.modulo.interface.value = stringaXML

Nella pagina "genitore" la stringa viene riparserizzata ed il trasferimento della variabile completato, tramite un solo campo hidden e qualsiasi sia la complessit dei dati:

NuovaVarXML.loadXML (document.modulo.interface.value)
Nel capitolo 4 verranno descritti diversi esempi che utilizzano le due tecniche:
q

la variante parent sar utilizzata per registrare dati legati alla navigazione (ad esempio il carrello in un sito di e-commerce); la variante opener permetter la creazione di pagine multi - oggetto.

Data la complessit di queste tecniche, aggiungiamo due paragrafi di spiegazioni: il primo approfondisce il concetto di pagina multi - oggetto, il secondo raccoglie alcuni suggerimenti sull'uso massiccio delle stringhe XML in html e javascript.

Lezione successiva
[Sommario]

http://www.html.it/xml/tutorial/xml_11.htm (2 di 2) [19/06/2001 14.17.57]

XML: le strutture logiche che compongono una pagina multi - oggetto

Le strutture logiche che compongono una pagina multi oggetto

Una pagina multi - oggetto composta da un albero gerarchico di videate. Ogni padre comanda l'apertura delle pagine figlie tramite le chiamate window.open. Il testo delle pagine figlie pu essere contenuto nel padre o caricato dall'esterno: ovviamente lo scopo massimizzare le pagine apribili senza collegarsi al server. Per gestire un grosso numero di oggetti occorre creare una struttura innestabile, che valga cio sia per i padri che per i figli, che a loro volta potranno essere padri di altri e cos via. Quella nel disegno seguente la nostra proposta di struttura (ma non la sola possibile):

Elementi dati: sono indispensabili tre elementi:


q

Struttura di controllo: appartiene alla pagina padre, descrive la logica, l'ordine ed i contenuti nella creazione dei figli. Ad esempio, utilizzando una variabile XML:

<controllo> <figlio1 completo="true" gerarchia="1" necessario="true"> <testo src=""><html><body>ciao</body></html></testo> </figlio1> <figlio2 completo="false" gerarchia="2" necessario="false"> <testo src="www...com/figlio2" /> </figlio2> </controllo>

Nell'esempio la pagina figlio1 obbligatoria, va caricata per prima ed gi stata completata; la pagina figlio2 invece facoltativa, pu essere caricata per seconda e non ancora stata aperta. Notate come la parte obbligatoria (padre + figlio1) pu essere visualizzata tramite un solo download complessivo, mentre richiesto un secondo collegamento per figlio2 (magari una pagina di spiegazioni pi "pesante" poco richiesta).
q Strutture di input ed output: appartengono alla pagina padre ma sono condivise con gli oggetti figli. Nell'input viene trasferito ogni dato che serve per attivare l'oggetto figlio, nell'output l'oggetto deposita, durante la sua vita, i risultati necessari per il padre. L'input pu essere contenuto anche nella parte di script, mentre l'output deve necessariamente essere affidato ad un campo di tipo "hidden".

Sequenza logica: sono necessari i seguenti step, nell'ordine indicato:


q

lettura del campo di output: appena la pagina padre ritorna attiva occorre fare il punto della situazione controllando cosa avvenuta nel frattempo (se vi sono "tracce" lasciate dai figli); aggiornamento della struttura di controllo: se necessario la struttura di controllo viene modificata in base agli output registrati;

lettura della struttura di controllo: viene fatto correre l'algoritmo di gestione della pagina, che in base alla situazione decide quali nuovi eventi sono possibili o necessari; aggiornamento della struttura di input: l'algoritmo di gestione scrive le istruzioni per la prossima azione. La sequenza deve essere lanciata automaticamente ad ogni riattivazione, viene cio indicata con

http://www.html.it/xml/tutorial/xml_12.htm (1 di 2) [19/06/2001 14.18.02]

XML: le strutture logiche che compongono una pagina multi - oggetto


l'istruzione:

<body onFocus="javascript: /*function con la sequenza*/"></body>


Il tutto pu sembrare molto complesso, ma non che una copia esatta di ci che avviene nelle pagine di controllo (Servlet, CGI, ASP etc...) dei server web, solamente riportato sul client. La complessit delle pagine pu aumentare molto, ma aumentano di poco le dimensioni (solo 5 KB per ben cento righe di codice!) e soprattutto diminuiscono drasticamente i collegamenti ed il carico sul server.

[Sommario]

http://www.html.it/xml/tutorial/xml_12.htm (2 di 2) [19/06/2001 14.18.02]

XML: cosa vuol dire usare XML in una applicazione ?

Cosa vuol dire usare XML in una applicazione ?

Ogni applicazione compie in fondo tre azioni principali: leggere dei dati, elaborarli, restituirli. Se vogliamo che la nostra applicazione sia esportabile, ad esempio tramite Internet, dobbiamo assicurarci che ognuna delle tre azioni principali sia eseguibile su macchine di molti tipi diversi. Per la parte di elaborazione molto gi stato fatto ai fini dell'esportabilit: Java e script in diversi linguaggi permettono di eseguire un'applicazione su qualsiasi sistema dotato rispettivamente di una Java Virtual Machine (JVM) e di un browser recente. Meno evoluto invece il livello di esportabilit dei dati. Di solito la lettura e la scrittura avvengono da e verso un data-base (DB), che registra i dati in un formato proprietario, in genere binario. Una applicazione esportabile dovrebbe quindi in teoria essere prodotta in tante versioni, una per ognuno dei DB pi diffusi. In genere invece le soluzioni adottate sono di due tipi: q se l'applicazione destinata ad essere eseguita su di un determinato tipo di macchina, il formato di input e di output sar fisso e toccher all'utente fornirsi o del tipo di DB consigliato dal produttore o di un traduttore di dati, spesso a spese proprie;
q

se invece l'applicazione destinata a correre su Internet, la parte eseguita sul server utilizzer il proprio DB, mentre la parte eseguita sul browser o sulla JVM del client dovr fornire e ricevere dati on-line, in un lungo e dispersivo colloquio composto di tanti passaggi del tipo: modulo inviato - elaborazione pagina html di risposta. Questa serie di scambi pu essere frustrante, come tutti possiamo sperimentare quando ci connettiamo ad un sito congestionato.

Come aumentare l'esportabilit delle azioni di lettura/scrittura dati? Sarebbe ideale che ogni applicazione parlasse una sorta di "esperanto dei DB", cio un linguaggio unico e semplice da tradurre da e verso altri formati proprietari. XML si candida seriamente ad essere questo esperanto e lo sta progressivamente diventando, grazie a degli indubbi punti di forza: q XML si basa su testo ASCII, un formato diffuso da moltissimi anni in modo praticamente ubiquitario;
q

XML compattissimo, perch si limita ad essere un contenitore di dati, senza le aggiunte legate all'elaborazione tipiche dei formati dei DB proprietari; XML comunque leggibile e comprensibile direttamente dall'uomo; scrivere un piccolo DB XML a mano un lavoro abbastanza facile.

Nei paragrafi che seguono descriveremo come utilizzare tutte le tecniche descritte per creare applicazioni pienamente esportabili. Riassumendo:
q q

la parte eseguibile sar in Javascript; i dati letti e scritti saranno in formato XML.

Il pacchetto formato da Javascript + XML pu viaggiare tranquillamente in Internet, come mostrato nella seguente figura:

http://www.html.it/xml/tutorial/xml_01.htm (1 di 2) [19/06/2001 14.18.14]

XML: cosa vuol dire usare XML in una applicazione ?

E se invece non avessimo l'urgenza di esportare la nostra applicazione? Esistono comunque diversi motivi per cui la coppia Javascript + XML pu esserci utile:
q

i linguaggi di scripting sono in genere pi facili da imparare ed usare e possono essere sufficienti per creare dei primi esempi funzionanti; uno script pu comunque richiamare al suo interno codice pi potente (come Applet Java o ActiveX); il codice gi pronto per essere esportato su un'altra macchina, un altro DB o per passare in Internet.

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_01.htm (2 di 2) [19/06/2001 14.18.14]

XML: cosa vuol dire leggere e scrivere dati da un file XML ?

Cosa vuol dire leggere e scrivere dati da un file

XML?

Per elaborare un file XML un'applicazione deve compiere pi o meno le stesse operazioni che dovremmo eseguire noi a mano. Immaginiamo di creare un elenco dei membri della nostra famiglia: poich XML gerarchico partiremo da due classi molto generali (metodo top-down)

UOMINI ANIMALI
Continuiamo specificando un po' meglio i dati:

UOMINI (pap, mamma, bambino) ANIMALI (gatto, cane)

Aggiungiamo i tag ed otteniamo il relativo file XML:

<famiglia> <uomini> <babbo>Aldo</babbo> <mamma>Giovanna</mamma> <bambino>Giacomino</bambino> </uomini> <animali> <cane>Bobi</cane> <gatto>Fufi</gatto> </animali> </famiglia>
Questo documento XML ha molto in comune con la struttura delle cartelle del nostro PC: ecco come ci apparirebbe il file sotto forma di "filesystem":

http://www.html.it/xml/tutorial/xml_02.htm (1 di 3) [19/06/2001 14.18.22]

XML: cosa vuol dire leggere e scrivere dati da un file XML ?

Un'applicazione che voglia accedere ai dati nel nostro file XML deve avanzare come all'interno di un filesystem: partendo dall'origine, lungo un percorso (del tipo C:\famiglia\uomini\bambino\Giacomino.txt) che indica la posizione ricercata. Un programma in grado di fare tutto questo detto "parser" (dal verbo inglese "to parse", analizzare). Esiste a portata di mano un parserizzatore gratuito per fare una prima prova? Certo, lo trovate allegato ad MS Internet Explorer 5 ed gi pronto per essere provato. Ecco il nostro primo esempio di caricamento di un file XML:
q

create un file con Notepad o Wordpad di Windows, copiate nel file il documento XML d'esempio appena visto, chiamate il file Famiglia.xml (non dimenticate l'estensione .xml!) e salvatelo in formato testo semplice. Notepad o Wordpad si accorgeranno del .xml nel nome e creeranno un file con quella estensione anzich un .txt. aprite Famiglia.xml direttamente con Internet Explorer: vedrete un piccolo filesystem formato da rami espandibili (col segno "+") e collassabili (col segno "-") con un click. Il parser ha "parserizzato" il file e ve lo fa vedere.

Ora che abbiamo parserizzato il file XML possiamo anche leggerlo e poi modificarlo in un programma? La risposta s, certamente, grazie ad uno standard creato dal W3C (l'ente che cura gli standard di Internet) e che stato denominato DOM: Document Object Model.

http://www.html.it/xml/tutorial/xml_02.htm (2 di 3) [19/06/2001 14.18.22]

XML: cosa vuol dire leggere e scrivere dati da un file XML ?

Il DOM un insieme di comandi standard (ufficialmente una serie di metodi e propriet per l'oggetto documento XML ed i suoi discendenti) per trattare i file XML. Microsoft, nel creare il suo parserizzatore, ha rispettato buona parte (ma non tutti) di questi comandi standard. In questo capitolo 1 descriveremo lo standard DOM: la sua struttura ad oggetti facile da comprendere e permette al programmatore un pieno controllo sull'XML. Nel capitolo 2 passeremo all'opera, utilizzando i comandi (derivati dal DOM) messi a disposizione dal parserizzatore Microsoft.

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_02.htm (3 di 3) [19/06/2001 14.18.22]

XML: esempio 2: il carrello nel frame "invisibile"

Esempio 2: il carrello nel frame "invisibile"

[Tre file da salvare nella stessa cartella: Shop.htm per la pagina generale, Principale.htm per il frame centrale, Carrello.htm per il frame nascosto] Il cliente naviga il sito rimanendo all'interno del frame visibile. Un secondo frame invisibile accompagna la navigazione e contiene il carrello. Ecco i due componenti fondamentali:
q

struttura carrello: nel frame invisibile

<carrello> <prod1></prod1> ... <prodn></prodn> </carrello>

funzione compra: legge e parserizza la stringa-carrello, aggiunge all'albero un nuovo prodotto, de-parserizza l'albero e riporta la stringa modificata nel carrello Il file di esempio fornito vuoto di contenuti, comprendente solamente bottone e script per l'aggiornamento del carrello. Potete aggiungere le immagini dei prodotti e creare il collegamento per la lettura finale del carrello. Se volete vedere l'esempio subito all'opera potete aggiungere un bottone con la seguente istruzione, che visualizza la stringa-carrello attuale:

alert(parent.frames[0].Carrello.Carrello.value)

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_18.htm [19/06/2001 14.19.28]

XML: esempio 3: il carrello registrato come file fisico locale

Esempio 3: il carrello registrato come file fisico

locale

[Tre file da salvare nella stessa cartella: ShopFSO.htm per la pagina generale, PrincipaleFSO.htm per il frame centrale, CarrelloFSO.htm per il frame nascosto] In questo esempio, a differenza del precedente, la stringa-carrello viene salvata in un file fisico residente su client tramite la tecnica FSO.
q Vantaggi: il carrello pu essere conservato anche se il cliente spegne il browser o il computer. Molti siti di e-commerce forniscono piccoli SW allo scopo, scaricabili alla registrazione dell'utente. Noi vi forniamo un esempio semplice ma completo e soprattutto molto "leggero".

Svantaggi: intervenire sul filesystem del cliente un'azione poco simpatica. Inoltre la tecnica FSO richiede la presenza dell'ActiveX Microsoft Scrrun.dll (comunque abbastanza diffuso). Nell'esempio sono predisposti due bottoni per due attivit:

generazione del carrello: viene richiesta una posizione di salvataggio per il file;

salvataggio dei prodotti: apertura, modifica e salvataggio del carrello. Come nell'esempio 2 il carrello una stringa XML, ogni modifica richiede una parserizzazione ed una de-parserizzazione. Anche in questo esempio abbiamo utilizzato un frame invisibile. Il motivo la registrazione del nome del file fisico dove risiede il carrello: si pu scegliere fra la variante opener oppure parent del metodo degli input hidden. Potete sperimentare il file di esempio controllando il file xx.txt del carrello, per verificare che venga effettuato il salvataggio dei dati.

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_19.htm [19/06/2001 14.19.34]

XML: esempio 4: panoramica del sito senza un solo "click"

Esempio 4: panoramica del sito senza un solo "click"

[Un unico file Sitemap.htm e le tre immagini p1/2/3, da salvare nella stessa cartella] Molti siti di buona qualit mettono a disposizione dell'utente, sulla homepage, una "sitemap", che riassume per titoli l'organizzazione dei contenuti. Queste mappe sono di solito degli alberi espandibili, con brevi testi. E se la mappa anzich testi contenesse immagini, che al passaggio del mouse potessero espandersi in forme fantasiose come spirali o stelle? Un elenco di titoli si trasformerebbe in un percorso sensibile al mouse, che senza un solo click condurrebbe il visitatore attraverso una vera "anteprima visiva" del sito. Tramite XML + DOM questi percorsi possono essere creati, a partire da una serie di immagini predisposte ed un algoritmo che ne gestisce l'apertura. Vediamo come questi due elementi interagiscono nell'esempio 4:
q

Aree mappabili Le immagini che devono formare il percorso vengono distribuite nella pagina dove dovranno apparire. Ad ognuna viene assegnata un'area mappabile sensibile al passaggio del mouse:

<img name="p1" src="p1.jpg" usemap="#a1" width="70" height="70"> ... <map name="a1"> <area coords="0,0,70,70" onMouseOver="pass('p1')"> </map>
Le dimensioni coords="0,0,x,y" devono permettere di coprire tutta l'immagine correlata. Nell'esempio le immagini sono state disposte in righe e colonne di una tabella solo per ridurre la parte html a favore della visibilit dello script. Volendo potete disporre le immagini ovunque vogliate: l'unico limite che formino un cammino continuo per lo spostamento del mouse.
q

Algoritmo di gestione dell'apertura delle immagini. All'inizio le immagini devono essere dichiarate tutte di dimensione nulla a parte l'iniziale (si badi di aggiungere border="0", altrimenti al posto delle immagini vi saranno dei punti non proprio invisibili):

<img name="p11" border="0" src="p1.jpg" usemap="#a11" width="0" height="0">


La variabile stringa, che registra lo stato di apertura delle finestre, ha il seguente contenuto iniziale:

<control on=\"true\"> <p1 on=\"true\"> <p11 on=\"false\"> <p111 on=\"false</p131> ... </p132> </p13> </p1> </control>
Ogni volta che un'immagine aperta viene attraversata dal mouse l'algoritmo nella funzione pass() legge lo stato registrato nella stringa XML e prende una decisione: - se le immagini "figlie" sono chiuse il passaggio del mouse ne genera l'apertura:

http://www.html.it/xml/tutorial/xml_20.htm (1 di 2) [19/06/2001 14.19.37]

XML: esempio 4: panoramica del sito senza un solo "click"

if (img == "p112") { document.p112.width = x; document.p112.height = y }


- se le immagini "figlie" sono gi aperte si possono scegliere due alternative: o chiuderle (cammino "a ritroso") o lasciarle aperte, riservando la chiusura ad un tasto "reset" o al passaggio sull'immagine iniziale. Il nuovo stato viene registrato nella variabile XML e l'algoritmo procede. Nell'esempio abbiamo scelto l'alternativa del cammino a ritroso. Si noti che l'algoritmo deve essere studiato accuratamente: ad esempio all'apertura di un nuovo figlio il "nonno" viene "fissato", per evitare che comandi la chiusura dell'immagine intermedia, lasciando isolati i "nipoti".

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_20.htm (2 di 2) [19/06/2001 14.19.37]

XML: esempio 5: morte al "file not found"

Esempio 5: morte al "file not found"

[File Link.htm, Target.htm, Search.js e DB.xml da salvare nella stessa cartella] Il messaggio "File not found" che appare sul browser del nostro utente significa: "il web master ha spostato questa pagina, ma non ha aggiornato tutti i link corrispondenti!". Se il sito veramente complesso il rapporto fra numero di link interni e numero di pagine pu essere molto elevato: ci significa "n" aggiornamenti per ogni pagina spostata! L'indirizzo fisico non un buono strumento: in questo esempio mostriamo come gestire i link tramite codici, che accompagnano un pagina dalla nascita alla morte, ovunque essa sia. Alla base, un caso veramente esemplare di uso della potenza di XML. 1. Database XML delle pagine del sito Il primo passo consiste nell'assegnare ad ogni pagina un codice. La coppia codice-indirizzo fisico registrata in un DB XML:

<links> <aaaa ind="H:/Home/index.htm"/> <aaab ... ... </links>

Per ogni pagina esiste una sola registrazione, quindi un solo dato da aggiornare in caso di spostamento. 2. Creazione dei link verso la pagina Al posto della classica chiamata

<a href="H:/Home/index.htm">
si inserisce il seguente comando

<a href="search('aaaa')">
3. Funzione di ricerca: la function search() apre il DB XML e recupera tramite il codice l'attuale indirizzo fisico. Si noti che:
q

il DB XML viene trasferito al client per essere elaborato in sessione locale. Ci non dovrebbe comunque provocare problemi: un elenco di ben cento indirizzi pu arrivare ad occupare al massimo 5-6 KB; al limite il DB pu essere spezzato in pi parti; preferibile che il codice della funzione search() sia esterno alla pagina, poich contiene l'indirizzo fisico del DB, che pu cos essere aggiornato centralmente; il file del DB e della funzione avranno ovviamente una richiesta pari alla somma di tutte le altre pagine.

http://www.html.it/xml/tutorial/xml_21.htm (1 di 2) [19/06/2001 14.19.41]

XML: esempio 5: morte al "file not found"

Le avvertenze segnalano che l'utilizzo del DB XML pu essere estremamente comodo per le pagine oggetto di frequenti movimenti, ma va sostituito con il link classico appena la pagina acquisisce un indirizzo "stabile". Per provare l'esempio aprite il file Link.htm e provate l'equivalenza dei due link. Ora spostate il file Target.htm ed aggiornate DB.xml con la nuova posizione: potrete scoprire quale dei due link basato su xml (quello ancora funzionante).

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_21.htm (2 di 2) [19/06/2001 14.19.41]

XML: introduzione: i vantaggi di programmare per il browser

Introduzione: i vantaggi di programmare per il browser

Potreste chiedervi: che senso ha trasportare un eseguibile verso un linguaggio di scripting limitato ed eseguito solo su browser? Perch utilizzare un ambiente di esecuzione dedicato al web (il browser, appunto) per una applicazione stand - alone? La risposta una ed abbastanza elementare: per utilizzare le librerie grafiche per la resa dell'HTML. Un eseguibile realizzato con l'ausilio di varie screen (ad esempio in Visual Basic o Visual C++), anche se contiene pochissimo codice, raggiunge dimensioni notevoli (come minimo qualche centinaio di KB) a causa delle informazioni sull'aspetto grafico (le cosiddette librerie). Le stesse screen potrebbero essere generate con i pochi byte di un file HTML, grazie alle librerie contenute nel browser. Per convincervi di questo provate a costruire tramite un linguaggio "Visual" i men a discesa della screen rappresentata qui sotto:

Ebbene, questa screen stata generata con le pagine HTML riportate di seguito, per un totale di nemmeno 3,5 KB. Per provare salvate i quattro testi in altrettanti file con estensione .htm nella stessa cartella; aprendo il file Main.htm apparir una pagina con tre frame. 1. Main.htm

<html> <head> <title>Prova menu</title> </head> <frameset rows="150,*" border="0"> <frame name="Menu" scrolling="no" noresize src="Menu.htm"> <frameset cols="250,*"> <frame name="Sx" target="Dx" src="Sx.htm" scrolling="auto"> <frame name="Dx" src="Dx.htm"> </frameset> </frameset> </html>

2. Menu.htm

http://www.html.it/xml/tutorial/xml_22.htm (1 di 3) [19/06/2001 14.19.50]

XML: introduzione: i vantaggi di programmare per il browser

<html> <head> <base target="Menu"> </head> <body> <table border="1" width="100%" height="1"> <tr> <td width="100%" height="1"> <form> <table border="0" width="100%" bgcolor="#006b6b"> <tr> <td width="96%" align="center"><b> <font color="#FFFFFF" size="6">Nome del software</font> </b></td> <td width="2%" height="1" align="right"> <input type="button" value=" ? "></td> <td width="2%" height="1" align="right"> <input type="button" value=" X "></td> </tr> </table> </form> <table border="1" width="100%" bgcolor="#C0C0C0"> <tr> <td width="9%" height="19"><b>File</b></td> <td width="9%" height="19"><b>Modifica</b></td> <td width="9%" height="19"><b>Help</b></td> <td width="93%" height="19"><b>Path</b></td> </tr> <tr> <td width="2%" bgcolor="#FFFFFF"> <form> <select> <option>Apri</option> <option>Salva....</option> <option>Chiudi</option> </select> </form> </td> <td width="9%" bgcolor="#FFFFFF"> <form> <select> <option>Copia</option> <option>Incolla</option> <option>Taglia</option> </select> </form> </td> <td width="9%" bgcolor="#FFFFFF"> <form> <select> <option>About...</option> <option>Manuale</option> </select> </form> </td> <td width="93%" bgcolor="#FFFFFF"> <form> <input type="text" size="50"> </form> </td> </tr> </table>

http://www.html.it/xml/tutorial/xml_22.htm (2 di 3) [19/06/2001 14.19.50]

XML: introduzione: i vantaggi di programmare per il browser

</td> </tr> </table> </body> </html>


3. Sx.htm

<html> <head> <base target="DX"> </head> <body> <table border="2" width="100%" height="100%" bgcolor="#808080"> <tr> <td width="100%" height="25" bgcolor="#006b6b"></td> </tr> <tr> <td width="100%" height="100%" bgcolor="#FFFFFF"></td> </tr> <tr> <td width="100%" height="25"bgcolor="#C0C0C0"></td> </tr> </table> </body> </html>

4. Dx.htm

<html> <body> <table border="2" width="100%" height="100%" bgcolor="#808080"> <tr> <td width="100%" height="25" bgcolor="#006b6b"> </td> </tr> <tr> <td width="100%" height="100%" bgcolor="#FFFFFF"><b> <p align="center"><font color="#006b6b" size="6"> Welcome to my software ! This is the central screen</font> </p></b></td> </tr> <tr> <td width="100%"height="25" bgcolor="#C0C0C0"></td> </tr> </table> </body> </html>

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_22.htm (3 di 3) [19/06/2001 14.19.50]

XML: la struttura complessiva di un eseguibile ad oggetti per il browser

La struttura complessiva di un eseguibile ad oggetti per il browser

Con le tecniche viste al capitolo 3 possiamo creare una libreria di oggetti web per una programmazione object-oriented su browser. E' un progetto ambizioso, ma meno complesso di quanto si pensi. Nell'immagine di seguito rappresentato lo schema qualitativo complessivo del nostro SW, in ottica object-oriented:

La dichiarazione rigorosa delle classi pu essere simile alla seguente: - webObject


q q

controlWindow workWindow

L'oggetto webObject una qualsiasi pagina web, con le relative propriet. I metodi riguardano lo scambio dati col filesystem (locale o collegato tramite la rete):
q

per la lettura sono sufficienti i metodi standard javascript;

per operazioni read/write pi complesse si pu ricorrere alla tecnica FSO, limitata ai file di testo ma potenziata dall'uso di XML. I figli del padre controlWindow si basano sulla tecnica degli input hidden, variante parent. Per questo bene distinguere fra la frame di controllo (controlWindow) e le frame di scorrimento (workWindow) (il fatto che entrambe sono contenute in una pagina HTML generale un dettaglio tecnico, non logico). Entrambi i figli ereditano metodi e propriet dal padre e vi aggiungono:

controlWindow: deve possedere delle propriet legato allo "stato" di esecuzione, registrate in campi hidden (ad esempio document.control.control,value);

q workWindow: possono possedere metodi diversi, ma la loro interfaccia di input/output deve essere o verso il filesystem o formata dai campi hidden dedicati nell'oggetto controlWindow.

In questa struttura, che parte ha XML? XML il formato obbligatorio per trasportare dati strutturati attraverso le interfacce di input/output, che supportano tutte solamente stringhe testuali. DOM l'interfaccia fra le stringhe ed il codice, tramite la parserizzazione in input e la de-parserizzazione in output. All'interno del codice si pu scegliere se mantenere l'albero XML e continuare a lavorare con DOM oppure passare i dati a variabili javascript tradizionali.

http://www.html.it/xml/tutorial/xml_23.htm (1 di 2) [19/06/2001 14.19.59]

XML: la struttura complessiva di un eseguibile ad oggetti per il browser

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_23.htm (2 di 2) [19/06/2001 14.19.59]

XML: la chiamata di un oggetto

La chiamata di un oggetto

Ipotizziamo di avere costruito, come nell'esempio iniziale, la videata principale del SW con i men. Nel men "file" abbiamo inserito la voce "Apri", che attiva l'omonima function Apri():

function Apri() { /* punto 1: videata pop-up che richiede il nome del file da aprire*/ /* punto 2: istanziazione di un nuovo oggetto "document"*/ new document(nomefile) }
L'oggetto "document" appartiene alla classe workWindow e la sua istanziazione genera le seguenti attivit:
q

tramite l'interfaccia in/out col filesystem viene caricato un file;

tramite l'apposita interfaccia viene aggiornata la struttura di stato della controlWindow: viene segnalato che un documento stato aperto ed attualmente in stato "attivo" nella frame x + "salvato". Adesso ipotizziamo di scegliere, dal men "modifica", una funzione per operare sul file aperto:

viene istanziato un nuovo oggetto di tipo workWindow, destinato non alla visualizzazione ma all'elaborazione; l'oggetto controlla sulla struttura di stato se ed in quale frame esiste un oggetto "document" attivo;

ricevuta risposta affermativa, il nuovo oggetto lavora e poi cambia lo stato dell'oggetto "document" da "salvato" in "non salvato". Anche se le funzionalit richieste al SW sono complesse, procedendo con questo metodo alla fine otterremo:

una struttura ordinata, in cui la complessit stata governata; un codice altamente riutilizzabile; un volume complessivo di pochi KB, che permette al nostro SW di essere facilmente distribuito in rete; un aspetto grafico pari alla nostra abilit di generare le videate HTML.

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_24.htm [19/06/2001 14.20.03]

XML: esempio 6: un SW in 15 KB

Esempio 6: un SW in 15 KB

[Quattro file: Main.htm, Menu.htm, Dx.htm, Sx.htm, da salvare nella stessa cartella] Per dimostrare la bellezza di un piccolo SW basato su pagine HTML abbiamo creato un versione un po' pi elaborata del "test per i visitatori" contenuto nell'esempio 1. Nel nuovo esempio un men a discesa permette di gestire completamente tutte le attivit di chi vuole svolgere il test:
q

men "File" - comando "Nuovo": permette di ricominciare il test; - comando "Risultato": calcola il risultato del test, che coerente anche se non avete ancora risposto a tutte le domande;

men "Modifica" - comando "Domanda x": presenta la videata della domanda e vi permette di registrare la risposta; alla registrazione viene riempito il flag corrispondente nella finestra di sinistra, per ricordarvi il percorso svolto; possibile qualsiasi sequenza delle domande.

Avete provato il funzionamento? Una bella differenza rispetto all'esempio 1! Ebbene, tutto ci racchiuso in soli 15 KB complessivi, grazie alle librerie grafiche del browser. Ora non vi resta che provare voi stessi!

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_25.htm [19/06/2001 14.20.06]

XML: BIBLIOGRAFIA

BIBLIOGRAFIA

La bibliografia sull'XML davvero sterminata, formata da un mix di opere di pura divulgazione della "filosofia XML" e manuali "ipertecnici" per i soli addetti ai lavori. Per quanto concerne in particolare il DOM, trattato in questo tutorial, consigliamo due veri "gioielli" in lingua italiana: 1. "Costruire siti Web con XML", di Michael Floyd, Tecniche Nuove (2000) Probabilmente l'unico riferimento pratico per il DOM esistente in commercio. Chiaro, ricco di esempi realmente utilizzabili, tratta anche di molto altro (XSL, XSLT, DTD, ASP ...), sia in ottica client che server. 2. "Usare XML", di Lee Anne Philips, Mondadori Informatica (2000) L'attuale "Bibbia" dell'XML disponibile in Italia: costoso e di difficile lettura, da usare soprattutto per consultazione. Completa in ogni aspetto collegato all'XML. Resta da osservare che entrambe le opere sono di autori americani: per ora la bibliografia italiana sull'XML deve attingere ampiamente a fonti estere.

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_26.htm [19/06/2001 14.20.09]

XML: caratteri speciali ed escape dell'XML 1.0

Caratteri speciali ed escape dell'XML 1.0

Il seguente elenco pu essere prezioso, soprattutto perch sono indicati non solo i caratteri, ma anche il loro codice ASCII (in poche parole il numero da digitare assieme al tasto "alt"): speciali:

(199) (199 + 249) (c) (189 + 184) (199 + 251) (199 + 253) (199 + 170)

escape: identici a quelli dell'HTML

< > &

&lt &gt &amp

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_27.htm [19/06/2001 14.20.12]

XML: specifica completa del modello DOM

Specifica completa del modello DOM

DOM (Document Object Model) una API (Application Program Interface) definita dal W3C in due versioni successive: Level 1 e Level 2. Lo scopo quello di definire un metodo univoco (soprattutto per gli script) per accedere a documenti in linguaggio di mark-up; il metodo consiste nel trasformare i tag innestati in altrettanti oggetti. Ecco lo schema completo a 4 livelli della gerarchia DOM (fissato gi nel Level 1):

Tipo del nodo Node (Root) DocumentFragment Document Attr Element DocumentType Notation Entity EntityReference ProcessingInstruction CharacterData Comment Text CDATA section 11 9 2 1 10 12 6 5 7 8 3 4

In realt la gerarchia, coerentemente col fatto che DOM una API, composta di interfacce, non di classi. Volendo si potrebbe dichiarare proprie classi, con attributi e metodi comprendenti anche quelli delle interfacce DOM. Esistono due modi di utilizzare la gerarchia: un primo approccio tende a non specificare ulteriormente il livello Node, trattando ogni parte del documento con la sola interfaccia di livello massimo (in fondo tutto nodo, a parte i meta - oggetti ausiliari NodeList e NodeNamedMap). L'approccio completo dichiara invece tutte le interfacce specifiche. Nell'insieme delle interfacce vengono spesso distinte le interfacce fondamentali (utilizzabili anche per l'HTML: Document, Attr, Element, CharacterData) e quelle estese (tutte le altre, specifiche per XML). Homepage W3C per lo standard DOM

Lezione

successiva

[Sommario]

http://www.html.it/xml/tutorial/xml_28.htm [19/06/2001 14.20.15]

XML: parserizzatori

Parserizzatori

1. MSXML Nella versione 5.0 di Internet Explorer supportata una istanziazione diretta nello script degli oggetti ActiveX tramite la seguente sintassi (che utilizza codici mnemonici anzich numerici): var file_XML = new ActiveXObject("Microsoft.XMLDOM"); Questa sintassi equivalente (ed alternativa in IE5) a quella delle versioni precedenti, che richiedeva due passaggi:
q

nel documento HTML

<OBJECT ClassID = "clsid: CFC399AF-D876-11D0-9C10-00C04FC99C8E" ID = "MSXML" Name="xmlDoc"> </OBJECT>


q

nello script:

variabile = MSXML
L'ActiveX richiamato una volta era gi presente in Windows, ma andava installato a mano, oggi compreso in MSXML.dll (assieme all'elaboratore XSL), che si installa automaticamente con IE5. Tramite MSXML.dll sono resi disponibili in Windows:
q

API del DOM per scripting (Javascript e Vbscript) e programmazione (C++ e Java) invio e ricezione, in connessione HTTP, di file XML tipo MIME "text/xml", tipo file XML

Con il comando new viene richiamato l'API, il cui primo utilizzo il metodo per l'esecuzione della parserizzazione del sorgente XML:

file_XML.async = false; file_XML.load (URL)


La propriet async permette il download sincrono. Segue poi la dichiarazione della radice dell'albero:

var root = file_XML.documentElement;


Sia new (o meglio questo suo uso specifico per XML) che load sono comandi specifici Microsoft. D'altra parte DOM non definisce un metodo standard per creare un nuovo oggetto Document e caricarne il contenuto. Microsoft aggiunge anche altre interfacce proprietarie che estendono il DOM standard:
q

XMLDOMParseError: interfaccia dell'oggetto ActiveX per segnalazione di errori nella parserizzazione. Attributi: - validateOnParse: pu essere dichiarata come booleano per attivare o meno la validazione durante la parserizzazione. L'attivazione influisce sui risultati segnalati dagli attributi seguenti.

http://www.html.it/xml/tutorial/xml_29.htm (1 di 2) [19/06/2001 14.20.18]

XML: parserizzatori

- parseError.errorCode: indice numerico del tipo di errore, 0 indica assenza di errore - parseError.reason: motivo dell'errore, classi standard inserite da Microsoft con testo esplicativo - parseError.line: linea di ubicazione dell'errore nel file XML - parseError.srcText: porzione di ubicazione dell'errore nel file XML Homepage Microsoft Developer's Network 2. Altri parserizzatori Esistono parecchi parserizzatori gratuiti, di solito scritti in Java o C++. Fra i creatori si possono annoverare molti istituti di ricerca, IBM e Sun (in loro pacchetti di sviluppo scaricabili).

Lezione successiva
[Sommario]

http://www.html.it/xml/tutorial/xml_29.htm (2 di 2) [19/06/2001 14.20.18]

XML: interfaccia FSO (FileSystenObject) per creare e salvare file

Interfaccia FSO (FileSystenObject) per creare e salvare file

Microsoft mette a disposizione il modello di oggetti FSO (FileSystemObject), che supporta la creazione e la gestione di file di testo in ambiente Windows. FSO un ActiveX contenuto nella libreria dei tipi di scripting (Scrrun.dll), che quindi deve essere installata nel vostro sistema. Di solito questa dll viene installata assieme a MS ScriptEditor, contenuto anche nelle ultime versioni di Office. FSO ha esiti potenzialmente distruttivi su di un filesystem, di cui prende il controllo assoluto ( infatti utilizzato per creare virus html). Per questo motivo IE5 vi avverte sempre prima dell'esecuzione di uno script che utilizza FSO e se il livello di protezione settato elevato non esegue per nulla. Comunque raccomandiamo di:
q

segnalare chiaramente all'utilizzatore la presenza di questi comandi;

limitarsi ad usare metodi di creazione anzich di modifica e modificare solamente file creati dal programma. FSO sicuramente meno potente di altre tecniche (CGI, ASP...), ma ha il vantaggio di essere eseguito su client, quindi potete utilizzarlo sul vostro PC senza aver installato un server web. L'utilizzo di FSO parte con l'istanziazione dell'oggetto ActiveX corrispondente:

var fso = new ActiveXObject("Scripting.FileSystemObject")


Questo oggetto unico: ogni altra istanziazione avr esito negativo. Il motivo chiaro: fso ora un operatore virtuale del vostro filesystem e un altro operatore potrebbe generare contrasti. Le operazioni di FSO si dividono fra quelle riferite all'oggetto "operatore" (che chiameremo fso) e quelle riferite agli oggetti del filesystem (che chiameremo fsvar), che possono essere assegnati a delle variabili del programma. L'oggetto fso individua la cartella corrente, come se stessimo utilizzando "gestione risorse" di Windows. I percorsi usati come parametri nei metodi possono essere assoluti o fare riferimento alla posizione attuale dichiarata per fso. [Notazione: i parametri fra parentesi quadre sono facoltativi] 1. Operazioni con le cartelle:
q

Attributi: - Name: di fsvar, restituisce il nome - Path: di fsvar, restituisce la posizione

Metodi: - GetFolder(percorso e nome); di fso, permette di creare un fsvar - CreateFolder(percorso e nome[, sovrascrittura]): di fso, crea la cartella indicata, sovrascrittura pu essere impostato su true o false (default) - Delete (percorso e nome[, forza]): di fsvar, cancella la cartella, se forza impostato su true cancella anche i contenuti di sola lettura (default = false) - DeleteFolder(percorso e nome[, forza]): di fso, cancella la cartella - Move (destinazione): di fsvar, sposta la cartella - MoveFolder (percorso e nome, destinazione): di fso, sposta una o pi cartelle - Copy (destinazione[, sovrascrittura]): di fsvar, sposta la cartella - CopyFolder(percorso e nome, destinazione): di fso, copia una o pi cartelle - FolderExists(percorso e nome): di fso, restituisce un booleano

2. Operazioni con i file:

http://www.html.it/xml/tutorial/xml_30.htm (1 di 2) [19/06/2001 14.20.22]

XML: interfaccia FSO (FileSystenObject) per creare e salvare file

Attributi: - Name - Path

Metodi per la creazione e l'istanziazione: - CreateTextFile (percorso e nome[, sovrascrittura[, unicode]]): di fso, unicode indica con true che il testo deve essere Unicode, con false (default) ASCII. La creazione di un file ottenibile anche con i metodi OpenTextFile e OpenAstextStream con l'impostazione dei flag di modo I/O su sovrascrittura e formato su true. - GetFile: come per le cartelle - FileExists: come per le cartelle

Metodi per la lettura e la scrittura: queste operazioni si basano su di un oggetto ausiliario detto TextStream (in pratica un buffer di testo). Prima di qualsiasi operazione necessario effettuare l'apertura del file. Il risultato del metodo di apertura, assegnato ad una variabile locale, un oggetto TextStream: - OpenTextFile(percorso e nome[, modo I/O[, creazione[, formato]]]): di fso restituisce un oggetto TextStream; Modo I/O, valori: 1 (sola lettura, default), 2 (sovrascrittura), 8 (scrittura in coda) Creazione: se il file indicato non esiste con true viene creato (default: false) Formato, valori: -2 (apre utilizzando l'impostazione predefinita di sistema), -1 (apre in formato Unicode), 0 (apre in formato ASCII, default) - OpenAstextStream([modo I/O[, formato]]): di fsvar, funziona come OpenTextFile - Read (caratteri): di TextStream, legge il numero di caratteri indicato - Readline(): di TextStream, legge una riga fino al carattere di nuova riga escluso - ReadAll(): di TextStream, legge tutto il file - Write([stringa]): di TextStream, scrive senza andare a capo - WriteLine ([stringa]): di TextStream, se non viene indicata la stinga va semplicemente a capo - WriteBlankLines (n): di TextStream, inserisce n righe bianche - Close(): di TextStream, salva e chiude il file, svuota il buffer TextStream

[Sommario]

http://www.html.it/xml/tutorial/xml_30.htm (2 di 2) [19/06/2001 14.20.22]

HTML.it - percorso per esperti

Percorso rivolto a coloro che hanno una buona conoscenza degli strumenti standard del Web publishing e che vogliano approfondire a livello professionale le proprie conoscenze. Per questo percorso propedeutico aver seguito il percorso per apprendisti

Segui il corso Cold Fusion


Cold Fusion estende i comandi (tag) dell'HTML standard, aggiungendone di nuovi che permettono l'interfacciamento con i database. Le applicazioni su server Cold Fusion si distinguono per performance, facilit d'uso e semplicit. Questa sezione consigliata a chiunque voglia utilizzare uno strumento potente con sforzo minimo.

Utilizza database con SQL


Chi ha necessit di utilizzare database sul proprio server non pu prescindere dalla conoscenza di SQL, il linguaggio per la creazione di database relazionali. Questa guida mostra come utilizzare questo linguaggio in modo chiaro e semplice.

Gestisci al meglio il tuo Webserver IIS o Apache


Se hai la possibilit di gestire il tuo Webserver questi tutorial mostrano come ottenere risultati pratici in poche semplici operazioni. HTML.it mette a tua disposizione guide all'utlizzo di Webserver Apache e Information Server, per fornire l'informazione pi completa ed equidistante sull'argomento.

Leggi le FAQ sul Web publishing


Le FAQ raccolgono le domande pi frequenti su argomenti legati all'HTML ed ai linguaggi ad esso collegati. HTML.it raccoglie le faq pi numerose del Web italiano sugli argomenti legati al Web publishing. In questa sezione troverai soluzione a gran parte dei tuoi dubbi.

Utilizza ogni giorno i servizi informativi di HTML.it


HTML.it informa e approfondisce ogni giorno temi legati alla realizzazione siti. Puoi conoscere le ultime novit dal Web consultando le nostre news, il libro e il servizio gratuito della settimana.

Partecipa alla comunit di HTML.it


Puoi confrontare le tue esperienze o chiarire i tuoi dubbi con gli altri visitatori di HTML.it, grazie al forum di discussione gratuito e di libero accesso. Sono migliaia gli iscritti al forum ed a loro potrai chiedere spiegazioni, aiuti o semplicemente scambiare idee e pareri. Puoi esprimere la tua opinione anche attraverso i sondaggi che settimanalmente HTML.it ti propone. Ancora, sottoporre il tuo sito al controllo di qualit di HTML.it.

Utilizza e modifica CGI scritti in Perl


Il Perl un linguaggio finalizzato principalmente alla trattazione di stringhe e file di testo. Perl utilizzato pesantemente nella scrittura di procedure CGI installate su un server web, o per lo sviluppo di procedure di manutenzione delle attivit di un server. Questa guida consigliata a coloro che utilizzano CGI per l'automazione di determinate procedure o vogliono crearne di propri.

Automatizza il tuo sito con PHP o ASP


Se l'HTML standard ti sta stretto e necessiti di strumenti per automatizzare il tuo sito o interfacciarlo a database, ASP e PHP ti forniscono le basi per creare siti dinamici sia su IIS che Apache. Seguendo questi corsi imparerai a far dialogare server e client.

http://www.html.it/percorsi/esperti.htm [19/06/2001 14.22.27]

HTML.it - Corso SQL

di Lucio Benfante lucio@html.it

Chi ha necessit di utilizzare database sul proprio server non pu prescindere dalla conoscenza di SQL, il linguaggio per la creazione di database relazionali. La guida, per l'argomento trattato, si rivolge ad un'utenza professionale.

Percorso consigliato: esperti Livello di difficolt:

Test di preparazione in 10 domande F.A.Q.: risposte a domande frequenti

1. Una semplice grammatica sintattica


La grammatica sintattica utilizzata nelle varie lezioni per spiegare la sintassi dei comandi SQL.

2. Web, Database e DBMS


Le caratteristiche e le funzionalita' principali secondo cui i DBMS vengono normalmente classificati.

3. Il modello relazionale
Storia e panoramica dei database relazionali.

4. Breve storia di SQL


Storia e sviluppo di SQL dal 1974 ad oggi

5. Un database di esempio
Presentatazione della struttura del database che verra' utilizzato per gli esempi delle successive lezioni.

6. Strumenti per interagire con un DBMS


Le due modalit di interazione con DBMS: invocazione interattiva e invocazione tramite un programma applicativo

7. Creare il database
La creazione del database consiste nella creazione delle tabelle che lo compongono

8. Popolare il database
Col termine "popolazione del database" si intende l'attivita' di inserimento dei dati al suo interno.

9. Interrogare il database
Le istruzioni che occorrono per estrarre da un database relazionale i dati che interessano.

10. Aggiornare il database


Come modificare i dati gia' inseriti nelle tabelle del database.

11. Modificare la struttura del database


A volte non e' sufficiente modificare i dati, ma occorre aggiornare la struttura stessa del database per far si' che possano essere rappresentate nuove informazioni

12. Utilizzo multiutente di un database


Normalmente l'accesso ai dati avviene in maniera concorrente da parte di piu' utenti contemporaneamente

11. Riferimenti bibliografici e web


Siti Web e volumi cartacei di approfondimento su SQL.

http://www.html.it/sql/index.html [19/06/2001 14.22.40]

SQL: Una semplice grammatica sintattica

Una semplice grammatica sintattica


La grammatica sintattica utilizzata nelle varie lezioni per spiegare la sintassi dei comandi SQL e' molto semplice:
q

Il testo in maiuscolo deve comparire cosi' com'e'. Il linguaggio SQL non e' case-sensitive, quindi poi negli esempi compariranno sia lettere maiuscole che minuscole in modo da aumentarne la leggibilita'. Il testo in minuscolo indica elementi che devono essere ulteriormente specificati. Ad esempio se compare vincoli_di_colonna non significa che in quella posizione bisogna scrivere esattamente quella sequenza di caratteri, ma che vi troveranno posto i vincoli posti sulla colonna, specificati con la loro particolare sintassi, che e' stata o verra' spiegata in altro luogo. Le parentesi quadrate ([]) indicano elementi che sono opzionali e che quindi non devono necessariamente comparire. I tre punti (...) indicano elementi che possono essere ripetuti. Ad esempio: [ , [ vincolo_di_tabella ] ... ] indica che l'elemento ", [vincolo_di_tabella]" puo' essere ripetuto quante volte e' necessario.

Elementi separati dal carattere "|" ed eventualmente raggruppati dalle parentesi graffe ({}) indicano elementi che sono in alternativa. Ad esempio: { elemento1 | elemento2 } indica che in quella posizione andra' scritto o elemento1 o elemento2.

Il testo scritto fra apici singoli (') o doppi (") va scritto esattamente come indicato (apici, maiuscole e minuscole comprese). Gli altri caratteri (ad esempio, le virgole (,) o i doppi apici (")) devono comparire cosi' come sono.

Lezione

successiva

[Sommario]

http://www.html.it/sql/sql_01.htm [19/06/2001 14.22.52]

SQL: Web, Database e DBMS

Web, Database e DBMS


Il World Wide Web e' forse una delle maggiori fonti di informazione a cui oggi possiamo attingere: avendo a disposizione un collegamento a Internet ed un browser Web, un software ormai comune su qualsiasi computer, abbiamo la possibilita' di consultare un patrimonio di centinaia di milioni di pagine riguardanti praticamente ogni argomento di interesse. Spesso queste pagine non sono documenti statici, ma vengono creati dinamicamente quando noi li richiediamo e le informazioni che contengono vengono estratte da un database. Se il database e' un database relazionale (vedremo in seguito cosa questo significa), probabilmente il linguaggio utilizzato per recuperare le informazioni che ci vengono mostrate e' SQL (Structured Query Language). Prima di occuparci di cos'e' e come si usa SQL cerchiamo di capire cosa si intende con la parola database, che spesso in italiano viene tradotta come "base di dati". Un database e' una collezione di dati che viene gestita e organizzata da un software specifico, il DBMS (DataBase Management System, Sistema di Gestione di DataBase). Un DBMS e' sostanzialmente uno strato software che si frappone fra l'utente ed i dati veri e propri. Grazie a questo strato intermedio l'utente e le applicazioni non accedono ai dati cosi' come sono memorizzati effettivamente, cioe' alla loro rappresentazione fisica, ma ne vedono solamente una rappresentazione logica. Cio' permette un elevato grado di indipendenza fra le applicazioni e la memorizzazione fisica dei dati. L'amministratore del database, se ne sente la necessita', puo' decidere di memorizzare i dati in maniera differente o anche di cambiare il DBMS senza che le applicazioni, e quindi gli utenti, ne risentano. La cosa importante e' che non venga cambiata la rappresentazione logica di quei dati, che e' la sola cosa che i loro utilizzatori conoscono. Questa rappresentazione logica viene chiamata 'Schema del database' ed e' la forma di rappresentazione dei dati piu' a basso livello a cui un utente del database puo' accedere. Ad esempio, in Figura 1 e' rappresentata una situazione in cui l'amministratore del database ha deciso che per motivi di efficienza era necessario cambiare il disco su cui erano memorizzati alcuni dati, partizionandoli inoltre su piu' dischi per permettere accessi paralleli a sottoinsiemi di dati indipendenti. Dal punto di vista dell'utente non e' cambiato assolutamente nulla e probabilmente egli non e' nemmeno a conoscenza dell'avvenuto cambiamento.

http://www.html.it/sql/sql_02.htm (1 di 3) [19/06/2001 14.22.58]

SQL: Web, Database e DBMS

La caratteristica pricipale secondo cui i DBMS vengono normalmente classificati e' appunto la rappresentazione logica dei dati che essi mostrano ai loro utilizzatori. Nel corso degli anni sono stati adottati numerosi modelli per i dati, a fronte dei quali esistono quindi vari tipi di database. I tipi piu' comuni sono: Database gerarchici: i dati vengono organizzati in insiemi legati fra loro da relazioni di "possesso", in cui un insieme di dati puo' possedere altri insiemi di dati, ma un insieme puo' appartenere solo ad un altro insieme. La struttura risultante e' un albero di insiemi di dati. Database reticolari: il modello reticolare e' molto simile a quello gerarchico, ed infatti nasce come estensione di quest'ultimo. Anche in questo modello insiemi di dati sono legati da relazioni di possesso, ma ogni insieme di dati puo' appartenere a uno o piu' insiemi. La struttura risultante e' una rete di insiemi di dati. Database relazionali: i database appartenenti a questa categoria si basano sul modello relazionale la cui struttura principale e' la relazione, cioe' una tabella bidimensionale composta da righe e colonne. Ciascuna riga, che in terminologia relazionale viene chiamata tupla, rappresenta un'entita' che noi vogliamo memorizzare nel database. Le caratteristiche di ciascuna entita' sono definite invece dalle colonne delle relazioni, che vengono chiamate attributi. Entita' con caratteristiche comuni, cioe' descritti dallo stesso insieme di attributi, faranno parte della stessa relazione. Database ad oggetti (object-oriented): lo schema di un database ad oggetti e' rappresentato da un insieme di classi, che definiscono le caratteristiche ed il comportamento degli oggetti che popoleranno il database. La principale differenza con i modelli esaminati finora e' la non passivita' dei dati. Infatti con un database tradizionale (intendendo con questo termine qualunque database non ad oggetti) le operazioni che devono essere effettuate sui dati vengono demandate alle applicazioni che li utilizzano. Con un database object-oriented, al contrario, gli oggetti memorizzati nel database contengono sia i dati che le operazioni possibili su tali dati. In un certo senso potremmo pensare agli oggetti come a dati a cui e' stata fatta una iniezione di intelligenza, che gli permette di sapere come comportarsi, senza doversi appoggiare ad applicazioni esterne. I primi due tipi di database, quelli gerarchici e reticolari, quasi appartengono ormai alla storia dell'informatica. La maggior parte dei database attualmente utilizzati appartiene alla categoria dei database relazionali. I motivi di questo successo (anche commerciale) vanno ricercati nella rigorosita' matematica e nella potenzialita' espressiva del modello relazionale su cui si basano, nella sua semplicita' di utilizzo e, ultima ma non meno importante, nella disponibilita' di un linguaggio di interrogazione standard, l'SQL, che, almeno potenzialmente, permette di sviluppare applicazioni independenti dal particolare DBMS relazionale utilizzato.

http://www.html.it/sql/sql_02.htm (2 di 3) [19/06/2001 14.22.58]

SQL: Web, Database e DBMS

I database ad oggetti sono la nuova frontiera nella ricerca sui database, infatti le loro caratteristiche di estendibilita', derivanti dalla possibilita' di definire nuovi tipi di dati e comportamenti, li rendono particolarmente appetibili per tutte quelle applicazioni che richiedono dati complessi, come ad esempio immagini, suoni o coordinate. Purtroppo la mancanza di un modello per gli oggetti universalmente accettato e la non disponibilita' di un linguaggio di interrogazione standard fanno si' che ogni produttore implementi la propria visione specifica, di solito assolutamente incompatibile con tutte le altre. Di recente sono apparsi sul mercato alcuni database, definiti object-relational, che cercano di introdurre nel modello relazionale le caratteristiche di estendibilita' proprie dei database object-oriented. Indipendentemente dal tipo di database, le funzionalita' principali che ci si deve aspettare da un DBMS sono quelle di:
q

consentire l'accesso ai dati attraverso uno schema concettuale, invece che attraverso uno schema fisico; permettere la condivisione e l'integrazione dei dati fra applicazioni differenti; controllare l'accesso concorrente ai dati;

q q

q assicurare la sicurezza e l'integrita' dei dati. Grazie a queste caratteristiche le applicazioni che vengono sviluppate possono contare su una sorgente dati sicura, affidabile e generalmente scalabile. Tali proprieta' sono auspicabili per applicazioni che usano la rete Internet come infrastruttura e che hanno quindi evidenti problemi di sicurezza e scalabilita'.

Lezione

successiva

[Sommario]

http://www.html.it/sql/sql_02.htm (3 di 3) [19/06/2001 14.22.58]

SQL: Il modello relazionale

Il modello relazionale
I database relazionali sono il tipo di database attualmente piu' diffuso. I motivi di questo successo sono fondamentalmente due: 1. forniscono sistemi semplici ed efficienti per rappresentare e manipolare i dati 2. si basano su un modello, quello relazionale, con solide basi teoriche Il modello relazionale e' stato proposto originariamente da E.F. Codd in un ormai famoso articolo del 1970. Grazie alla sua coerenza ed usabilita', il modello e' diventato negli anni '80 quello piu' utilizzato per la produzione di DBMS. La struttura fondamentale del modello relazionale e' appunto la "relazione", cioe' una tabella bidimensionale costituita da righe (tuple) e colonne (attributi). Le relazioni rappresentano le entita' che si ritiene essere interessanti nel database. Ogni istanza dell'entita' trovera' posto in una tupla della relazione, mentre gli attributi della relazione rappresenteranno le proprieta' dell'entita'. Ad esempio, se nel database si dovranno rappresentare delle persone, si potra' definire una relazione chiamata "Persone", i cui attributi descrivono le caratteristiche delle persone (Figura 2). Ciascuna tupla della relazione "Persone" rappresentera' una particolare persona.

In realta', volendo essere rigorosi, una relazione e' solo la definizione della struttura della tabella, cioe' il suo nome e l'elenco degli attributi che la compongono. Quando essa viene popolata con delle tuple, si parla di "istanza di relazione". Percio' la precedente Figura 2 rappresenta un'istanza della relazione persona. Una rappresentazione della definizione di tale relazione potrebbe essere la seguente: Persone (nome, cognome, data_nascita, sesso, stato_civile) Nel seguito si indicheranno entrambe (relazione ed istanza di relazione) con il termine "relazione", a meno che non sia chiaro dal contesto a quale accezione ci si riferisce. Le tuple in una relazione sono un insieme nel senso matematico del termine, cioe' una collezione non ordinata di elementi differenti. Per distinguere una tupla da un'altra si ricorre al concetto di "chiave primaria", cioe' ad un insieme di attributi che permettono di identificare univocamente una tupla in una relazione. Naturalmente in una relazione possono esserci piu' combinazioni di attributi che permettono di identificare univocamente una tupla ("chiavi candidate"), ma fra queste ne verra' scelta una sola da utilizzare come chiave primaria. Gli attributi della chiave primaria non possono assumere il valore null (che significa un valore non determinato), in quanto non permetterebbero piu' di identificare una particolare tupla in una relazione. Questa proprieta' delle relazioni e delle loro chiavi primarie va sotto il nome di integrita' delle entita' (entity integrity). Spesso per ottenere una chiave primaria "economica", cioe' composta da pochi attributi facilmente manipolabili, si introducono uno o piu' attributi fittizi, che conterranno dei codici identificativi univoci per ogni tupla della relazione. Ogni attributo di una relazione e' caratterizzato da un nome e da un dominio. Il dominio indica quali valori possono essere assunti da una colonna della relazione. Spesso un dominio viene definito attraverso la dichiarazione di un tipo per l'attributo (ad esempio dicendo che e' una stringa di dieci caratteri), ma e' anche possibile definire domini piu' complessi e precisi. Ad esempio per l'attributo "sesso" della nostra relazione "Persone" possiamo definire un dominio per cui gli unici valori validi sono 'M' e 'F'; oppure per l'attributo "data_nascita" potremmo definire un dominio per cui vengono considerate valide solo le date di nascita dopo il primo gennaio del 1960, se

http://www.html.it/sql/sql_03.htm (1 di 3) [19/06/2001 14.23.03]

SQL: Il modello relazionale

nel nostro database non e' previsto che ci siano persone con data di nascita antecedente a quella. Il DBMS si occupera' di controllare che negli attributi delle relazioni vengano inseriti solo i valori permessi dai loro domini. Caratteristica fondamentale dei domini di un database relazionale e' che siano "atomici", cioe' che i valori contenuti nelle colonne non possano essere separati in valori di domini piu' semplici. Piu' formalmente si dice che non e' possibile avere attributi multivalore (multivalued). Ad esempio, se una caratteristica delle persone nel nostro database fosse anche quella di avere uno o piu' figli, non sarebbe possibile scrivere la relazione Persone nel seguente modo: Persone (nome, cognome, data_nascita, sesso, stato_civile, figli) Infatti l'attributo figli e' un attributo non-atomico, sia perche' una persona puo' avere piu' di un figlio, sia perche' ogni figlio avra' varie caratteristiche che lo descrivono. Per rappresentare queste entita' in un database relazionale bisogna definire due relazioni: Persone(*numero_persona, nome, cognome, data_nascita, sesso, stato_civile) Figli(*numero_persona, *nome_cognome, eta, sesso) Nelle precedenti relazioni gli asterischi (*) indicano gli attributi che compongono le loro chiavi primarie. Si noti l'introduzione nella relazione Persone dell'attributo numero_persona, attraverso il quale si assegna a ciascuna persona un identificativo numerico univoco che viene utilizzato come chiave primaria. Queste relazioni contengono solo attributi atomici. Se una persona ha piu' di un figlio, essi saranno rappresentati in tuple differenti della relazione Figli. Le varie caratteristiche dei figli sono rappresentate dagli attributi della relazione Figli. Il legame fra le due relazioni e' costituito dagli attributi numero_persona che compaiono in entrambe le relazioni e che permettono di assegnare ciascuna tupla della relazione figli ad una particolare tupla della relazione Persone. Piu' formalmente si dice che l'attributo numero_persona della relazione Figli e' una chiave esterna (foreign key) verso la relazione Persone. Una chiave esterna e' una combinazione di attributi di una relazione che sono chiave primaria per un'altra relazione. Una caratteristica fondamentale dei valori presenti in una chiave esterna e' che, a meno che non siano null, devono corrispondere a valori esistenti nella chiave primaria della relazione a cui si riferiscono. Nel nostro esempio cio' significa che non puo' esistere nella relazione Figli una tupla con un valore dell'attributo numero_persona, senza che anche nella relazione Persone esista una tupla con lo stesso valore per la sua chiave primaria. Questa proprieta' va sotto il nome di integrita' referenziale (referential integrity) Uno dei grandi vantaggi del modello relazionale e' che esso definisce anche un algebra, chiamata appunto "algebra relazionale". Tutte le manipolazioni possibili sulle relazioni sono ottenibili grazie ala combinazione di cinque soli operatori: RESTRICT, PROJECT, TIMES, UNION e MINUS. Per comodita' sono stati anche definiti tre operatori addizionali che comunque possono essere ottenuti applicando i soli cinque operatori fondamentali: JOIN, INTERSECT e DIVIDE. Gli operatori relazionali ricevono come argomento una relazione o un insieme di relazioni e restituiscono una singola relazione come risultato. Vediamo brevemente questi otto operatori: RESTRICT: restituisce una relazione contenente un sottoinsieme delle tuple della relazione a cui viene applicato. Gli attributi rimangono gli stessi. PROJECT: restituisce una relazione con un sottoinsieme degli attributi della relazione a cui viene applicato. Le tuple della relazione risultato vengono composte dalle tuple della relazione originale in modo che continuino ad essere un insieme in senso matematico. TIME: viene applicato a due relazioni ed effettua il prodotto cartesiano delle tuple. Ogni tupla della prima relazione viene concatenata con ogni tupla della seconda. JOIN: vengono concatenate le tuple di due relazioni in base al valore di un insieme dei loro attibuti. UNION: applicando questo operatore a due relazioni compatibili, se ne ottiene una contenente le tuple di entrambe le relazioni. Due relazioni sono compatibili se hanno lo stesso numero di attributi e gli attributi corrispondenti nelle due relazioni hanno lo stesso dominio. MINUS: applicato a due relazioni compatibili, ne restituisce una terza contenente le tuple che si trovano solo nella prima relazione. INTERSECT: applicato a due relazioni compatibili, restituisce una relazione contenente le tuple che esistono in entrambe le relazioni.
http://www.html.it/sql/sql_03.htm (2 di 3) [19/06/2001 14.23.03]

SQL: Il modello relazionale

DIVIDE: applicato a due relazioni che abbiano degli attributi comuni, ne restituisce una terza contenente tutte le tuple della prima relazione che possono essere fatte corrispondere a tutti i valori della seconda relazione. Nelle seguenti tabelle, a titolo di esempio, sono raffigurati i risultati dell'applicazione di alcuni operatori relazionali alle relazioni Persone e Figli. Come nomi per le relazioni risultato si sono utilizzate le espressioni che le producono. Persone numero_persona 2 1 3 nome Mario Giuseppe cognome data_nascita sesso stato_civile Rossi Russo 29/03/1965 15/11/1972 M M F Coniugato Celibe Nubile

Alessandra Mondella 13/06/1970

Figli numero_persona nome_cognome eta sesso

2
2

Maria Rossi Gianni Rossi

3 5

F M

RESTRICT (Persone) sesso='M' numero_persona 2 1 nome Mario Giuseppe cognome data_nascita sesso stato_civile Rossi 29/03/1965 M Coniugato Russo 15/11/1972 M Celibe

PROJECT sesso (Persone) sesso M F RESTRICT (Persone) sesso='M' n. nome cognome nascita sesso stato_civile M M nome eta' sesso F M Mario Rossi cognome 29/03/1965 Mario Rossi cognome 29/03/1965 Coniugato Maria Rossi 3 Coniugato Gianni Rossi 5

I database relazionali compiono tutte le operazioni sulle tabelle utilizzando l'algebra relazionale, anche se normalmente non permettono all'utente di utilizzarla. L'utente interagisce con il database attraverso un'interfaccia differente, il linguaggio SQL, un linguaggio dichiarativo che permette di descrivere insiemi di dati. Le istruzioni SQL vengono scomposte dal DBMS in una serie di operazioni relazionali.

Lezione

successiva

[Sommario]

http://www.html.it/sql/sql_03.htm (3 di 3) [19/06/2001 14.23.03]

SQL: Breve storia di SQL

Breve storia di SQL


La storia di SQL (che si pronuncia facendo lo spelling inglese delle lettere che lo compongono, e quindi "ess-chiu-el" e non "siquel" come si sente spesso) inizia nel 1974 con la definizione da parte di Donald Chamberlin e di altre persone che lavoravano presso i laboratori di ricerca dell'IBM di un linguaggio per la specificazione delle caratteristiche dei database che adottavano il modello relazionale. Questo linguaggio si chiamava SEQUEL (Structured English Query Language) e venne implementato in un prototipo chiamato SEQUEL-XRM fra il 1974 e il 1975. Le sperimentazioni con tale prototipo portarono fra il 1976 ed il 1977 ad una revisione del linguaggio (SEQUEL/2), che in seguito cambio' nome per motivi legali, diventando SQL. Il prototipo (System R) basato su questo linguaggio venne adottato ed utilizzato internamente da IBM e da alcuni sui clienti scelti. Grazie al successo di questo sistema, che non era ancora commercializzato, anche altre compagnie iniziarono a sviluppare i loro prodotti relazionali basati su SQL. A partire dal 1981 IBM comincio' a rilasciare i suoi prodotti relazionali e nel 1983 comincio' a vendere DB2. Nel corso degli anni ottanta numerose compagnie (ad esempio Oracle e Sybase, solo per citarne alcuni) commercializzarono prodotti basati su SQL, che divenne lo standard industriale di fatto per quanto riguarda i database relazionali. Nel 1986 l'ANSI adotto' SQL (sostanzialmente adotto' il dialetto SQL di IBM) come standard per i linguaggi relazionali e nel 1987 esso divento' anche standard ISO. Questa versione dello standard va sotto il nome di SQL/86. Negli anni successivi esso ha subito varie revisioni che hanno portato prima alla versione SQL/89 e successivamente alla attuale SQL/92. Il fatto di avere uno standard definito per un linguaggio per database relazionali, apre potenzialmente la strada alla intercomunicabilita' fra tutti i prodotti che si basano su di esso. Dal punto di vista pratico purtroppo le cose andarono differentemente. Infatti in generale ogni produttore adotta ed implementa nel proprio database solo il cuore del linguaggio SQL (il cosiddetto Entry level o al massimo l'Intermediate level), estendendolo in maniera proprietaria a seconda della propria visione del mondo dei database. Attualmente e' in corso un processo di revisione del linguaggio da parte dei comitati ANSI e ISO, che dovrebbe portare alla definizione di cio' che al momento e' noto come SQL3. Le caratteristiche principali di questa nuova incarnazione di SQL dovrebbero essere la sua trasformazione in un linguaggio stand-alone (mentre ora viene usato come linguaggio ospitato in altri linguaggi) e l'introduzione di nuovi tipi di dato piu' complessi per permettere, ad esempio, il trattamento di dati multimediali.

Lezione

successiva

[Sommario]

http://www.html.it/sql/sql_04.htm [19/06/2001 14.23.07]

SQL: Un database di esempio

Un database di esempio
Sara' ora presentata la struttura del database che verra' utilizzato per gli esempi delle successive lezioni. Non verranno descritte le fasi di analisi e i modelli concettuali e logici che sono stati necessari per giungere a tale struttura, dal momento che cio' andrebbe al di fuori degli scopi di questo corso. La struttura del database e' quella rappresentata nel diagramma relazionale di Figura 3. Ogni rettangolo rappresenta una relazione. Il nome della relazione e' contenuto nella sezione piu' scura nella parte alta del rettangolo. Il resto del rettangolo e' suddiviso in tre colonne, nelle quali sono definite le caratteristiche degli attributi che compongono la relazione. La colonna centrale contiene i nomi degli attributi, quella di destra il loro tipo (sono stati utilizzati i tipi dell'SQL/92) e quella di sinistra le loro proprieta'. Le proprieta' degli attributi sono indicate con le sigle "PK" e "FK", le quali significano rispettivamente che i corrispondenti attributi fanno parte della chiave primaria della relazione (Primary Key) o di una chiave esterna (Foreign Key). Le frecce congiungono appunto le chiavi esterne con le chiavi primarie a cui si riferiscono. I nomi degli attributi in neretto indicano che tali attributi non possono assumere il valore NULL, cioe' non possono essere indeterminati.

Clicca sulla foto per ingrandirla Lo scopo del database e' quello di contenere le informazioni bibliografiche di un insieme di pubblicazioni in modo da poterle consultare facilmente ed utilizzare per la costruzione di bibliografie anche estese. Esso e' stato modellato sulla falsa riga del sistema bibliografico del programma LaTeX, in modo da avere un ambiente ben consolidato a cui far riferimento e facilitare la realizzazione di programmi di conversione fra un sistema e l'altro. Il significato delle relazioni che compongono il database e' il seguente: Publication: Una generica pubblicazione. Normalmente questa relazione viene utilizzata solamente per assegnare un identificativo univoco a tutte le pubblicazioni presenti nel database, lasciando la specificazione delle altre caratteristiche in relazioni specifiche per ogni tipo di pubblicazione. Inoltre viene usata per implementare legami complessi fra le pubblicazioni e altre relazioni. Ad esempio quella fra una pubblicazione ed i suoi autori. Grazie alla struttura adottata si possono avere pubblicazioni scritte da piu' autori ed autori che scrivono piu' tipi di pubblicazioni. Author: Rappresenta l'autore di una pubblicazione. La chiave primaria e' composta dall'identificativo della pubblicazione e da quello della persona; cio' garantisce l'unicita' dell'associazione fra le due entita'. Editor: Rappresenta il curatore di una pubblicazione. La struttura e' identica a quella della tabella Author. Person: Rappresenta una persona (ad esempio un autore) nel database. Attualmente le informazioni ritenute interessanti sono solo il cognome e il nome. Publisher: La casa editrice di una pubblicazione. Institution: L'istituzione (ad esempio un universita' o una software house) responsabile di una pubblicazione.

http://www.html.it/sql/sql_05.htm (1 di 2) [19/06/2001 14.23.11]

SQL: Un database di esempio

Book: Un libro con una precisa casa editrice. InBook: Una parte di un libro. La parte puo' essere caratterizzata da un titolo, dal numero di capitolo o dal numero di pagina. Le informazioni riguardanti il libro ,e quindi comuni alle sue varie parti, vengono memorizzate nella relazione Book. Proceedings: Gli atti di un congresso o di una conferenza. InProceedings: Una parte degli atti di un congresso. Le informazioni riguardanti la pubblicazione che contiene la parte sono contenute nella relazione Proceedings. Article: Un articolo pubblicato in un giornale o in una rivista. Manual: Una pubblicazione di documentazione tecnica. Techreport: Un rapporto tecnico pubblicato da una scuola o da un'altra istituzione. Thesis: Una tesi di laurea o di dottorato. Misc: Una pubblicazione che non rientra in nessuna delle precedenti categorie. Non spieghero' il significato degli attributi che compongono le varie relazioni, dal momento che i loro nomi sono sufficientemente autoesplicativi. Un'unica annotazione sull'attributo "pub_month": esso e' stato definito di tipo CHAR(3), cioe' una stringa della lunghezza fissa di tre caratteri, e conterra' le abbreviazioni dei nomi dei mesi (le prime tre lettere dei nomi inglesi). I legami fra le relazioni dovrebbero essere abbastanza semplici da capire. Come esempio per tutti verra' spiegata quello che collega la relazione Book con la relazione Publisher. Tale legame serve per descrivere la casa editrice di un libro. Nella relazione Book non sono presenti tutti i dati della casa editrice, ma solo un identificativo numerico per essa. Il numero sara' la chiave primaria della relazione Publisher e come tale permettera' di identificare una ben precisa casa editrice. Nella relazione Book l'attributo publisher e' una chiave esterna verso la relazione Publisher. Una situazione piu' complessa e' quella che coinvolge le relazioni Publication, Author e Person; infatti in Author sono presenti due chiavi esterne: una che identifica la pubblicazione a cui l'istanza di relazione si riferisce, e una che permette di risalire ai dati della persona che svolge il ruolo di autore. Ci si potrebbe chiedere quale sia l'utilita' della relazione Publication e perche' non si sia invece stabilito direttamente un legame fra la relazione Author e le relazioni che rappresentano i particolari tipi di pubblicazione. La risposta e' che il modello relazionale non permette di farlo. Infatti dal momento che un autore puo' scrivere piu' tipi di pubblicazioni l'attributo pubblicationID avrebbe dovuto essere una chiave esterna verso tutte le relazioni delle pubblicazioni, ma questo non e' permesso dal momento che contraddice la definizione stessa di chiave esterna. Nelle successive lezioni si implementera' il database di esempio utilizzando il linguaggio SQL standard. Lo specifico DBMS utilizzato sara' PostgresSQL, ma sara' possibile sostituirlo con qualunque DBMS che supporti l'Entry level dell'SQL/92.

Lezione

successiva

[Sommario]

http://www.html.it/sql/sql_05.htm (2 di 2) [19/06/2001 14.23.11]

http://www.html.it/sql/figura3.gif

http://www.html.it/sql/figura3.gif [19/06/2001 14.23.22]

SQL: Strumenti per interagire con un DBMS

Interagire con un DBMS


Come si e' detto, l'interazione con un database relazionale avviene normalmente utilizzando istruzioni SQL. L'invio delle istruzioni al DBMS puo' avvenire in due modi:
q

invocazione interattiva

q invocazione tramite un programma applicativo Nel primo caso viene utilizzato un programma il cui scopo e' quello di ricevere in input le istruzioni SQL, trasmetterle al DBMS e visualizzare i risultati all'utente. Normalmente tutti i DBMS mettono a disposizione un programma, di solito di tipo testuale, con tali funzionalita'. Nel caso di PostgreSQL, il DBMS che utilizzero' per implementare il database di esempio, il programma si chiama "psql". La sintassi da utilizzare per invocarlo in modalita' interattiva e' la seguente:

psql [ dbname [ user ] ] "dbname" e' il nome del database a cui si vuole accedere, mentre "user" e' il nome dell'utente con cui si vuole accedere al database. Ad esempio, il comando: psql mydb benfante attiva il programma psql, accedendo al database mydb come utente benfante. Se tutto e' andato bene, in particolare se il database esiste e l'utente ha i permessi necessari per accedervi, psql mostra un prompt simile al seguente: mydb=> A questo punto si possono digitare i comandi SQL (terminandoli con un ";" o con il meta-comando "\g" (go) per farli eseguire) e leggere sullo schermo i risultati che producono. Normalmente i programmi come psql possono essere utilizzati anche in maniera non-interattiva. Ad esempio, invocando psql col seguente comando: psql -f istruzioni.sql mydb benfante il programma esegue le istruzioni SQL contenute nel file istruzioni.sql e termina immediatamente dopo. In questo modo e' possibile automatizzare operazioni che devono essere ripetute di frequente o, comunque, che sono composte da lunghe sequenze di comandi SQL, senza doverle digitare manualmente ogni volta. Nel caso dell'invocazione delle istruzioni SQL tramite un programma applicativo, esse sono eseguite nel corso dell'esecuzione di tale programma ed i risultati vengono utilizzati dal programma per produrre il suo output. In questa situazione l'utente non sottopone direttamente i comandi SQL e potrebbe anche non essere a conoscenza che il programma che sta utilizzando accede ad un database relazionale: l'unica cosa che vede e' l'interfaccia che l'applicazione gli mette a disposizione. Abbiamo sostanzialmente due sistemi per scrivere applicazioni di questo tipo:
q

utilizzare una libreria che gestisca la comunicazione con il DBMS, trasmetta le istruzioni SQL e ci permetta di manipolare i risultati prodotti. Librerie di questo tipo sono ad esempio JDBC e ODBC. Spesso i produttori dei DBMS forniscono delle librerie proprietarie, che sono specifiche per il loro prodotto. Ad esempio, nel caso di PostgreSQL la libreria per il linguaggio C si chiama "libpq". Spesso si cerca di non utilizzare librerie proprietarie perche' le applicazioni risultano molto specifiche (funzionano solo con il database per cui la libreria e' stata costruita). Invece utilizzando librerie "standard" come JDBC o ODBC le applicazioni funzioneranno con qualunque DBMS che esponga l'interfaccia richiesta dalla libreria (a meno di non utilizzare funzionalita' specifiche del

http://www.html.it/sql/sql_06.htm (1 di 2) [19/06/2001 14.23.33]

SQL: Strumenti per interagire con un DBMS

DBMS).
q

utilizzare l'Embedded SQL (ESQL). In questo caso il codice SQL viene inglobato nel codice di un linguaggio ospite e vengono utilizzati i normali meccanismi del linguaggio per il passaggio dei parametri e l'utilizzo dei risultati. Normalmente il codice cosi' prodotto viene prima convertito da un pre-processore e in seguito compilato dal compilatore del linguaggio ospite. Un ulteriore vantaggio nell'utilizzare l'ESQL risiede nel fatto che esiste uno standard ANSI che descrive come esso dovrebbe funzionare. In questo modo e' possibile che un programma scritto per un determinato DBMS possa essere ricompilato e funzionare anche per un altro. PostgreSQL mette a disposizione un pre-processore ESQL per il linguaggio C (ecpg).

Nelle successive lezioni utilizzeremo psql per inviare le istruzioni SQL che implementeranno, popoleranno e interrogheranno il database d'esempio. Nell'ultima lezione verra' invece presentata un'applet Java che utilizzera' la libreria JDBC per consultare il database bibliografico.

Lezione

successiva

[Sommario]

http://www.html.it/sql/sql_06.htm (2 di 2) [19/06/2001 14.23.33]

SQL: Creare il database

Creare il database
Un database in un sistema relazionale e' composto da un'insieme di tabelle, che corrispondono alle relazioni del modello relazionale. Nella terminologia usata nell'SQL non si fa accenno alle relazioni, cosi' come non viene usato il termine attributo, ma viene usata la parola colonna, e non si parla di tupla, ma di riga. Nel seguito verranno usate indifferentemente le due terminologie, quindi tabella varra' per relazione, colonna per attributo, riga per tupla, e viceversa. In pratica la creazione del database consiste nella creazione delle tabelle che lo compongono. In realta' prima di poter procedere alla creazione delle tabelle normalmente occorre creare in effetti il database, il che di solito significa definire uno sp azio dei nomi separato per ogni insieme di tabelle. In questo modo per un DBMS e' possibile gestire piu' database indipendenti contemporaneamente, senza che ci siano dei conflitti con i nomi che vengono utilizzati in ciascuno di essi. Il sistema previsto dallo standard per creare degli spazi dei nomi separati consiste nell'utilizzo dell'istruzione SQL "CREATE SCHEMA". Di solito tale sistema non viene utilizzato (o almeno non con gli scopi ed il significato previsti dallo standard), ma ogni DBMS prevede una procedura proprietaria per creare un database. Normalmente viene esteso il linguaggio SQL introducendo un'istruzione non prevista nello standard: "CREATE DATABASE". La sintassi utilizzata da PostgreSQL, ma anche dai piu' diffusi DBMS, e' la seguente: CREATE DATABASE nome_database Con PostgreSQL e' anche disponibile un comando invocabile dalla shell Unix (o dalla shell del sistema utilizzato) che esegue la stessa operazione: createdb nome_database Per creare il nostro database bibliografico utilizzeremo quindi il comando: createdb biblio Una volta creato il database e' possibile creare le tabelle che lo compogono. L'istruzione SQL preposta a questo scopo e': CREATE TABLE nome_tabella ( nome_colonna tipo_colonna [ clausola_default ] [ vincoli_di_colonna ] [ , nome_colonna tipo_colonna [ clausola_default ] [ vincoli_di_colonna ] ... ] [ , [ vincolo_di tabella] ... ] ) nome_colonna: e' il nome della colonna che compone la tabella. Sarebbe meglio non esagerare con la lunghezza degli identificatori di colonna, dal momento che l'SQL Entry Level prevede nomi non piu' lunghi di 18 caratteri. Si consulti comunque la documentazione dello specifico database. I nomi devono iniziare con un carattere alfabetico. tipo_colonna: e' l'indicazione del tipo di dato che la colonna potra' contenere. I principali tipi previsti dallo standard SQL sono:
q

CHARACTER(n) Una stringa a lunghezza fissa di esattamente n caratteri. CHARACTER puo' essere abbreviato con CHAR CHARACTER VARYING(n) Una stringa a lunghezza variabile di al massimo n caratteri. CHARACTER VARYING puo' essere abbreviato con VARCHAR o CHAR VARYING. INTEGER Un numero intero con segno. Puo' essere abbreviato con INT. La precisione,

http://www.html.it/sql/sql_07.htm (1 di 4) [19/06/2001 14.23.37]

SQL: Creare il database

cioe' la grandezza del numero intero che puo' essere memorizzato in una colonna di questo tipo, dipende dall'implementazione del particolare DBMS.
q

SMALLINT Un numero intero con segno con precisione non superiore a INTEGER. FLOAT(p) Un numero a virgola mobile, con precisione p. Il valore massimo di p dipende dall'implementazione del DBMS. E' possibile usare FLOAT senza indicazione della precisione, utilizzando quindi la precisione di default, anch'essa dipendente dall'implementazione. REAL e DOUBLE PRECISION sono dei sinonimi per un FLOAT con una particolare precisione. Anche in questo caso le precisioni dipendono dall'implementazione, con il vincolo che la precisione del primo non sia superiore a quella del secondo. DECIMAL(p,q) Un numero a virgola fissa di almeno p cifre e segno, con q cifre dopo la virgola. DEC e' un'abbreviazione per DECIMAL. DECIMAL(p) e' un'abbreviazione per DECIMAL(p,0). Il valore massimo di p dipende dall'implementazione. INTERVAL Un periodo di tempo (anni, mesi, giorni, ore, minuti, secondi e frazioni di secondo). DATE, TIME e TIMESTAMP Un preciso istante temporale. DATE permette di indicare l'anno, il mese e il giorno. Con TIME si possono specificare l'ora, i minuti e i secondi. TIMESTAMP e' la combinazione dei due precedenti. I secondi sono un numero con la virgola, permettendo cosi' di specificare anche frazioni di secondo.

clausola_default: indica il valore di default che assumera' la colonna se non gliene viene assegnato uno esplicitamente nel momento della creazione della riga. La sintassi da utilizzare e' la seguente: DEFAULT { valore | NULL } dove, valore e' un valore valido per il tipo con cui la colonna e' stata definita. vincoli_di_colonna: sono vincoli di integrita' che vengono applicati al singolo attributo. Sono:
q q q

NOT NULL, che indica che la colonna non puo' assumere il valore NULL. PRIMARY KEY, che indica che la colonna e' la chiave primaria della tabella. una definizione di riferimento, con cui si indica che la colonna e' una chiave esterna verso la tabella e i campi indicati nella definizione. La sintasi e' la seguente: REFERENCES nome_tabella [ ( colonna1 [ , colonna2 ... ] ) ] [ ON DELETE { CASCADE | SET DEFAULT | SET NULL } ] [ ON UPDATE { CASCADE | SET DEFAULT | SET NULL } ] Le clausole ON DELETE e ON UPDATE indicano quale azione deve essere compiuta nel caso in cui una tupla nella tabella referenziata venga eliminata o aggiornata. Infatti in tali casi nella colonna referenziante (che e' quella che si sta definendo) potrebbero esserci dei valori inconsistenti. Le azioni possono essere:
r

CASCADE: eliminare la tupla contenente la colonna referenziante (nel caso di ON DELETE) o aggiornare anche la colonna referenziante (nel caso di ON UPDATE). SET DEFAULT: assegnare alla colonna referenziante il suo valore di default. SET NULL: assegnare alla colonna referenziante il valore NULL.

un controllo di valore, con il quale si permette o meno l'assegnazione di un valore alla colonna, in base al risultato di un espressione. La sintassi da usare e':

http://www.html.it/sql/sql_07.htm (2 di 4) [19/06/2001 14.23.37]

SQL: Creare il database

CHECK (espressione_condizionale) dove espressione_condizionale e' un'espressione che restituisce vero o falso. Ad esempio, se stiamo definendo la colonna COLONNA1, definendo il seguente controllo: CHECK ( COLONNA1 < 1000 ) in tale colonna potranno essere inseriti solo valori inferiori a 1000. vincolo_di_tabella: sono vincoli di integrita' che possono riferirsi a piu' colonne della tabella. Sono:
q

la definizione della chiave primaria: PRIMARY KEY ( colonna1 [ , colonna2 ... ] ) Si noti che in questo caso, a differenza della definizione della chiave primaria come vincolo di colonna, essa puo' essere formata da piu' di un attributo.

le definizioni delle chiavi esterne: FOREIGN KEY ( colonna1 [ , colonna2 ... ] ) definizione_di_riferimento La definizione_di_riferimento ha la stessa sintassi e significato di quella che puo' comparire come vincolo di colonna.

un controllo di valore, con la stessa sintassi e significato di quello che puo' essere usato come vincolo di colonna.

Per chiarire meglio l'utilizzo dell'istruzione CREATE TABLE, esaminiamo alcuni comandi che implementano il database bibliografico di esempio. CREATE TABLE Publication ( ID INTEGER PRIMARY KEY, type CHAR(18) NOT NULL ); La precedente istruzione crea la tabella Publication, formata dalle due colonne ID di tipo INTEGER, e type di tipo CHAR(18). ID e' la chiave primaria della relazione. Sull'attributo type e' posto un vincolo di non nullita'. CREATE TABLE Book ( ID INTEGER PRIMARY KEY REFERENCES Publication(ID), title VARCHAR(160) NOT NULL, publisher INTEGER NOT NULL REFERENCES Publisher(ID), volume VARCHAR(16), series VARCHAR(160), edition VARCHAR(16), pub_month CHAR(3), pub_year INTEGER NOT NULL, note VARCHAR(255) ); Crea la relazione Book, formata da nove attributi. La chiave primaria e' l'attributo ID, che e' anche una chiave esterna verso la relazione Publication. Sugli attributi title, publisher e pub_year sono posti dei vincoli di non nullita'. Inoltre l'attributo publisher e' una chiave esterna verso la tabella Publisher. CREATE TABLE Author ( publicationID INTEGER REFERENCES Publication(ID), personID INTEGER REFERENCES Person(ID), PRIMARY KEY (publicationID, personID) ); Crea la relazione Author, composta da due attributi: publicationID e personID. La chiave primaria in questo caso e' formata dalla combinazione dei due attributi, come indicato dal vincolo di tabella PRIMARY KEY. PublicationID e' una chiave esterna verso la relazione Publication, mentre personID lo e' verso la relazione Person. Il file create_biblio.sql contiene tutti i comandi necessari per creare la struttura del

http://www.html.it/sql/sql_07.htm (3 di 4) [19/06/2001 14.23.37]

SQL: Creare il database

database bibliografico di esempio. NOTA SU POSTGRESQL In PotgreSQL, almeno fino alla versione 6.5.1, non sono ancora stati implementati i vincoli sulle chiavi esterne. Il parser comunque accetta le sintassi SQL che li riguardano, quindi i costrutti FOREIGN KEY e REFERENCES non producono un errore, ma solo un warning.

Lezione

successiva

[Sommario]

http://www.html.it/sql/sql_07.htm (4 di 4) [19/06/2001 14.23.37]

SQL: Popolare il database

Popolare il database
Col termine "popolazione del database" si intende l'attivita' di inserimento dei dati al suo interno. In un database relazionale cio' corrisponde alla creazione delle righe che compongono le tabelle che costituiscono il database. Normalmente la memorizzazione di una singola informazione corrisponde all'inserimento di una o piu' righe in una o piu' tabelle del database. Si prenda, ad esempio, la seguente informazione bibliografica: M. Agosti, L. Benfante, M. Melucci. OFAHIR: "On-the-Fly" Automatic Authoring of Hypertexts for Information Retrieval. In S. Spaccapietra, F. Maryansky (Eds), Searching for Semantics: Data Mining, Reverse Engineering. Proc. of the 7th IFIP 2.6 Working Conference on Database Semantics (DS-7), Leysin, Switzerland, October 1997, 129-154. Supponendo che nel database non sia gia' presente nessuna delle informazioni che la riguardano (come ad esempio qualcuno degli autori o gli atti del congresso a cui si riferisce), il suo inserimento nel nostro database d'esempio corrisponde all'inserimento delle seguenti righe:
q

cinque righe nella tabella Person corrispondendi a ciascuno degli autori e dei curatori; una riga nella tabella Institution;

due righe nella tabella Publication: una per gli atti del congresso e una per l'articolo contenuto in quegli atti; una riga nella tabella Proceedings; una riga nella tabella InProceedings; tre righe nella tabella Author, una per ciascun autore della pubblicazione. due righe nella tabella Editor, una per ciascun curatore della pubblicazione.

L'ordine delle precedenti operazioni non e' puramente casuale, infatti l'inserimento delle righe deve essere fatto in modo da rispettare i vincoli imposti sulle tabelle. Ad esempio, dato che non potra' esistere una chiave esterna senza che sia stata prima inserita la riga a cui essa si riferisce, prima di poter inserire una riga nella tabella InProceedings dovra' essere stata inserita la corrispondente riga nella tabella Proceedings. Nel caso in cui un vincolo venga violato, il DBMS impedira' l'operazione di inserimento facendola fallire. Si veda la lezione precedente (Creare il database) per la descrizione dei vincoli che possono essere imposti su una tabella e sulle sue colonne. L'istruzione SQL che effettua l'inserimento di una nuova riga in una tabella e' INSERT. La sintassi con cui essa viene usata piu' comunemente e': INSERT INTO nome_tabella [ ( elenco_campi ) ] VALUES ( elenco_valori ) nome_tabella e' il nome della tabella in cui deve essere inserita la nuova riga. elenco_campi e' l'elenco dei nomi dei campi a cui deve essere assegnato un valore, separati fra loro da una virgola. I campi non compresi nell'elenco assumeranno il loro valore di default o NULL se non hanno un valore di default. E' un errore non inserire nell'elenco un campo che non abbia un valore di default e non possa assumere il valore NULL. Nel caso in cui l'elenco non venga specificato dovranno essere

http://www.html.it/sql/sql_08.htm (1 di 2) [19/06/2001 14.23.42]

SQL: Popolare il database

specificati i valori di tutti i campi della tabella. elenco_valori e' l'elenco dei valori che verranno assegnati ai campi della tabella, nell'ordine e numero specificati dall'elenco_campi o in quello della definizione della tabella (se elenco_campi non viene specificato). I valori possono essere un'espressione scalare del tipo appropriato per il campo o le keyword DEFAULT o NULL, se il campo prevede un valore di default o ammette il valore NULL. Il precedente esempio di inserimento viene quindi eseguito tramite le seguenti istruzioni SQL: INSERT INTO Person VALUES ( 1, 'Agosti', 'Maristella' ); INSERT INTO Person VALUES ( 2, 'Benfante', 'Lucio' ); INSERT INTO Person VALUES ( 3, 'Melucci', 'Massimo' ); INSERT INTO Person VALUES ( 4, 'Spaccapietra', 'S.' ); INSERT INTO Person VALUES ( 5, 'Maryansky', 'F.' ); INSERT INTO Institution ( ID, name, city, country ) VALUES ( 1, '7th IFIP 2.6 Working Conference on Database Semantics (DS-7)', 'Leysin', 'Switzerland' ); INSERT INTO Publication VALUES ( 1, 'Proceedings' ); INSERT INTO Publication VALUES ( 2, 'InProceedings' ); INSERT INTO Proceedings ( ID, title, organization, pub_month, pub_year ) VALUES ( 1, 'Searching for Semantics: Data Mining, Reverse Engineering', 1, 'Oct', 1997 ); INSERT INTO InProceedings ( ID, proceedingsID, title, pages ) VALUES ( 2, 1, 'OFAHIR: "On-the-Fly" Automatic Authoring of Hypertexts for Information Retrieval', '129-154' ); INSERT INTO Author VALUES ( 2, 1 ); INSERT INTO Author VALUES ( 2, 2 ); INSERT INTO Author VALUES ( 2, 3 ); INSERT INTO Editor VALUES ( 1, 4 ); INSERT INTO Editor VALUES ( 1, 5 ); Un'altra forma abbastanza utilizzata dell'istruzione INSERT segue la seguente sintassi: INSERT INTO nome_tabella [ ( elenco_campi ) ] istruzione_select L'unica differenza con la precedente sintassi consiste nella sostituzione della clausola VALUES con un istruzione SELECT. L'istruzione SELECT verra' esaminata in dettaglio nella successiva lezione (Interrogare il database). Per il momento ci basti sapere che SELECT permette di estrarre dalle tabelle del database dei dati che vengono organizzati in una nuova relazione. La precedente istruzione INSERT permette quindi di inserire nella tabella e nei campi specificati dati provenienti da altre tabelle. Ovviamente, affinche' l'istruzione venga eseguita con successo, i dati prodotti dall'istruzione SELECT dovranno essere compatibili con i vincoli ed i domini dei campi della tabella in cui si sta effettuando l'inserimento. Nel file popolate_biblio.sql sono presenti le istruzioni SQL che popolano il database bibliografico con i dati che verranno utilizzati negli esempi delle successive lezioni.

Lezione

successiva

[Sommario]

http://www.html.it/sql/sql_08.htm (2 di 2) [19/06/2001 14.23.42]

SQL: Interrogare il database

Interrogare il database
Nella precedente lezione si sono esaminati i costrutti che il linguaggio SQL mette a disposizione per inserire i dati in un database relazionale. Vedremo ora invece le istruzioni che occorrono per estrarre da esso i dati che interessano. L'istruzione SQL preposta a tale scopo e' SELECT. Dal momento che l'interrogazione e' forse la funzionalita' piu' usata di un database, le opzioni che l'istruzione SELECT sono numerose e a volte piuttosto complicate. Per questo motivo esse verranno descritte in maniera semplificata, utilizzando invece degli esempi per la presentazione delle caratteristiche piu' complesse, in particolare quelle che riguardano la specificazione delle espressioni condizionali. La sintassi con cui l'istruzione SELECT deve essere utilizzata e' la seguente: SELECT [ ALL | DISTINCT ] lista_elementi_selezione FROM lista_riferimenti_tabella [ WHERE espressione_condizionale ] [ GROUP BY lista_colonne ] [ HAVING espressione_condizionale ] [ ORDER BY lista_colonne ] L'istruzione SELECT produce una tabella ottenuta applicando il seguente procedimento (per lo meno dal punto di vista logico, ogni DBMS ottimizza l'esecuzione delle interrogazioni secondo le proprie strategie):
q

produce una tabella ottenuta come prodotto cartesiano delle tabelle specificate nella clausola FROM. Ogni elemento della lista_riferimenti_tabella segue la seguente sintassi: riferimento_tabella [ [ AS ] alias_tabella ] Il riferimento puo' essere il nome di una tabella o un' espressione (posta fra parentesi tonde) il cui risultato e' una tabella, quindi, ad esempio, anche un'altra SELECT. L'alias e' un nome che serve per indicare in breve un riferimento di tabella. Nel caso in cui il riferimento di tabella sia un espressione, e' obbligatorio specificare un alias.

dalla tabella precedente elimina tutte le righe che non soddisfano l'espressione condizionale (cioe' le righe per cui l'espressione condizionale restituisce falso come risultato) della clausola WHERE. (se e' presente la clausola GROUP BY) le righe della tabella risultante dal passo 2 vengono raggruppate secondo i valori presenti nelle colonne specificate nella clausola GROUP BY. Righe con valori uguali vengono accorpate in un'unica riga. Le colonne non comprese nella clausola devono contenere delle espressioni con funzioni di aggregazione (come ad esempio AVG, che calcola la media) che quindi vengono calcolate producendo un singolo valore per ogni gruppo. (se e' presente la clausola HAVING) dal risultato del punto 3 vengono eliminate le righe che non soddisfano l'espressione condizionale della clausola HAVING. Vengono calcolate le colonne presenti nella clausola SELECT (quelle nella lista_elementi_selezione). In particolare vengono calcolate le colonne con le funzioni di aggregazione derivanti dal raggruppamento avvenuto al punto 3. Ogni elemento della lista_elementi_selezione segue la seguente sintassi: espressione_scalare [ [ AS ] alias_colonna ] Un espressione scalare e' un'espressione che produce come risultato un valore scalare. I tipi di dato scalari del liguaggio SQL sono principalmente quelli descritti nella lezione 6 (Creare il database), esclusi INTERVAL, DATE, TIME e TIMESTAMP.

http://www.html.it/sql/sql_09.htm (1 di 4) [19/06/2001 14.23.49]

SQL: Interrogare il database

Le espressioni scalari degli elementi della SELECT normalmente coinvolgono le colonne della tabella risultante dal punto 4. Nel caso in cui siano presenti delle ambiguita' a causa di colonne con nomi uguali in due o piu' tabelle comprese nella clausola FOR, esse possono essere risolte prefissando il nome o l'alias della colonna con il nome o l'alias della tabella, separati da un punto. Ad esempio, T.C indica la colonna C della tabella T. L'alias di colonna e' il nome che viene assegnato alla colonna. L'intero elenco delle colonne di una tabella puo' essere specificato utilizzando il carattere '*'.
q

(se e' presente l'opzione DISTINCT) vengono eliminate le righe che risultano duplicate. Nel caso non sia presente ne' ALL ne' DISTINCT, viene assunto ALL. (se e' presente la clausola ORDER BY) le righe della tabella vengono ordinate secondo i valori presenti nelle colonne specificate nella clausola. La sintassi da utilizzare e' la seguente: ORDER BY nome_colonna [ ASC | DESC ] [ , nome_colonna [ ASC | DESC ] ... ]

L'ordinamento di default e' quello ascendente. Nel caso si desideri effettuare quello decrescente bisogna specificare l'opzione DESC. Se non viene specificata la clausola ORDER BY, la tabella e' da considerarsi senza un particolare ordinamento, infatti per la definizione di relazione del modello relazionale, le righe della tabella formano un insieme nel senso matematico e per gli elementi di un insieme non e' definita nessuna proprieta' di ordinamento. Nella pratica, invece, l'ordine che si ottiene non specificando la clausola di ordinamento e' quasi sempre quello che rispecchia la loro memorizzazione fisica e quindi, di solito, quello secondo cui le righe sono state inserite nella tabella. La sequenza di operazioni appena presentata deve essere considerata valida solo dal punto di vista concettuale. Infatti non e' detto che esse vengano eseguite esattamente in questo modo e in questo ordine, dal momento che ogni DBMS ottimizzera' le interrogazioni secondo le strategie piu' opportune. Verranno ora esaminati alcuni esempi dell'istruzione SELECT. Si suppone che i dati presenti nel database di esempio siano solo quelli inseriti mediante il file [popolate_biblio.sql] presentato nella lezione 7 (Popolare il database). In caso contrario le interrogazioni forniranno risultati differenti. ESEMPIO 1 SELECT surname FROM Person ORDER BY surname Estrae dalla tabella Person i cognomi e li ordina alfabeticamente. Nel nostro caso, il risultato e' il seguente: surname -------------------------------Agosti Batini Bayer Benfante Carey Cochowsky DeWitt Kim Knuth Lenzerini Maryansky McCreight McGill Melucci Richardson Salton Santucci Shekita Spaccapietra de Petra Si noti l'errato ordinamento dell'ultima riga, dovuto al fatto che si e' usato il carattere ASCII minuscolo. La precedente query restituirebbe righe duplicate nel caso in cui nella tabella fossero
http://www.html.it/sql/sql_09.htm (2 di 4) [19/06/2001 14.23.49]

SQL: Interrogare il database

presenti persone con lo stesso cognome. Per evitare cio' occorre specificare l'opzione DISTINCT: SELECT DISTINCT surname FROM Person ORDER BY surname ESEMPIO 2 SELECT * FROM Person WHERE surname LIKE 'B%'

Produce una tabella avente tutte le colonne della tabella Person. Le righe vengono filtrate in modo che siano presenti solo quelle che hanno il cognome che inizia con il carattere 'B'. L'operatore LIKE permette un confronto fra stringhe di caratteri utilizzando dei pattern costruiti con i caratteri '%' e '_'. Il primo sostituisce un numero imprecisato di caratteri (anche 0), mentre il secondo ne sotituisce uno solo. ESEMPIO 3 SELECT PUB.*, PER.surname AS S, PER.given_names FROM Publication PUB, Author AUT, Person PER WHERE PUB.ID = AUT.publicationID AND AUT.personID = PER.ID AND PUB.type = 'Book' ORDER BY S

In questo caso la tabella risultante contiene tutte le colonne della tabella Publication (indicata con l'alias PUB definito nella clausola FROM) e le colonne surname e given_names della tabella Person. La clausola FROM genera il prodotto cartesiano delle tabelle Publication, Author e Person, di cui vengono selezionate solo le righe in cui l'identificativo della pubblicazione e quello dell'autore corrispondono. Inoltre ci si limita a considerare solo le pubblicazioni di tipo 'Book'. Per finire la tabella viene ordinata secondo il cognome dell'autore, indicato mediante l'alias S, definito nella clausola SELECT. ESEMPIO 4 SELECT title, volume, pub_year FROM Book WHERE ID IN ( SELECT PUB.ID FROM Publication PUB, Author AUT, Person PER WHERE PUB.ID = AUT.publicationID AND AUT.personID = PER.ID AND PUB.type = 'Book' AND PER.surname = 'Knuth' )

http://www.html.it/sql/sql_09.htm (3 di 4) [19/06/2001 14.23.49]

SQL: Interrogare il database

In questo esempio si vede l'utilizzo di un espressione condizionale che contiene l'operatore IN, il quale restitisce il valore vero se il valore dell'operando alla sua sinistra e' contenuto nella tabella risultato dell'espressione alla sua destra. La query fra parentesi produce una tabella di un'unica colonna contentente gli identificativi delle pubblicazioni di tipo 'Book' di cui Knuth e' authore. La query piu' esterna quindi estrae dalla tabella Book le informazioni dei libri con tali identificativi. ESEMPIO 5 SELECT COUNT(*) FROM Publication count ----12 Conta il numero di righe presenti nella tabella Publication. ESEMPIO 6 SELECT type, COUNT(ID) FROM Publication GROUP BY type

Conta il numero di pubblicazioni presenti nel database suddividendole per tipo. Le funzioni di aggregazione previste dallo standard SQL sono COUNT, SUM, AVG, MAX e MIN, i quali calcolano rispettivamente la numerosita', la somma, la media aritmetica, il massimo e il minimo dei valori scalari presenti nella colonna a cui vengono applicate.

Lezione

successiva

[Sommario]

http://www.html.it/sql/sql_09.htm (4 di 4) [19/06/2001 14.23.49]

SQL: Aggiornare il database

Aggiornare il database
Normalmente le informazioni presenti in un database non sono statiche, ma evolvono nel tempo. C'e' quindi la necessita' non solo di aggiungere nuovi dati, ma di modificare quelli che sono gia' inseriti nelle tabelle del database. Le istruzioni SQL che vengono utilizzate a questo scopo sono UPDATE e DELETE. La prima modifica i valori presenti in una o piu' colonne di una o piu' righe di una tabella. La seconda elimina una o piu' righe di una tabella. La sintassi di UPDATE e' la seguente: UPDATE nome_tabella SET elenco_assegnamenti [ WHERE espressione_condizionale ] Gli assegnamenti vengono specificati nella forma: nome_colonna = espressione_scalare L'istruzione UPDATE aggiorna le colonne della tabella che sono state specificate nella clausola SET, utilizzando i valori che vengono calcolati dalle corrispondenti espressioni scalari. Se viene espressa anche la clausola WHERE, vengono aggiornale solo le righe che soddisfano l'espressione condizionale. Si noti che l'espressione scalare utilizzata per aggiornare una colonna puo' anche essere il risultato di una query scalare, cioe' una query che restituisce una sola riga e una sola colonna. Vediamo un esempio: UPDATE Person SET given_names = 'Stefano' WHERE surname = 'Spaccapietra' La precedente istruzione cambia il valore della colonna given_name della tabella Person nelle righe (nel nostro caso e' una sola) in cui la colonna surname ha valore 'Spaccapietra'. La sintessi di DELETE e': DELETE FROM nome_tabella [ WHERE espressione_condizionale ] L'istruzione delete elimina da una tabella tutte le righe che soddisfano l'espressione condizionale della clausola WHERE. Se WHERE non viene specificata, vengono cancellate tutte le righe della tabella. Se nella definizione della tabella si sono specificate le clausole ON UPDATE o ON DELETE, nel momento in cui vengono eseguite queste operazioni viene eseguita anche l' azioni che era stata prevista sulle colonne referenziate (CASCADE, SET DEFAULT o SET NULL).

Lezione

successiva

[Sommario]

http://www.html.it/sql/sql_10.htm [19/06/2001 14.23.52]

SQL: Modificare la struttura del database

Modificare la struttura del database


Nel corso della precedente lezione si e' visto come modificare i dati gia' presenti nel database. A volte pero' non e' sufficiente modificare i dati, ma occorre aggiornare la struttura stessa del database per far si' che possano essere rappresentate nuove informazioni. Dal momento che la struttura del detabase e' data sostanzialmente dall'insieme delle tabelle che lo compongono, il suo aggiornamento corrisponde all'eliminazione di tabelle o alla modifica delle loro caratteristiche. Per eliminare una tabella da un database il comando SQL da utilizzare e' DROP TABLE: DROP TABLE nome_tabella { RESTRICT | CASCADE } nome_tabella e' il nome della tabella che deve essere eliminata. Se si specifica la clausola CASCADE vengono automaticamente eliminati i vincoli di integrita' e le viste (view) in cui la tabella e' coinvolta. Viceversa, se si specifica la clausola RESTRICT ed esistono dei vincoli di integrita' o delle viste che si riferiscono alla tabella, l'operazione fallisce. Ad esempio, si siano definite le seguenti due tabelle: CREATE TABLE Prova1 ( Id INTEGER PRIMARY KEY, Nome VARCHAR(50)) CREATE TABLE Prova2 ( Id INTEGER PRIMARY KEY, Nome VARCHAR(50), toProva1 INTEGER REFERENCES Prova1(Id)) Volendo eliminare la tabella Prova1, l'istruzione: DROP TABLE Prova1 RESTRICT fallira' dal momento che esiste un vincolo di integrita' che lega una chiave esterna della tabella Prova2 con la tabella Prova1. Invece l'istruzione: DROP TABLE Prova1 CASCADE verra' eseguita con successo e produrra' anche l'eliminazione del vincolo di integrita' referenziale presente sulla tabella Prova2. Nel caso in cui si voglia modificare una tabella esistente nel database, l'istruzione da utilizzare e' ALTER TABLE. Dal momento che la sintassi di questa istruzione e' piuttosto complessa, essa verra' spiegata scomponendola in base alle funzionalita' che si vogliono ottenere: Aggiunta di una nuova colonna nella tabella ALTER TABLE nome_tabella ADD [ COLUMN ] definizione_colonna nome_tabella e' il nome della tabella che si vuole modificare. La definizione della colonna segue la stessa sintassi vista nella lezione "Creare il database" nella spiegazione dell'istruzione CREATE TABLE. Dovranno quindi essere specificati il nome della colonna, il suo tipo ed eventualmente il suo valore di default e i vincoli imposti sulla colonna. La parola chiave COLUMN puo' essere omessa (qui e in tutti i casi successivi). Eliminazione di una colonna dalla tabella ALTER TABLE nome_tabella DROP [ COLUMN ] nome_colonna { RESTRICT | CASCADE }

http://www.html.it/sql/sql_11.htm (1 di 2) [19/06/2001 14.23.56]

SQL: Modificare la struttura del database

nome_colonna e' il nome della colonna che si vuole eliminare. Le clausole RESSTRIC e CASCADE si comportano esattamente come nell'istruzione DROP TABLE vista precedentemente. L'istruzione fallira', oltre che nei casi gia' visti per RESTRICT, se si tenta di eliminare una colonna che e' l'unica colonna di una tabella. Modifica del valore di default di una colonna ALTER TABLE nome_tabella ALTER [ COLUMN ] nome_colonna { SET clausola_default | DROP DEFAULT } La sintassi ed il significato della clausola che definisce il nuovo valore di default sono identici a quelli della clausola_default che si usa nel comando CREATE TABLE. Eliminazione di un vincolo della tabella ALTER TABLE nome_tabella DROP CONSTRAINT nome_vincolo { RESTRICT | CASCADE } Elimina il vincolo identificato dal nome specificato. L'operazione fallisce se e' stata specificata la clausola RESTRICT ed esistono altri vincoli che dipendono da quello che si intende eliminare. Specificando la clausola CASCADE l'operazione verra' sempre completata con successo, cancellando inoltre i vincoli dipendenti da quello eliminato. Spesso si vuole eliminare un vincolo a cui non e' stato assegnato un nome esplicitamente, facendo precedere la definizione del vincolo dalla clausola opzionale [CONSTRAINT nome_vincolo]. In tal caso, dal momento che il DBMS avra' comunque assegnato un nome al vincolo per poterlo identificare, occorrera' interrogare le tabelle di sistema del DBMS ed ottenere da esse il suo nome. La particolare interrogazione richiesta dipende dallo specifico DBMS utilizzato. Aggiunta di un vincolo alla tabella ALTER TABLE nome_colonna ADD vincolo_di_tabella La sintassi da utilizzare per la definizione del vincolo e' la stessa utilizzata nel comando CREATE TABLE per i vincoli di tabella.

Lezione

successiva

[Sommario]

http://www.html.it/sql/sql_11.htm (2 di 2) [19/06/2001 14.23.56]

SQL: Utilizzo multiutente di un database

Utilizzo multiutente di un database


Fino ad ora abbiamo esaminato le caratteristiche del linguaggio SQL che riguardano la definizione e la manipolazione dei dati presenti in un database, senza preoccuparci del fatto che normalmente l'accesso a tali dati avviene in maniera concorrente da parte di piu' utenti contemporaneamente. I meccanismi a sostegno di tale metodo di accesso riguardano principalmente la sicurezza dei dati, la gestione delle transazioni e la possibilita' di definire delle viste sulle tabelle del database. 1. Sicurezza L'esecuzione di un operazione sui dati del database da parte di un utente e' subordinata al possesso da parte dell'utente dei necessari privilegi per la particolare operazione eseguita sullo specifico insieme di dati. In generale i privilegi vengono attribuiti nella seguente maniera:
q

Un utente che crea una tabella o qualunque altro oggetto del database ne e' il proprietario e gli vengono automaticamente garantiti tutti i privilegi applicabili a tale oggetto, con la possibilita' di impostare anche ad altri utenti tali privilegi (privilegio di concessione). Un utente che abbia un privilegio ed abbia in oltre su di esso il privilegio di concessione puo' assegnare tale privilegio ad un altro utente e passare ad esso anche il privilegio di concessione. I privilegi sono concessi da chi ne abbia il permesso (cioe' dal proprietario dell'oggetto e da chi abbia il privilegio di concessione) mediante il comando GRANT e revocati mediante il comando REVOKE. La sintassi del comando GRANT e' la seguente: GRANT elenco_privilegi ON oggetto TO elenco_utenti [ WITH GRANT OPTION ] Esso assegna all'utente i privilegi presenti nell'elenco_privilegi sull'oggetto specificato. I privilegi assegnabili sono i seguenti (con le relative sintassi): USAGE Privilegio per usare uno specifico dominio o altro oggetto del database. SELECT Privilegio per accedere a tutte le colonne di una tabella o di una vista. INSERT [ (nome_colonna) ] Se viene specificata l'opzione nome_colonna, e' il privilegio per inserire valori nella colonna indicata di una tabella o di una vista. Senza il nome_colonna e' il privilegio per inserire valori in tutte le colonne, comprese quelle che saranno aggiunte in seguito. UPDATE [ (nome_colonna) ] Se viene specificata l'opzione nome_colonna, e' il privilegio per aggiornare il valore nella colonna indicata di una tabella o di una vista. In caso contrario permette di aggiornare il valore di tutte le colonne, comprese quelle che saranno aggiunte in seguito. DELETE Privilegio per eliminare righe da una tabella o da una vista. REFERENCES [ (nome_colonna) ] Se viene specificata l'opzione nome_colonna, e' il privilegio di riferirsi alla colonna

http://www.html.it/sql/sql_12.htm (1 di 4) [19/06/2001 14.24.01]

SQL: Utilizzo multiutente di un database

indicata di una tabella o di una vista nella definizione di un vincolo di integrita'. Senza l'opzione concede tale privilegio per tutte le colonne, comprese quelle aggiunte in seguito. L'oggetto a cui il privilegio si riferisce e' generalmente una tabella o una vista. La sintassi per la sua specificazione e' in tal caso: [TABLE] nome_tabella Nel caso di altri oggetti segue la sintassi: tipo_oggetto nome_oggetto dove tipo_oggetto puo' essere DOMAIN, CHARACTER SET, COLLATION o TRANSLATION (si veda C.J. Date - "A Guide to The SQL Standard" per una spiegazione di tali oggetti). Nel caso di oggetti diversi da tabelle o viste, l'unico privilegio applicabile e' quello di USAGE. L'elenco_utenti e' un elenco di identificativi di utenti o gruppi di utenti. Puo' anche essere utilizzata la parola chiave PUBLIC, che indica tutti gli utenti e i gruppi conosciuti nel sistema. Se e' presente l'opzione [ WITH GRANT OPTION ], viene assegnato inoltre il privilegio di concessione, che permette agli utenti di trasferire ulteriormente i privilegi loro assegnati. Ad esempio: GRANT SELECT, INSERT, UPDATE(nome) ON persona TO benfante WITH GRANT OPTION assegna all'utente benfante i privilegi di SELECT e INSERT su tutte le colonne della tabella persona e quello di UPDATE sulla sola colonna nome di tale tabella. Gli viene inoltre garantito il privilegio di assegnare tali permessi ad altri utenti. Per togliere i privilegi agli utenti si usa invece REVOKE: REVOKE [ GRANT OPTION FOR ] elenco_privilegi ON oggetto FROM elenco_utenti { RESTRIC | CASCADE } elenco_privilegi, oggetto ed elenco_utenti hanno le stesso significato delle corrispondenti opzioni di GRANT. L'opzione GRANT OPTION FOR revoca il privilegio di concessione. Se viene specificata la clausola RESTRICT, il comando REVOKE puo' fallire nel caso in cui l'utente a cui vengono revocati i privilegi li abbia ulteriormente concessi ad altri utenti. Se e' presente invece la clausola CASCADE, l'istruzione verra' sempre completata con successo e verranno revocati i privilegi anche di quegli utenti e di tutti gli utenti a cui essi li hanno concessi (...e cosi' via, finche' non ci saranno piu' permessi "abbandonati", cioe' concessi senza che chi li ha concessi ne sia ancora in possesso). Verranno inoltre distrutti gli oggetti del database costruiti grazie a tali permessi. 2. Gestione delle transazioni Le transazioni SQL sono insiemi di istruzioni che devono essere trattati come delle unita' atomiche, cioe' non scomponibili nelle singole istruzioni da cui sono formate. Grazie a tale atomicita' le transazioni permettono di eseguire operazioni complesse sul database mantenendone l'integrita'. Infatti una transazione viene eseguita con successo se e solo se tutte le operazioni che la compongono terminano con successo. In caso contrario, cioe' se una delle operazioni fallisce o se la transazione viene esplicitamente annullata, tutte le operazioni precedenti vengono annullate anch'esse. Le operazioni di una transazione non hanno alcun effetto sul database fino a quando la transazione non viene completata con successo. Dal momento che ad un database possono accedere piu' utenti contemporanamente, in ogni istante potremmo avere piu' transazioni che manipolano il database in maniera concorrente. Lo standard SQL prevede che normalmente le transazioni debbano essere eseguite nel "livello di isolamento serializzabile" (isolation level SERIALIZABLE), cioe' in una modalita' di esecuzione che garantisca la "serializzabilita'" delle transazioni. Il fatto che le transazioni siano serializzabili significa che il loro effetto complessivo sul database e' quello che si otterrebbe se esse venissero eseguite in maniera non concorrente l'una di seguito all'altra. Nel linguaggio SQL standard non esiste un'istruzione che faccia iniziare esplicitamente una transazione. Le istruzioni vengono divise in due classi: quelle che

http://www.html.it/sql/sql_12.htm (2 di 4) [19/06/2001 14.24.01]

SQL: Utilizzo multiutente di un database

possono iniziare una transazione e quelle che non la fanno iniziare. Nel momento in cui si cerca di eseguire un'istruzione della prima classe, se non e' gia' in corso una transazione, ne viene cominciata una. La transazione continua fino a quando una delle istruzioni fallisce, causando l'annullamento dell'intera transazione, o se vengono eseguite le istruzioni COMMIT WORK o ROLLBACK WORK. L'istruzione COMMIT WORK termina la transazione confermandola, rendendo quindi definitivi gli effetti delle sue istruzioni sul database. L'istruzione ROLLBACK WORK invece la termina annullandola. Spesso i DBMS che si trovano in commercio implementano la gestione delle transazioni in maniera differente da quanto previsto dallo standard (almeno nelle loro impostazioni di default). In tal caso, di solito e' previsto un comando che inizia esplicitamente una transazione (BEGIN TRANSACTION, START WORK, o altro). Se una transazione non e' stata iniziata esplicitamente, le singole istruzioni ne compongono una ciascuna. Per capire meglio quali potrebbero essere le conseguenze della manipolazione concorrente dei dati di un database senza l'utilizzo delle transazioni, vediamone un'esempio. Supponiamo di avere un database con il quale gestiamo gli ordini dei prodotti che vendiamo. In particolare, quando un cliente ci sottopone una richiesta per un prodotto, ne verifichiamo la disponibilita' e nel caso in cui possiamo soddisfare l'ordine, sottraiamo alla quantita' in giacenza la quantita' che ci e' stata richiesta. Traducendo tutto cio' in SQL, otteniamo la quantita' in giacenza con l'istruzione (istruzione A): SELECT giacenza FROM prodotti WHERE prodottoID=1453 L'aggiornamento della giacenza, una volta verificata la disponibilita', e' ottenuta dalla seguente istruzione (istruzione B): UPDATE prodotti SET giacenza=giacenza-1 WHERE prodottoID=1453 Se due utenti cercano di eseguire questa operazione, senza che le due istruzioni che la compongono siano state raggruppate in una transazione, potrebbe accadere che le istruzioni vengano eseguite nell'ordine e con i risultati seguenti :
q

Istruzione A eseguita dall'utente 1: viene restituita una giacenza del prodotto pari a 1, quindi l'ordine verra' approvato. Istruzione A eseguita dall'utente 2: come prima la giacenza e' 1 e anche in questo caso l'ordine verra' approvato. Istruzione B eseguita dall'utente 1: a questo punto nel database la giacenza per il prodotto vale 0. Istruzione B eseguita dall'utente 2: ora la giacenza vale -1, che e' ovviamente un valore errato.

Come si vede il risultato finale e' che uno dei due clienti non potra' ricevere (almeno non subito) la merce, dato che non ne avevamo in giacenza una quantita' sufficiente per entrambi i clienti. Se le due istruzioni fossero state inserite in una transazione, il problema non sarebbe sorto, dato che la transazione del secondo utente non avrebbe potuto leggere il valore della giacenza fino a quando non fosse stata completata la transazione del primo utente. A quel punto, la giacenza avrebbe avuto valore 0 e l'ordine non sarebbe stato erratamente approvato. 3. Viste Fino ad ora le uniche tabelle con cui abbiamo avuto a che fare sono state quelle definite con il comando CREATE TABLE. Il linguaggio SQL mette anche a disposizione la possibilita' di definire delle tabelle "virtuali", le viste, calcolate a partire da altre tabelle. Esse sono virtuali nel senso che non occupano spazio su disco, ma sono il risultato di interrogazioni su altre tabelle e quindi sempre allineate con i valori contenuti in tali tabelle. L'istruzione SQL per definire una vista e' la seguente: CREATE VIEW nome_vista [ ( elenco_nomi_colonne ) ] AS espressione_tabella Essa crea una vista chiamata nome_vista definita dall'espressione_tabella. Tipicamente espressione_tabella e' un'instruzione select che produrra' la tabella che interessa. l'elenco_nomi_colonne puo' essere usata per assegnare dei nomi alle colonne della vista. Cio' e' utile nel caso in cui le colonne derivanti dall'espressione tabella siano il risultato di un calcolo (ad esempio COUNT(nome_colonna)) e non

http://www.html.it/sql/sql_12.htm (3 di 4) [19/06/2001 14.24.01]

SQL: Utilizzo multiutente di un database

abbiano quindi un nome esplicito. Una volta creata, una vista puo' essere utilizzata come una normale tabella. Le uniche limitazioni riguardano le operazioni che modificano i dati in essa contenuti. Infatti, non tutte le viste sono aggiornabili. Le regole che discriminano fra una vista aggiornabile e una non aggiornabile sono piuttosto complesse e non e' questa la sede per descriverle (si vedano i libri in bibliografia, in particolare quello di C.J. Date). Qui ci limiteremo a cercare di capire, mediante un esempio, perche' questo accade. Proviamo ad utilizzare la seguente vista sul nostro database bibliografico: CREATE VIEW book_publisher89 AS SELECT B.title, P.name FROM Book B, Publisher P WHERE B.publisher = P.ID AND B.pub_year=1989 Essa ci permette di eseguire la query che la definisce semplicemente utilizzando l'istruzione: SELECT * FROM book_publisher89 Possiamo anche impostare ulteriori condizioni (o fare in modo che il risultato sia ordinato secondo una particolare colonna della vista, ecc...): SELECT title FROM book_publisher89 WHERE name = "ACM Press" Quest'ultima interrogazione ci fornisce l'elenco dei titoli dei libri pubblicati dall'ACM Press nel 1989. Come si vede per quanto riguarda operazioni di interrogazione una vista si comprta come una normale tabella. Le differenze sorgono quando si cerca di applicare ad una vista delle operazioni di aggiornamento. Ad esempio, se cerchiamo di eseguire la seguente istruzione: INSERT INTO book_publisher89 VALUES( "Nuovo libro", "publisher") Il DBMS non riuscira' ad eseguirla, restituendo un errore tipo "No INSERT permission". Il motivo e' che non e' in grado di creare le righe corrispondendi al nostro nuovo record nelle due tabelle "reali" da cui la vista e' originata (i problemi sono vari: deve creare solo una righa nella tabella Book e collegarla ad una particolare riga nella tabella Publisher, o creare una riga in entrambe le tabelle; come decidere quali valori assegnare alle chiavi primarie degli eventuali nuovi record; quali valori assegnare agli altri campi delle due tabelle; ecc...) Grazie alle viste (e all'assegnazione oculata dei permessi agli utenti) e' possibile fare in modo che utenti diversi abbiano una percezione della struttura del database anche molto diversa da quella che ha realmente e impedire che particolari categorie di utenti possano accedere ad informazioni che non competono loro. Ad esempio, supponiamo di avere una tabella in cui sono memorizzati i dati anagrafici dei dipendenti di una ditta e l'ammontare del loro stipendio mensile. Ovviamente si vorrebbe impedire la consultazione dei dati relativi agli stipendi a tutti gli utenti, eccetto a quelli che si devono occupare dell'erogazione/amministrazione degli stessi. Un sistema per fare cio' e' quello di definire una vista contenente solo le colonne dei dati anagrafici. In questo modo tutti gli utenti autorizzati ad accedere ai dati anagrafici, ma non a quelli degli stipendi, lo potranno fare solo attraverso tale vista. Ulteriori partizionamenti potrebbero essere fatti in senso orizzontale, creando ad esempio un vista che contiene solo le informazioni sui dirigenti ed una che contiene i dati degli altri dipendenti. Inoltre, le viste spesso contribuiscono a facilitare quella indipendenza fra applicazioni e struttura dei dati, che rende i database degli strumenti tanto utili. Infatti se ad un certo punto fosse necessario cambiare la struttura del database (scomponendo, ad esempio, una tabella in due tabelle per motivi di efficienza), non sarebbe necessario modificare tutte le applicazioni adattandole alla nuova struttura, ma sarebbe sufficiente creare delle opportune view, in modo che dal punto di vista delle applicazioni niente sia stato cambiato.

[Sommario]

http://www.html.it/sql/sql_12.htm (4 di 4) [19/06/2001 14.24.01]

SQL: Riferimenti bibliografici e web

Riferimenti bibliografici e web


International Organization for Standardization (ISO) - "Database Language SQL", Document ISO/IEC 9075:1992 American National Standards Institute - "Database Language Embedded SQL", Document ANSI X3.168-1989 R. Elmasri and S.B. Navathe - "Fundamentals of Database Systems", Second Edition, The Benjamin/Cummings publishing company, 1994 F.D. Rolland - "The essence of databases", Prentice Hall, 1998 E.F. Codd - "A Relational Model of Data for Large Shared Data Banks", Communications of the ACM 13, No. 6, June 1970 C.J. Date with Hugh Darwen - "A Guide To The SQL Standard", Fourth Edition, Addison-Wesley, 1997 Jan L. Harrington - "SQL Clearly Exmplained", AP Professional, 1998 Helmut Kopka and Patrick W. Daly - "A Guide to LaTeX 2e", Second Edition, Addison-Wesley, 1995 Jason Hunter with William Crawford - "Java Servlet Programming", O'Reilly, 1998 ftp://gatekeeper.dec.com/pub/standards/sql Raccolta di Working Draft del linguaggio SQL3 in formato ps e txt http://www.jcc.com/SQLPages/jccs_sql.html La pagina riguardante lo standard SQL della JCC Consulting, Inc. http://www.postgresql.org Il sito dedicato a PostgreSQL. Vi si puo' inoltre trovare una versione elettronica del libro di Bruce Momjian - "PostgreSQL: Introduction and Concepts" [Sommario]

http://www.html.it/sql/bibliografia.htm [19/06/2001 14.24.42]

HTML.it - Guida al Perl

di Edoardo Valsesia edoardo@html.it

Il Perl un linguaggio finalizzato principalmente alla trattazione di stringhe e file di testo, soprattutto in procedure CGI. Questa guida, scritta da Edoardo Valsesia, consigliata a coloro che utilizzano CGI per l'automazione di determinate procedure o vogliono crearne di propri.

Percorso consigliato: esperti Livello di difficolt:

Test di preparazione in 10 domande F.A.Q.: risposte a domande frequenti

1. Introduzione al Perl
Scopo di questo documento e finalita' del presente corso

2. Cos' il Perl e come lo si pu utilizzare


Utilizzo del Perl e vantaggi per i Webmaster

3. Invocazione del Perl


Metodi per lanciare uno script in Perl

4. Variabili e struttura dei dati


Negli script in perl, i dati temporanei sono tenuti in variabili; queste si comportano a grandi linee come le variabili d'ambiente, ma non sono la stessa cosa.

5. Variabili speciali
Il perl mette a disposizione un insieme piuttosto ricco di variabili speciali, ossia variabili gestite direttamente dall'interprete che contengono parametri assai utili.

6. Alcune funzioni
Tutte le funzioni in ordine alfabetico del Perl

7. Subroutines
E' possibile definire le nostre funzioni in perl, e poi richiamarle come si richiamano le normali funzioni del perl.

8. Operatori
Panoramica sugli operatori presenti nel Perl

9. Blocchi
Esempi e liste di blocchi.

10. Test sui file


Introduzione al concetto di "verifica" sui file

11. Espressioni regolari


Le espressioni regolari sono una sorta di linguaggio interno al perl, ma non solo ...

12. Variabili locali


In ogni momento si possono dichiarare le variabili locali, cos una sub pu lavorare su queste variabili senza interferire su altre usate da altre sub.

13. Stile
E' importante scrivere il codice in maniera che questo mostri la sua struttura ...

14. Qualche utile consiglio ..


http://www.html.it/perl/index.html (1 di 2) [19/06/2001 14.25.13]

HTML.it - Guida al Perl


Consigli sulla scrittura di uno script in Perl

15. Dove trovare informazioni


Website, newsgroup e libri cartacei sul Perl.

16. Utilizzare i moduli


Un modulo un insieme di operazioni che possono essere utilizzate all'interno di qualsiasi script in Perl.

Tutorial 01. l'accoppiata Perl - database


Utilizzare congiuntamente le conoscenze di Perl e dei database per i progetti personali o per doveri lavorativi: interagire con i database, pratica peraltro molto utilizzata sul web a vari livelli, dal commercio elettronico ai motori di ricerca.

http://www.html.it/perl/index.html (2 di 2) [19/06/2001 14.25.13]

PERL: Introduzione al Perl

Introduzione al Perl
Lo scopo di questo documento di spiegare le basi della programmazione in perl. Cercheremo di farlo per linee generali e di focalizzarci sulle "idee" invece che sui dettagli, comparandoli quando possibile ai linguaggi C e di shell scripting. Fine ultimo di questo documento di rendervi capaci di leggere, capire, modificare gli script in perl, e, alla fine, di scrivere i vostri. Non si assume che voi siate dei programmatori, ma non vi sar certamente spiegato cos' un file o una pipe; una minima conoscenza del mondo Unix necessaria per potervi programmare. Infatti il linguaggio Perl si sposa perfettamente con il sistema UNIX; anche se oggi ne sono stati effettuati dei porting su numerose altre piattaforme (Windows 9x/NT, OS/2, MS-DOS, ecc ...) l'ambiente pi naturale per sviluppare ed eseguire script in Perl rimane UNIX, dove possibile integrare e far interagire gli script con i numerosi strumenti presenti nel sistema (sed, awk, grep, mail ecc. ) ed ottenere il meglio dal linguaggio. In questo documento c' molto materiale, anche abbastanza condensato; una buona idea pu essere quella di leggerlo dall'inizio alla fine senza memorizzare, all'inizio, nulla se non le basi, giusto per farsi un'idea generale; il secondo passo quello di leggere pi attentamente, cercando di capire precisamente come funziona il perl. Non dimenticatevi, durante la lettura, di provare gli esempi forniti a corredo del testo per testarne il funzionamento ed, evantualmente, provare a modificarli per scoprire le innumerevoli possibilit offerte da questo linguaggio. Ovviamente, questo tutorial non completo, solo una selezione dei principali comandi; il perl ha molti pi comandi di quelli qui spiegati, e molti hanno molte pi opzioni o possibilit di quelle che presenteremo. Probabilmente ci saranno anche delle disattenzioni sulla semantica del linguaggio, perdonatecele! In ogni caso, riferitevi sempre alla documentazione.

Lezione

successiva

[Sommario]

http://www.html.it/perl/perl_01.htm [19/06/2001 14.25.16]

PERL: Cos' il Perl e come lo si pu utilizzare

Cos' il Perl ...


Prima di tutto, un po' di filosofia. Il perl spesso chiamato "linguaggio di scripting", a differenza dei linguaggi di programmazione, perch fu originariamente pensato non per grandi lavori, ma per l'automatizzazione di determinati tasks. Con gli anni, il perl diventato sempre pi potente ed stato utilizzato per progetti sempre pi grandi, anche se non nato per questo. Il Perl ("Processing Estraction Report Language" per chi lo apprezza, "Pathologically Electric Rubbish Lister" per chi lo ama, suggerisce l'autore!) un linguaggio finalizzato principalmente alla trattazione di stringhe e file di testo. Ci che in Perl estremamente naturale fare effettuare ricerche di sequenze di caratteri all'interno di stringhe (pattern matching), sostituzioni di sottostringhe (pattern substitution), operazioni su file di testo strutturati in campi e record oppure non strutturati. Per questi motivi il Perl utilizzato pesantemente nella scrittura di procedure CGI installate su un server web, o per lo sviluppo di procedure di manutenzione delle attivit di un server. Per gli stessi motivi il Perl non invece indicato per sviluppare procedure di puro calcolo scientifico o comunque programmi che richiedano una elevata velocit e precisione nell'effettuare calcoli o elaborazioni numeriche complesse. Certamente, quindi, il Perl diventa quasi una necessit per chi debba gestire un sito web che non sia solamente testo ed immagini: con questo linguaggio, infatti, possibile automatizzare alcune utili operazioni, dalle pi semplici (richiesta di un indirizzo e-mail) alle pi complesse (come registrazione di dati di utenti ecc.). A quanti non mai capitato di imbattersi in un sito nel quale veniva richiesto di inserire il nostro indirizzo e-mail per l'iscrizione ad una mailing-list, oppure di vedere in alcune pagine qualcosa tipo "Visitatore numero nnnnnnn", o ancora di riempire moduli di adesione o registrazione? Credo nessuno! Ebbene, sotto a tutto questo ci sono linee e linee di Perl (nella maggior parte dei casi!) che elaborano ci che l'utente ha digitato e restituendolo al webmaster in formato intellegibile o meglio (soprattutto per registrazioni e adesioni, in cui ci sono parecchi campi da riempire: nome, cognome e via dicendo) formattato in diversi campi ( a m di database) oppure, nel migliore dei casi, facendo tutto da solo: prendiamo ad esempio un utente che voglia avere uno spazio web gratuito e che debba registrarsi: si trover davanti a parecchie domande alle quali rispondere, ed alla fine dovr premere il bottone "invia" e passare le grane al webmaster, che dovr successivamente confermare l'adesione. Chi abbia fatto ci almeno una volta, si sar sicuramente reso conto che la conferma di avvenuta adesione arriva prestissimo (si parla di qualche minuto al massimo!!): ebbene, qui non il webmaster che lavora alla velocit della luce, ma un complesso script che riceve le informazioni e le scelte dell'utente, assegnandogli un username ed una password, approntando una directory sul server pronta a ricevere i file dell'utente che tra l'altro sar protetta contro altri utenti che volessero modificarla ecc.; infine, si preoccupa di mandare una mail (che di solito un modello nel quale vengono inseriti i dati dell'utente) all'utente per avvertirlo che l'operazione stata svolta con successo! E non dimentichiamoci che lo stesso script controla che le scelte dell'utente siano sensate: ad esempio, controllando che l'indirizzo e-mail sia valido (nel senso che sia nella forma utente@dominio e non utente_dominio, ad esempio). Insomma, il Perl sicuramente una miniera d'oro per il webmaster che abbia determinate esigenze, ed impararne le basi utile per poter iniziare a scrivere i propri script di automatizzazione (ma non solo, si possono scrivere anche veri e propri programmi) e successivamente implementarli sul proprio server, locale o non che sia. L'interprete perl non compila mai il codice in codice-macchina, come fanno i compilatori C: ogni volta che si esegue uno script in perl, questo viene interpretato "al volo". Ci sono 2 versioni di perl: il perl4 ed il suo successore, il perl5. Questo in linea di massima compatibile con il perl4, ed ha inoltre features addizionali. In questo documento si far riferimento soprattutto al perl5, visto che ormai dovrebbe essere la release pi utilizzata.

http://www.html.it/perl/perl_02.htm (1 di 2) [19/06/2001 14.25.19]

PERL: Cos' il Perl e come lo si pu utilizzare

Lezione

successiva

[Sommario]

http://www.html.it/perl/perl_02.htm (2 di 2) [19/06/2001 14.25.19]

PERL: Invocazione del Perl

Invocazione del Perl


Dal momento che ogni script deve essere interpretato dal programma 'perl', e dato che gli script non sono altro che semplici file di testo, devono iniziare con i caratteri #! seguiti con il percorso completo del binario perl sul sistema, tipicamente: #!/usr/bin/perl oppure #!/usr/local/bin/perl (per localizzare dove risiede, nel vostro sistema, l'interprete perl, scrivete 'which perl' in un terminale anche se, solitamente, l'interprete viene installato in /usr/bin; ma non si pu mai sapere con certezza). Questo, una volta che il file reso eseguibile (con chmod 755 nome_script.pl), fa in modo che quando lo script viene eseguito, il kernel legga la prima linea e vada a cercare l'interprete, che poi provveder all'interpretazione del resto del codice. Un metodo alternativo per lanciare uno script in perl, quello di chiamare 'perl' con il nome dello script come argomento: perl script.pl Perl riconosce molte opzioni, le pi utili sono: q -h visualizza una pagina di help;
q

-d esegue lo script sotto il debugger; -l aggiunge automaticamente il line-feed, aggiungendolo alla fine di ogni comando 'print'; -v visualizza la versione della versione del perl installato sulla vostra macchina ed esce; -w visualizza alcuni warnings sullo script; molto utile per scoprire gli errori.

Tutte queste (e molte altre opzioni) sono documentate in "man perl" per il perl4, ed in "man perlrun" per il 5 (perl 5 divide l'immensa manpage del 4 in circa 25 sezioni) In uno script perl, il cancelletto ( # ) introduce un commento, e tutto quello che viene dopo di esso in una riga viene ignorato. print "Hello world\n"; # Questo un commento e verr ignorato; verr # eseguito solo il comando "print" I comenti sono spesso utili per s e per chi legge il vostro codice: per voi per il fatto che potete utilizzarli come degli "appunti" per, ad esempio, ricordarvi di fare qualcosa che avete dimenticato o lasciato indietro; per gli altri per la maggiore facilit di interpretare il vostro codice, ammesso che inseriate i vostri commenti al suo interno.

Lezione

successiva

[Sommario]

http://www.html.it/perl/perl_03.htm [19/06/2001 14.25.24]

PERL: Variabili e struttura dei dati

Variabili e struttura dei dati


Negli script in perl, i dati temporanei sono tenuti in variabili; queste si comportano a grandi linee come le variabili d'ambiente, ma non sono la stessa cosa. Il tipo principale di variabile, in perl, lo scalare. Uno scalare una stringa o un numero, che non ha bisogno di essere convertito come in C. Inoltre, tutti gli scalari possono essere interi o numeri in virgola mobile, che il perl prover a rappresentare come interi, se possibile, per migliorare la velocit di esecuzione. Ogni variabile ha un nome, che inizia sempre con un carattere speciale, che ne indica il tipo, seguito da un nome di almeno una lettera. Tutti i nomi delle variabili sono case-sensitive, per cui $variabile diverso da $Variabile e da $VaRiAbIlE. Il carattere speciale di cui si parlava $, ed utilizzato sia quando si assegna una variabile che quando si usa il suo valore. $bla = 1; assegna 1 alla variabile scalare $bla $bla = "1"; assegna a bla la stringa "1", che equivalente a sopra $ops = $bla +1; $ops 2 $bla = "ciao\n"; \n un ritorno a capo print $bla; visualizza ciao Negli script di shell, il carattere $ utilizzato solo quando si richiede il valore di una variabile, non quando lo si assegna: bla = 1 echo $bla Negli script, le stringhe sono racchiuse tra "" o '' , con la differenza che tra "" le variabili verranno interpolate, tra '' le variabili verranno considerate letteralmente. Ogni volta che pu nascere un'ambiguit come quanto lungo pu essere il nome di una variabile, $variabile pu essere scritto come ${variabile}. $bla = "eeek!"; $blabla = "uff!"; print "$blabla\n"; visualizza "uff" print "${bla}bla\n" visualizza "eeek!bla" $bla = "eek!"; $msg = "$bla mi hai spaventato"; $msg contiene "eeek! mi hai spaventato $msg2 = '$bla mi hai spaventato'; adesso contiene "$bla mi hai spaventato In perl, come anche nello shell scripting (e diversamente dal C) le variabili non hanno bisogno di essere dichiarate prima di essere usate: la prima volta che si utilizza una variabile, la si dichiara. Tentare di leggere un valore inesistente porta ad avere una stringa vuota che, in contesto numerico, interpretata come 0. Le variabili il cui nome inizia (dopo il canonico $) con un carattere speciale, che non

http://www.html.it/perl/perl_04.htm (1 di 4) [19/06/2001 14.25.28]

PERL: Variabili e struttura dei dati

una lettera sono considerate 'riservate' (una lista la si pu trovare in man perlvar in perl5). Queste variabili cambiano alcuni comportamenti del perl a seconda del proprio valore. Una di queste la variabile $_ , che lasciata libera in modo da permettere all'utente di inserirvi dati in modo temporaneo, ed ha inoltre la propriet che molte funzioni operano con $_ se non fornito alcun valore. $_ = "bla bla bla\n"; print; visualizza il contenuto di $_ Notate che non tutte le funzioni assumono $_ come default, anche se questo funziona con tutte le funzioni incui ha senso assumere la variabile $_ . In caso di dubbio, si pu ricorrere ad un piccolo script di un paio di righe per vedere se la funzione che interessa pu lavorare con $_ Altre importanti variabili riservate sono: $$ visualizza il PID del programma $< visualizza l'UID dell'utente che ha eseguito il programma $0 visualizza il nome del programma $! visualizza lo stato dell'ultima chiamata del programma $? visualizza lo stato di ritorno dell'ultima operazione di esecuzione di un processo esterno $@ visualizza l'ultimo messaggio di errore prodotto dallo script Un altro tipo di dato l'array; un array una lista numerata di scalari. L'array identificato dal simbolo @, allo stesso modi in cui $ indica lo scalare. Tutti gli array sono numerati a partire da 0: il primo elemento assume il numero 0, il secondo 1 e cos via. Gli elementi sono inseriti in un array sotto forma di una lista separata da virgole e tra parentesi. L'elemento n del generico array @array definito come $array[n]. In questo caso si utilizza $ al posto di @ perch ci si riferisce ad uno scalare, e non a tutto l'array. $var = 1; definisce una variabile @array = ("bla", 34, "uff", $var); definisce l'array; notate che un elemento definito con il valore di $var $secondo = $array[1]; prende il secondo valore dell'array e lo assegna a $secondo, che diventa 34 @eek = @array[0, 2]; @eek diventa ("bla", "uff"), poich prende il primo e terzo valore di @array @urka = (@array, @eek); questo NON un array di array, poich gli array sono sempre array di scalari. Quello che succede, che tutti i valori di @array e @eek sono copiati in @urka, che diventa ("bla", 34, "uff", 1, "bla", "uff") Ci sono funzioni che operano sugli array, aggiungendo elementi alla fine, togliendone, estraendo quelli che soddisfano una data condizione, ordinandoli ecc. Quella che viene detta "size" di un array (ovvero il numero di elementi meno uno) chiamato @array data da $#array. Per gli array vuoti, questa viene assunta come -1. @array = ("bla", "bla", "bla", "bla"); print $#array, "\n"; visualizzer 3, e non 4 (Notate che il simbolo # in $#array non introduce un commento). Abbiamo visto che in una stringa tra "", le variabili sono interpolate, in modo che "bla$eek" significa "blabla" se $eek bla. Questo si applica anche agli array. Bisogna fare per attenzione ad una cosa: print "il mio indirizzo root@localhost\n"; <- NON funziona print "il mio indirizzo root\@localhost\n"; <- funziona Questo perch il carattere @ considerato speciale e, se si vuole che esso sia visualizzato letteralmente (ovvero sia considerato come un semplice carattere, non come un array), bisogna introdurlo con \ , che protegge il carattere seguente da un'interpretazione diversa da quella letterale, come succede con altri caratteri come " o \.
http://www.html.it/perl/perl_04.htm (2 di 4) [19/06/2001 14.25.28]

PERL: Variabili e struttura dei dati

In questo caso, \@ detto carattere di escape; vediamone altri: \\ \" \$ \@ \' \a \b \e \n \r \0n \xn \ " $ @ ' BELL BS (backspace) ESC LF (Line - feed) CR (Carriage return) Numero ottale rapresentato da 'n' Numero decimale

Se volete divertirvi, provate a lanciare questo script: #!/usr/bin/perl print "\a"; Qui \a considerato un carattere di escape, e non verr visualizzato \a, come vi sareste potuti aspettare. Per visualizzare \a, lo script deve essere: #!/usr/bin/perl print "\\a\n"; \n non strettamente necessario, ma utile per visualizzare \a su una linea vuota senza il prompt In alternativa, si pu scrivere quanto segue: print 'il mio indirizzo root@localhost', "\n"; che visualizza il mio indirizzo root@localhost. Attenzione per di non introdurre nell'espressione precedente variabili che devono essere interpolate: semplicemente non si avrebbe l'interpolazione! Il terzo (ed ultimo, per quanto ci riguarda) tipo di dati in perl l'hash, detto anche array associativo. Gli hash sono introdotti dal simbolo % e contengono scalari indicizzati da altri scalari. Il modo migliore per capire gli hash di pensare ad un vocabolario: ogni hash contiene valori (le definizioni nel vocabolario), assegnati agli identificatori (le parole), e le operazioni base sono aggiungere o rimuovere parole o cambiare il loro valore, controllando se ognuna di queste parole esiste o meno nel vocabolario. %bla = ("eek", 34, "uff", 18, "zero", "niente); nota che nell'espressione precedente tutte le stringhe avrebbero potuto essere scritte anche tra '' Per chiarezza, gli hash possono essere scritti anche come: %bla = ( "eek" => 34, "uff" => 18, "zero" => niente, ) Continuiamo con gli esempi: print $bla{"eek"}, "\n"; visualizza 34 $s = 'zero'; @arr = ($bla{"uff"},$bla{$s}; @arr diventa (18, "niente") Questi tre tipi di variabili (scalari, array e hash) possono benissimo avere lo stesso nome: nello stesso codice si possono trovare lo scalare $abc, l'array @abc e l'hash %abc. Vediamo un'ultima cosa: provate ad eseguire questo script: #!/usr/bin/perl print "Come ti chiami?\n"; $nome = <STDIN>;

http://www.html.it/perl/perl_04.htm (3 di 4) [19/06/2001 14.25.28]

PERL: Variabili e struttura dei dati

print "Ciao $nome\n"; Come avrete notato, lo script si interrompe chiedendoci il nostro nome (ma potrebbe chiedere qualunque altra informazione). Cosa sta succedendo? Beh, baster sapere che il simbolo <STDIN> l'handler del file di input standard, ovvero un file sempre aperto durante lesecuzione del programma e che rappresenta la tastiera del terminale di chi esegue lo script. Con la linea $nome = <STDIN> si dice allo script di immagazzinare nella variabile $nome quello che l'utente batte da tastiera finch conclude con il tasto invio. I canali standard di comunicazione sono 3 ed ad ognuno di questi associato ad un handler: <STDIN> standar input <STDOUT> standard output <STDERR> standard error Stdout si pu vedere come il canale attraverso il quale viene emesso l'output. STDERR simile a STDIN ma viene solitamente utilizzato per visualizzare i messaggi di errore.

Lezione

successiva

[Sommario]

http://www.html.it/perl/perl_04.htm (4 di 4) [19/06/2001 14.25.28]

PERL: Variabili speciali

Variabili speciali
Il perl mette a disposizione un insieme piuttosto ricco di variabili speciali, ossia variabili gestite direttamente dall'interprete che contengono parametri assai utili. In molti casi pu essere utile passare dei parametri sulla linea di comando al nostro script Perl, ad esempio con: perl script.pl argomento Questo pu essere benissimo fatto, ricordando che i parametri che noi passiamo sono immagazzinati nell'array @ARGV (maiuscolo!!); questo array speciale ma si comporta esattamente come tutti gli altri array: $ARGV[0] indica il primo elemento dell'array, $#ARGV indica l'ultimo ecc. Vediamo come esempio la "riscrittura" del comando 'grep' dei sistemi Unix: questo comando visualizza le righe del file di testo che contengono la stringa passata come argomento al programma; si scriver quindi uno script che cerca nel file di testo l'argomento che noi passiamo al nostro script. #!/usr/bin/perl $ARGV[0] || die "Devi specificare la stringa da cercare\n"; @file = `ls -1`; chop(@file); foreach $file (@file) { -T $file || next; open(FILE, "<$file") ||next; while ($r = <IN>) { $r =~ /$ARGV[0]/ && print "$file: $r"; } close (IN); } Magari l'esempio un po' ampio, ma pu essere utile per illustrare le potenzialit di @ARGV; non preoccupatevi se non capite foreach, open e altro: pi avanti saranno spiegati. Un esempio pi semplice pu essere: #!/usr/local/bin/perl $filename = $ARGV[0]; open(FILE, "< $filename") || die "Errore!\n\n"; while ($riga = <FILE>) { print "$riga"; } In questo esempio, lo script aspetta che gli venga passato come argomento il nome del file (seconda riga), sul quale esegue determinate operazioni (nello specifico, apre il file in lettura o, se non esiste, viene visualizzato un messaggio d'errore; poi stampa ogni riga di tal file) Un altro tipo interessante di variabili sono le variabili d'ambiente, che l'interprete prende dal sistema e memorizza nell'hash %ENV. Tale hash contiene tutte le variabili d'ambiente del sistema, che possono essere richiamate con $ENV{variabile}. Per vederne il funzionamento, si provi il seguente script: #!/usr/bin/perl print "Path : $ENV{PATH}\n"; Ovviamente tale script funziona con tutte le variabili, ed altres possibile modificarle (attenzione a non combinare casino). Per vedere su quali variabili potete agire, lanciate il comando: $ set |more che visualizzer le variabili con il loro valore.

http://www.html.it/perl/perl_05.htm (1 di 2) [19/06/2001 14.25.32]

PERL: Variabili speciali

Lezione

successiva

[Sommario]

http://www.html.it/perl/perl_05.htm (2 di 2) [19/06/2001 14.25.32]

PERL: alcune funzioni

Alcune funzioni
Le cosiddette "builtin functions" sono i normali 'comandi' del perl, che accettano argomenti, fanno qualcosa a livello degli argomenti o di sistema, e danno in ritorno dei valori. Per informazioni pi dettagliate, si veda "man perlfunc". Molte funzioni non hanno bisogno di argomenti tra (), ma nelle operazioni pi complicate le parentesi tonde sono necessarie per chiarire cosa riferito a cosa. Tipicamente, quindi, le () si evitano nelle linee pi semplici, come print $bleah; , ma devono essere incluse quando c' pi di una funzione che viene invocata nella stessa dichiarazione. Le dichiarazioni in perl terminano sempre con il segno ; Funzioni (in ordine alfabetico):
q

atan2 Funzione matematica: restituisce l'arcotangente di un valore. La si pu anche trovare con sub tan { sin($_[0]) / cos($_[0]) }

binmode Apre un file in modalit binaria; deve essere invocato dopo il comando open (che apre il file): open (FILE, file.bin); binmode FILE;

chdir Cambia la directory di lavoro con quella indicata come argomento della funzione chdir ($HOME) or die "You're homeless!\n";

chmod Accetta come argomenti un numero e una lista di file, e setta il permesso su quei file in funzione del numero assegnato. Il numero deve essere espresso in notazione ottale. Il valore di uscita false se 0 o '', true in qualsiasi altro caso: chmod 0644, "README", "INSTALL"; @list = ( "abc", "def", "ghi") chmod 755, @list;

chop Prende come argomento uno scalare, ed elimina l'ultimo carattere, restituendolo. Spesso utilizzato per eliminare il carattere \n dai file e dagli input da tastiera. $a = "scalare"; $b = chop($a); Nella maggior parte dei casi, non ci interessa il valore restituito, quindi basta semplicemente dare: chop $a; oppure solamente: chop; che opera con $_ . Si noti che, ai nostri fini, chomp equivalente a chop.

chown Analogo al comando chown dei sistemi Unix: cambia il proprietario di uno o pi file. I primi 2 argomenti che si devono passare a questa funzione sono l'uid (user id) ed il gid (group id) numerici, poi il file o i file da sottoporre

http://www.html.it/perl/perl_06.htm (1 di 6) [19/06/2001 14.25.39]

PERL: alcune funzioni

alla funzione. In generale, la sintassi : chown $uid, $gid, @filenames; oppure chown $uid, $gid, 'file1', 'file2' ...... ;
q

cos Funzione matematica. Restituisce il coseno del parametro (espresso in radianti) passato alla funzione. Se si omette il parametro, cos opera su $_ do Esegue un blocco di comandi e restituisce il valore dell'ultima espressione presa in considerazione. La sintassi : do BLOCCO; Un'utile implementazione di "do" pu essere quella di ripetere una porzione dicodice finch una certa condizione sia verificata. Vediamo come: do { print "Scegli 1 o 2\n"; chop($sel=<STDIN>); until " 1 2 " =~ / $sel /; if ($sel == '1') { print "Hai scelto 1\n"; } elsif ($sel == '2') { print "Hai scelto 2\n"; } In pratica, questo script visualizza "hai scelto 1" o "hai scelto 2" a seconda del tasto premuto dall'utente, a meno che questi abbia premuto qualsiasi altro tasto: in questo caso, lo script si disinteressa del tasto premuto e continua a visualizzare "Scegli 1 o 2". A cosa pu servire tutto questo? Semplice: togliete da questo script le prime quattro linee e premete "3" quando vi viene chiesto di scegliere 1 o 2: lo script si blocca ed esce: non succede niente di male, sia chiaro, ma se avete uno script di qualche centinaio di righe che si blocca per una simile piccolezza, la cosa pu dare fastidio.

die Prende come argomento una stringa ed esce immediatamente dal programma visualizzando tale stringa come messaggio d'errore. if ($num != 18) { die "Non 18\n"; }

eval Prende un'espressione come argomento e la esegue come fosse un piccolo programma. Se non viene indicato alcu argomento, eval valuta $_ . Eval restituisce il valore dell'ultima espressione considerata, ma si pu ricorrere a return per restituire il valore ad un determinato punto del blocco. Nel seguente esempio si vede come possibile eseguire la stessa operazione con do e con eval: do 'script.pl'; eval `cat script.pl`; Attenzione agli apici inversi: ' questo un apostrofo ` questo l'apice inverso

exec Esce dallo script Perl eseguendo un altro progrmamma. Normalmente, exec non rientra in perl, ma se anche dovesse farlo, restituisce il valore falso, controllando cos' successo tramite l'analisi di $! . Se si volesse ritornare all'interno dello script, consigliato utilizzare la funzione system exit Prende un numero come argomento, ed esce con quel numero come codice di stato. exit 0; per uscire con successo exit 1; o qualsiasi valore diverso da 0 esce senza successo.

http://www.html.it/perl/perl_06.htm (2 di 6) [19/06/2001 14.25.39]

PERL: alcune funzioni

La differenza con die che die viene utilizzato nei casi tipo "questo non sarebbe dovuto succedere".
q

exp Funzione matematica. Calcola il valore di e elevato al parametro fornito con exp: in mancanza di questo, agisce su $_ getpgrp Utilizzato con la sintassi 'getpgrp PID' restituisce i/l processo/i appartenente/i al PID specificato. Se si utilizza questa funzione su sistemi che non implementano la chiamata getgpgrp (si veda man getpgrp), produce un errore irreversibile. goto Sintassi: goto label: ricerca la riga contrassegnata da label e riprende l'esecuzione da essa. La sintassi pu anche essere goto expr oppure goto &name (si veda la manpage per ulteriori approfondimenti) grep Esegue la stessa cosa del comando 'grep' nei sistemi Unix. In pratica, ricerca una stringa e restituisce gli elementi per i quali l'espressione risulta vera. Si veda la solita man perlfunc e man perl (nei sistemi Unix) join Prende una stringa ed una lista di valori di uno o pi array, e produce una stringa ottenuta con tutti i valori dell'array, usando la stringa come separatore. $bah = (":", "eek", "niente", 34); $bah diventa "eek:niente:34" @array = ("uff", "abc", "foo"); print (join(" ", @array, "eek"), "\n"); visualizza "uff abc foo eek"

keys Restituisce una lista costituita da tutte le chiavi dell'hash indicato: $bla{'eek'} = "*pat*"; $bla{'uff'} = "erp"; @thekeys = keys(%bla); @thekeys ("eek", "uff") print (join(" ", keys(%bla)), "\n";); visualizza "eek uff"

kill Invia un segnale ad un processo. La si pu utilizzare come kill 'STOP' processo; per i segnali, is veda man 7 signal. last interrompe l'esecuzione il ciclo in questione (simile al BREAK del C). Se non viene specificato il ciclo, last is riferisce al pi interno. LINE: while <STDIN> { last LINE if /^$/; esce quando ha terminato con gli headers ....... il resto del ciclo }

lenght Prende una stringa e restituisce la sua lunghezza $n = "blip"; $l = $lenght($n); $l 4 print (lenght(34), "\n"); restituisce 2

link Crea un link al file specificato, con la sintassi uguale a quella dei sistemi Unix:

http://www.html.it/perl/perl_06.htm (3 di 6) [19/06/2001 14.25.39]

PERL: alcune funzioni

link OLDFILE, NEWFILE


q

local Modifica le variabili elencate in modo da diventare locali limitatamente al blocco corrente. Se in lista ci sono pi variabili, queste devono essere racchiuse tra parentesi. In alternativa a local, si pu utilizzare anche my. local $variabile; dichiara $variabile locale local (@array, %hash); dichiara la lista di variabili locali local $var = "valore"; dichiara $var locale e le assegna un valore Per una trattazione pi completa, si veda la sezione 'Temporary Values via local()' in man perlsub.

log Funzione matematica: restituisce il logaritmo in base e dell'argomento passato alla funzione (o, come sempre, agisce su $_ ) mkdir Crea una directory, di cui il primo elemento il nome, il secondo i permessi su di essa: mkdir "files", 0755; o meglio: if (!mkdir("files", 0755)) { die "failed to create directory\n"; }

my Dichiara che le variabili considerate sono locali rispetto al blocco che le contiene, alla subroutine o al file corrente; se vengno specificate pi variabili, queste devono essere racchiuse tra parentesi. A differenza delle variabili create con 'local', queste rendono completamente 'invisibili' le variabili globali con lo stesso nome. Per informazioni pi dettagliate, si veda Private Variables via my() in man perlsub next Analogo all'istruzione CONTINUE del C, permette di passare direttamente l'interazione del ciclo contrassegnata da dall'etichetta LABEL LINE: while (<STDIN>) { next LINE if /^#/; altro }

oct Interpreta l'argomento passato come parametro della funzione come un valore ottale e lo restituisce in valore decimale open Apre il file indicato come argomento della funzione. Il file pu essere aperto in diversi modi: con < viene aperto in lettura con >> viene aperto in scrittura con >> il contenuto non viene sovrascritto, ma i nuovi dati vengono aggiunti in coda al file con + davanti a < o > per indicare che il file deve essere aperto in lettura e scrittura se inizia con | , viene visto come un comando a cui l'output viene passato se termina con | , viene visto come un comando da cui viene prelevato l'input open /usr/src/linux/README Apre il file open log >> /tmp/log Apre il file log e ne passa il contenuto a /tmp/log, senza sovrascriverlo

q q q

q q

http://www.html.it/perl/perl_06.htm (4 di 6) [19/06/2001 14.25.39]

PERL: alcune funzioni

open <file; Apre il file per la modifica open(FILE, "<miofile;"); Come sopra, solo che poi sar possibile agire su FILE
q

pop Estrae e restituisce l'ultimo valore di un array riducendone di 1 le dimensioni. Se l'array vuoto, restituisce '' print Stampa una stringa o una lista di stringhe. Restituisce 1 se eseguito con successo, 0 altrimenti print "Hello world\n"; quante volte vedrete questo esempio! $bla = 3 print "Il valore di 'bla' $bla\n"; visualizza "il risultato di 'bla 3"

push Aggiunge uno o pi elementi in coda all'array ampliandone la lunghezza @bla = ("a"); $arr = "xterm"; push(@bla, "eek", $arr, 12.5) @bla risulta ( "a","eek", $arr, 12.5);

quotemeta Restituisce una variante dell'argomentoin cui gli eventuali metacaratteri sono resi con l'aggiunta del carattere backslash ( \ ) quotemeta ".*" restituisce "\.\*" rand La funzione random. Passando un argomento numerico alla funzione, questa restituir un valore casuale compreso tra 0 e il numero indicato. Se non fornito alcun argomento, restituir un valore compreso tra 0 e 1, estremi inclusi

readlink Passandogli un link come argomento, la funzione restituisce il nome del file ( o directory) a cui quel file punta rename Rinomina un file: restituisce 1 se l'operazione stata svolta con successo, 0 in caso contrario rmdir Rimuove la directory indicata come argomento della funzione rmdir "temp_dir";

shift Estrae il primo valore dell'array e lo restituisce, accorciando di 1 la lunghezza dell'array e facendo slittare i restanti elementi. In un certo senso, l'opposto di push. Se l'array vuoto, lo lascia vuoto e restituisce un valore "undef". @bla = ("a", "xterm", 12.5); $v = shift @bla; # @bla ("xterm", 12.5) e $v "a"

sin Funzione matematica: restituisce il seno di un determinato valore sleep Aspetta il numero di secondi indicati come argomento della funzione. split Cerca particolari sequenze di caratteri e scompone la stringa in una serie di sottostringhe, restituendo la lista generata (in contesto scalare) o il numero di sottostringhe generate. Verr meglio spiegato pi avanti, dopo le spiegazioni sulle espressioni regolari. sqrt Funzione matematica: calcola la radice quadrata.

http://www.html.it/perl/perl_06.htm (5 di 6) [19/06/2001 14.25.39]

PERL: alcune funzioni

symlink Crea un link simbolico. La sintassi : symlink OLDFILE, NEWFILE Nei sistemi che non prevedono i link simbolici, la funzione uscir con un errore. In questo caso si veda la funzione link().

system Esegue un programma. E' simile a exec, ma dopo la fine dell'esecuzione del programma ritorna invece di uscire. system ("comando", "istruzioni")

undef Prende il nome di una variabile e la imposta come indefinita. Senza argomenti, restituisce un valore indefinito. Undef non restituisce mai '' o 0. undef %bla; si sbarazza dell'hash %bla undef $eek; si sbarazza dello scalare $eek $eek = undef; come sopra

unlink Cancella un file o una lista di file. unlink "tempfile"; unlink "tempfile", "altrifile";

unshift Aggiunge una lista di elementi in testa all'array e restituisce il numero di elementi. @bla = ("a", "b"); $arr = "xterm"; unshift(@bla, "eek", $arr, 12.5); # @bla ("eek", "xterm", 12.5,

warn Emette un 'warning' nel canale STDERR, come fa die ma senza uscire. warn "debugger enebled" if $debug;

<> Legge una riga da STDIN e la restituisce. $_ = <>; legge una linea in $_ chop; esegue chop su \n print "Hai scritto '$_'\n"; visualizza l'output, ovvero quello che si digitato preceduto da "Hai scritto"

Lezione

successiva

[Sommario]

http://www.html.it/perl/perl_06.htm (6 di 6) [19/06/2001 14.25.39]

PERL: Subroutines

Subroutines
Fino ad adesso, tutti i "programmi" che siamo in grado di scrivere sono abbastanza 'lineari', verrebbero cio eseguiti dall'inizio alla fine, riga dopo riga, senza alcun test o loop, tutti in un unico blocco. E' comunque possibile definire le nostre funzioni (o procedure, o subroutines o come volete chiamarle) in perl, e poi richiamarle come si richiamano le normali funzioni del perl. Il modo di definire una funzione questo: sub nome_della_funzione { contenuti; della; funzione; } Tale funzione verr richiamato come &nome_della_funzione se non si vogliono aggiungere argomenti, &nome_della_funzione($argomenti, @vanno, %qui) per richiamarla con gli argomenti. La "&" il carattere che identifica le subroutines, allo stesso modo in cui $ definisce gli scalari. Le subroutines possono essere definite in qualsiasi punto del programma, eccetto all'interno di altre. [Questo vale per il perl4, nel 5 si possono avere subroutine in altre subroutines, sub (= subroutines) senza nome, e non necessario il "&" per richiamarle]. Le sub possono essere utilizzate prima di essere definite. ex: #!/usr/bin/perl $bla=3; &showbla; $bla=4; sub showbla { print "bla $bla\n"; } &showbla Questo esempio assegna 3 a $bla, chiama la sub, assegna 4 a $bla, poi la richiama; non importa il posto in cui essa definita. Nella pratica le sub si tengono all'inizio dello script, attorniate con l'inizializzazione della variabili che servono, ed in seguito il resto del codice. Ma il perl non obbliga mai ad essere logici o chiari. All'interno di una sub, possiamo aver accesso ai parametri passati (se ce ne sono) tramite lo speciale array @_ . Cos il primo valore passato alla sub sar $_[0], il secondo $_[1] e cos via. sub printfirstargument { print $_[0], "\n"; } sub printnumberofarguments { print $#_ +1, "\n"; } sub addone { $_[0] = $[0] +1; } $bla = 3; &addone($bla);

http://www.html.it/perl/perl_07.htm (1 di 2) [19/06/2001 14.25.44]

PERL: Subroutines

Inoltre, ogni funzione restituisce un valore. che l'ultima espressione che era stata valutata. Da una sub, si pu ritornare indietro ad un determinato punto con il comando "return", che torner al punto fornito come argomento. sub one { if ($_[0] == 1) { controlla che il primo argomento sia 1 return "one"; se cosi', restituisce la stringa "one" } else { altrimenti ... return "not one"; restituisce la stringa "not one" } chiude "if/else" } chiude la sub print &one(1), ", ", &one(3), "\n"; visualizza "one, not one" Vediamo ora un esempio pi "alla mano": questo script legger i valori in input e ne stamper la media aritmetica. #!/usr/bin/perl sub media { local($n, $somma, $media); foreach $n (@_) { $somma += $n; } $media = $somma/($#_ +1); return ($media); } print "Inserisci i numeri:\n"; @numeri = <STDIN>; chop (@numeri); $media = &media(@numeri); print "Media = $media\n";

Lezione

successiva

[Sommario]

http://www.html.it/perl/perl_07.htm (2 di 2) [19/06/2001 14.25.44]

PERL: operatori

Operatori
Abbiamo visto che il perl utilizza i normali operatori matematici utilizzati per i numeri: + per l'addizione, - per la sottrazione, * per la moltiplicazione, / per la divisione. Inoltre, == utilizzato per l'uguaglianza, e ritorna "vero" o "falso" a seconda che i numeri siano uguali o meno. L'opposto != . Come ci si aspetta, < il simbolo di minore e > quello di maggiore, <= il simbolo di minore o uguale e => quello di maggiore o uguale. Utilizzare questi simboli con operatori non matematici, produrr, se lo script chiamato con l'opzione -w, un warning. Ci sono anche operatori che operano a livello di stringa: . (si', proprio il punto) esegue la concatenazione eq controlla che le stringhe siano uguali ne l'opposto di eq 3 == 3 vero 3 == "03" vero "bla" eq "arr" falso "bla" ne "arr" vero "bla".3 equivalente a "bla"."3", che restituisce "bla3" "bla eek!" lo stesso di $bla."eek!" Ci sono poi gli operatori logici: && (AND), || (OR), ! (NOT). && e || vanno tra due espressioni, mentre ! va all'inizio dell'espressione (poich la nega) 3 == "03" && "bla"ne "arr" vera Questa espressione funziona perch == e ne hanno una precedenza pi alta rispetto a &&, ma la stessa espressione avrebbe potuto essere scritta pi chiaramente come: (3 == 03) && ("bla" ne "arr") !("eek" eq $bla) lo stesso di ("eek" ne $bla) Una particolarit degli operatori && e || che possono essere utilizzati come scorciatoie per "se verificata la condizione fai questo". unlink "dumbfile" || die "Couldn't remove file\n"; In questo modo prima viene valutato unlink() e, se questo ha successo, la condizione

http://www.html.it/perl/perl_08.htm (1 di 3) [19/06/2001 14.25.48]

PERL: operatori

introdotta da || viene ignorata, altrimenti (in caso di insuccesso) tale condizione viene eseguita. L'operatore =~ particolare: questo guarda che 2 pattern siano uguali e li sostituisce. La sintassi : valore =~ /pattern/; Controlla se le variabili sono uguali valore !~ /pattern/ Forma corta per !($variabile=~/pattern/;). Controlla che non siano uguali $variabile =~ s/pattern/replacement/; Cerca il pattern nella variabile, e la sostituisce con replacement Se la variabile omessa, =~ e !~ agiscono su $_ Nella prima forma, senza la s/ , =~ e !~ non modificano gli argomenti, ma testano solo se combaciano. Nella seconda forma, il pattern "replacement" sostituito a pattern se questo viene trovato. Ancora, alcuni modificatori possono essere aggiunti prima del ; per specificare come i pattern devono combaciare: i - case-insensitive g - match globale. Controlla e restituisce anche pi di un valore I pattern sono espressioni regolari abbastanza simili a quelle di grep. Questo verr spiegato in seguito. "bla" =~ /bl/; vero perch bla contiene bl "blabla" =~ /bl/; idem "blabla" =~ /bl/g; trova 2 matches "bla" !~ /c/i; vero $var = "blabla"; $var =~ s/bl/QQ/; vero, e cambia $var in "QQahbla" $var =~ s/BL/qq/ig; vero, e $var diventa "qqahqqah" L'operatore = assegna il secondo elemento al primo. Ci sono delle scorciatoie per utilizzare questo operatore. $var += $value: aggiunge $value a $var $var -= $value; sottrae $value da $var $var *= $value; moltiplica $var per $value $var /= $value; divide $var per $value Queste espressioni sono invece utilizzate per incrementare il valore delle variabili: $counter += $step; $var ++ aggiunge 1 a $var ++$var valuta $var+1

http://www.html.it/perl/perl_08.htm (2 di 3) [19/06/2001 14.25.48]

PERL: operatori

Tutti questi operatori (tranne =~) ed il matching dei pattern si applicano anche in C, in maniera quasi identica.

Lezione

successiva

[Sommario]

http://www.html.it/perl/perl_08.htm (3 di 3) [19/06/2001 14.25.48]

PERL: Blocchi

Blocchi
Tutti questi blocchi possono ovviamente essere raggruppati:
q

if esegue il test di una condizione, e agisce in conseguenza della verit o meno di questa. La sintassi : if (condizione) { cose; da; fare; } elsif (condizione2) { altre; cose; da; fare; } else { altro; ancora; } Questo esempio parla da solo: il perl testa la prima condizione, se questa vera esegue il blocco. Se questa falsa, passa a elsif ed esamina la seconda condizione: se vera esegue il blocco. Se nessuna delle precedenti vera, passa all'else. Un ulteriore esempio: print "Scegli un numero\n"; $num=<STDIN>; if ($num == '0') { print "Hai premuto 0\n"; } elsif ($num == '1') { print "Hai premuto uno\n"; } elsif ($numero == '2') { print "Hai premuto due\n"; } elsif ($num == '3') { print "Hai premuto tre\n"; } else { print "Non hai premuto n zero n uno n due n tre!\n"; } Chiaro, no?? Abbiamo scelto di fare l'esempio cos lungo per dimostrare che ci possono essere benissimo pi di un elsif: qui ce ne sono ben tre, ed avrebbero potuto essere molti di pi, senza un tetto massimo; invece vi pu essere solamente un else ed un if, almeno che non siano concatenati: if (condizione) { if (condizione2) { fai questo; } fai quest'altro; } L'esempio sopra funziona, ma totalmente diverso dal precedente: questo si legge come " se succede una certa cosa (condizione) e se ne succede un'altra (condizione2) .....", non una serie di alternative come l'esempio dei tre elsif. Non necessario introdurre un elsif() o un else(); la struttura pu anche essere semplice come: if (condizione) {

http://www.html.it/perl/perl_09.htm (1 di 4) [19/06/2001 14.25.52]

PERL: Blocchi

cose_da_fare; } oppure: if (condizione) { cose_da_fare; } else { altre_cose; } Le {} sono sempre necessarie in questi costrutti. Un modo per sintetizzare al massimo l'esempio: if (condizione) { cose_da_fare; } cose_da_fare if condizione; Esempio: if ($cmd eq 'ECHO') { &print($args); } elsif ($cmd eq 'CLEAR' || $cmd eq 'CL) { print $cls if $ansi; print "`#ssfe#l\n" if $ssfe; }
q

unless fa le stesse cose di if, solo che rovescia il risultato del test.

print "Non uno\n" unless $number ==1;


q

while Ripete un loop finch una condizione vera Un esempio pu essere:

#!/usr/local/bin/perl print STDERR "nome del file: "; $nome_del_file = <STDIN>; open(FILE, "< $nome_del_file"); while (!eof(FILE)) { $riga = <FILE>; print "$riga"; } Questo script non fa altro che chiedervi il nome del file da aprire, e, finch non arriva alla fine (la condizione 'while(!eof(FILE)'), visualizza sullo schermo. until Ripete un loop finch una condizione falsa. La sintassi : until (condizione) { # si pu sostituire con while per avere la # condizione opposta cose; da; fare; } Questo costrutto testa la condizione, e se vera esegue tutto ci che contenuto in {}, poi esegue un nuovo test sulla condizione e cos via finch la condizione falsa. All'interno del blocco, ci possono essere altri 2 utili comandi:
q

next skippa il resto del blocco e va direttamente a ri-testare la condizione. last skippa il resto del blocco e ne esce:

$i = 0; while ($i < 18) { print "$i "; $i++; }

http://www.html.it/perl/perl_09.htm (2 di 4) [19/06/2001 14.25.52]

PERL: Blocchi

print "\n"; $i = 0; while ($i < 18) { next if $i == 4; print "$i "; $i++; } print "\n"; Anche qui si pu utilizzare la sintassi. fai_qualcosa while condizione
q

foreach Esegue determinate operazioni su ogni valore di ogni lista/array. La sintassi : foreach $variabile (array o scalare) { fai_qualcosa; fai_qualcos'altro; } Come sempre, $variabile non indispensabile, e, se questa non specificata, verr utilizzata $_ Gli argomenti tra () possono essere un array, pi array o una lista di variabili, o chiamate di funzioni che restituiscono valori, o un misto di tutto questo. Tutti questi scalari e array sono spediti in un array (come fa push() ), dopo di che viene eseguito il blocco tra {} per ogni valore. Attenzione: se il codice tra {} modifica il valore di una variabile anche il valore nell'array verr modificato. Come con while/until, anche con foreach possibile utilizzare last e next. @bla = ("ick", 3, "arr", "bleargh"); %eek = (10, "no", 5, "yes", 7.5, "maybe"); foreach (@bla, keys(%eek), "heh") { print "|", $_, "| "; } print "\n"; # Visualizza # "|ick| |3| |arr| |bleargh| |10| |5| |7.5| |heh|" foreach (@bla, keys(%eek), "heh") { $_ = "bla" if $_ == 3; } print join(":", @bla)."\n"; # Visualizza "ick:3:arr:bleargh" foreach $i (@bla) { $i = "bleh" if $i == 3; } print join(":", @bla)."\n"; # Visualizza "ick:bleh:arr:bleargh"

for Pu essere utilizzato come sinonimo di foreach, solo che la sintassi risulta pi chiara: for (statement1; condizione, statement2) { cose; da; fare; } for ($i = 0; $i < 18; $i++) { print "$i "; } print "\n"; for ($i = 0; $i < 18; $i++) { next if $i == 4; print "$i "; } print "\n";

http://www.html.it/perl/perl_09.htm (3 di 4) [19/06/2001 14.25.52]

PERL: Blocchi

Lezione

successiva

[Sommario]

http://www.html.it/perl/perl_09.htm (4 di 4) [19/06/2001 14.25.52]

PERL: Test sui file

Test sui file


Dopo aver parlato dei blocchi, pu essere utile introdurre il concetto di "verifica" sui file. Ad esempio, avendo uno script del tipo: #!/usr/bin/perl print "Inserisci il nome del file che vuoi modificare\n"; chomp($file=<STDIN>); ..... E' probabile che l'utente indichi il file correttamente e che lo script proceda con successo; ma se ci dovesse non accadere? Cosa succederebbe se l'utente inserisse come nome del file "caio" invece di "ciao"? Semplicemente lo script andrebbe ad editare un nuovo file (vuoto), che non certo quello che volevamo! Tale inconveniente pu essere superato come segue: #!/usr/bin/perl print "Inserisci il nome del file che vuoi modificare\n"; chomp($file=<STDIN>); if (-e $file) { .... } else { die "File non trovato\n"; } Cosa c' di diverso da prima? A parte il blocco if/else, notate quel "if (-e $file)": rendendolo in italiano potrebbe essere "se esiste $file". Quindi l'interprete perl andr prima a vedere se tal file esiste, ed in caso positivo passer alla modifica. Dovesse non esistere, si blocca e visualizza un messaggio (il file non stato trovato). Ovviamente vi sono altri operatori oltre a "-e" ; vediamo i pi importanti: -z il file ha dimensioni nulle -s il file ha dimensioni non nulle (restituisce le dimensioni -f il file un file regolare -d il file una directory -l il file un link -r il file leggibile -w il file scrivibile -x il file eseguibile -T il file un file di testo -B il file un file binario (opposto di -B) Sintetizziamo tutto con un esempio: #!/usr/bin/perl print "Inserisci il nome del file\n"; chomp($file=<STDIN>); print "Leggibile\n" if -r $file; print "Scrivibile\n" if -w $file; print "Eseguibile\n" if -x $file; print "Il file ha dimensioni nulle\n" if -z $file; print "E' una directory\n" if -d $file;

http://www.html.it/perl/perl_10.htm (1 di 2) [19/06/2001 14.25.56]

PERL: Test sui file

print "E' un link\n" if -l $file;

Lezione

successiva

[Sommario]

http://www.html.it/perl/perl_10.htm (2 di 2) [19/06/2001 14.25.56]

PERL: Espressioni regolari

Espressioni regolari
Le espressioni regolari sono una sorta di linguaggio interno al perl, ma non solo (ad esempio si ritrovano in comandi come grep, sed awk). Comunque, non ci sono 2 programmi che hanno a che fare con le espressioni regolari le interpretano allo stesso modo. Un'espressione regolare rinchiusa tra / , sebbene questa sia pi una convenzione che una regola! E' comune vedere un'espressione regolare rinchiusa tra | o # o qualche altro carattere, per evitare di mettere il simbolo \ davanti a tutti i / in regexp. Un'espressione regolare definisce un pattern che verr cercato. Nelle espressioni regolari, i caratteri alfanumerici (dalla a alla z, dalla A alla Z, da 0 a 9 e _ ) hanno corrispondenza univoca, mentre altri caratteri hanno caratteristiche speciali. Un \ seguito da un carattere non alfanumerico corrisponde esattamente a quel carattere; in particolare, \\ corrisponde a \ . ^ -- (solo all'inizio dell'espressione) fa in modo che il testo corrisponda al pattern solo se il pattern all'inizio del testo. $ -- (solo alla fine dell'espressione) fa in modo che il testo corrisponda al pattern solo se il pattern alla fine del testo. Qualche esempio chiarir un po' le cose. "bla" =~ /\// falso, poich cerca in "bla" il carattere / "blh" =~ /\$/ falso, poich cerca in "bla" il carattere Quindi per cercare un carattere speciale (o, se volete, riservato) bisogna chiarire tramite il simbolo \ che si ricerca proprio quel carattere, e non il suo valore. E la stessa cosa per la ricerca con grep ma anche con editor (vi, ad esempio) "bla" =~ /la/ vero "bla" =~ /^la/ falso "bla" =~ /^bl/ vero "bla" =~ /h$/ vero "bla" =~ /ls$/ falso "bla" =~ /^bla$/ vero Altri caratteri speciali sono: . -- cerca ogni singolo carattere \t -- cerca una tabulazione \s -- cerca uno spazio o una tabulazione \S -- cerca ogni carattere che non sia una tabulazione \n -- cerca una "newline" \w -- cerca ogni singola lettera, cifra ma anche _ \W -- cerca ogni cosa che non sia una lettera, una cifra o _ \d -- cerca ogni singola cifra da 0 a 9 \D -- cerca ogni carattere che non sia una cifra "bla" =~ /b.a/ vero "bla" =~ /b.la/ falso "bla" =~ /b\w.h$/ vero "bla" =~ /\w\D/ vero "bla" =~ /\d/ falso [caratteri] -- cerca ogni carattere che sia tra [ ]

http://www.html.it/perl/perl_11.htm (1 di 3) [19/06/2001 14.26.00]

PERL: Espressioni regolari

Inoltre, un campo di ricerca pu essere specificato con - , ad esempio [a-m] cerca le lettere tra la a e la m. Se il primo carattere tra [ ] ^ , il significato rovesciato, e verr cercato tutto ci che NON quello che compreso tra [ ] [-.0.9] cerca esattamente un - un . o una cifra [^\@ \t] cerca qualsiasi carattere che non sia un @, una tabulazione o uno spazio. Da notare che il \ davanti a @ opzionale, poich il simbolo @ non ha particolari significati in questo contesto; ma funziona anche con \@ Quantificatori: determinano il numero minimo e massimo di volte che un determinato elemento deve ricorrere consecutivamente: ( ) -- raggruppa pi elementi in un pattern da cercare una volta * -- Corrisponde all'intervallo {0, } ovvero da un minimo di 0 volte ad un massimo indefinito + -- Corrisponde all'intervallo {1, } ? -- Corrisponde all'intervallo {0, 1} s -- Opera una sostituzione tr -- Opera una traduzione nella forma 'tr [a-z] [A-Z]' (ovvero rende maiuscoli i caratteri minuscoli e viceversa) "bla" =~ /c*k*z?b+.l/ vero, visto che la c, la k e la z non ci sono, la b appare una volta e la l anche "ccckkzbbb8lZOINX" =~ /c*k*z?b+.l/ vero "blabla" =~ /ah(EEK)?bl/ vero "blaEEKbla" =~ /ah(EEK)?bl/ vero "blaEEKEEKbla" =~ /ah(EEK)?bl/ falso "blaEEKEEKbla" =~ /ah(EEK)+bl/ vero /^([^\@ \t]+\@[^\@ \t])+\s+([-.0-9]+)$/ L'ultimo esempio corrisponde ad una riga che inizia con un numero diverso da 0 di caratteri che non sono n @ n spazi n tabulazioni, poi una @, poi altri caratteri che non sono @ n spazi n tabulazioni, poi alcuni spazi e tabulazioni, poi qualsiasi mistura di '-', '.' e cifra. In parole povere, qualcosa di simile ad un indirizzo e-mail seguito da spazi e qualcosa che si pu ragionevolmente pensare come un numero! In parole ancora pi povere, una volta capito come funzionano le espressioni regolari, pi facile scriverle che spiegarle. /^\s*(\d+)\.(\d+)\.(\d+)\.(\d+)\s*$/ Questo invece potrebbe corrispondere ad un indirizzo IP. Inoltre, se il pattern ha dei sub-pattern (), questi sono assegnati a variabili numerate, $1 per la prima, $2 per la seconda ecc. "129.199.129.13" =~ /^\s*(\d+)\.(\d+)\.(\d+)\.(\d+)\s*$/; $1 129, $2 199, $3 129, $4 13 Un pattern con sostituzione scritto nella forma: $variabile =~ s/pattern/replacement/; Il pattern , come prima, un'espressione regolare, ed il replacement una normale stringa, tranne per il fatto che le variabili sono interpolate al suo interno. Nella maggior parte dei casi, si pu aggiungere il carattere 'g' dopo il replacement, in modo che le parole che corrispondono al pattern siano tutte cambiate, non solo la prima. $waitops{$c} =~ s/:${oldnick}:/:${newnick}:/g Le espressioni regolari lavorano con la funzione split, che prende come argomento un'espressione regolare , una variabile scalare e, volendo, un secondo scalare che specifica il numero massimo di campi in cui splittare il pattern. @array = split(/pattern/, expression); Nel caso pi tipico, si pu voler splittare una linea in parole, come segue: @words = split(/\s+/, $some_line); # se $some_line era "a b c", ora @words ("a", "b", "c")

http://www.html.it/perl/perl_11.htm (2 di 3) [19/06/2001 14.26.00]

PERL: Espressioni regolari

oppure ($val1, $val2) = split(/\s+/, $whatever); # setta $val1 con il primo valore di $whatever e $val2 con il secondo. Eventuali altri valori (terzo, quarto ecc.) vengono scartati

Lezione

successiva

[Sommario]

http://www.html.it/perl/perl_11.htm (3 di 3) [19/06/2001 14.26.00]

PERL: Variabili locali

Variabili locali
In ogni momento si possono dichiarare le variabili locali, cos una sub pu lavorare su queste variabili senza interferire su altre usate da altre sub. Il modo per farlo questo: local($variable, $anothervar, @even_an_array); Questo crea queste nuove variabili nel momento dell'esecuzione, salvando i precedenti valori delle variabili con lo stesso nome (se esistono); in seguito, alla fine del blocco {} in cui erano incluse, queste variabili locali vengono distrutte, ed il loro valore iniziale viene ripristinato. Le variabili locali possono essere inizializzate anche come local($variable, $anothervar)=(value, anothervalue); In particolare, molto comune per le sub iniziare definendo le variabili locali per dare dei nomi agli argomenti che gli sono stati passati: sub addhelp { A questa sub sono passati 2 argomenti, il nome di un comando ed un testo di aiuto local ($cmd, $txt) = @_; $cmd =~ tr/A-Z/a-z/; In questo caso A diventa a, B diventa b ecc., cos il comando reso tutto con lettere minuscole foreach (split(/\n+/, $txt) { next unless $_; skippa le linee vuote push (@help, $_); } } A questo punto le variabili $cmd e $txt scompaiono, cos se la sub addhelp avesse avuto anch'essa una variabile chiamata $cmd, il suo valore originale sarebbe ripristinato

Lezione

successiva

[Sommario]

http://www.html.it/perl/perl_12.htm [19/06/2001 14.26.04]

PERL: Stile

Stile
Il linguaggio Perl, come il C e molti altri, abbastanza strutturato, con i loop solitamente tra delimitatori come {}. E' abbastanza importante scrivere il codice in maniera che questo mostri la sua struttura, in modo che ognuno possa immediatamente vedere dove ogni blocco finisce, e cosa si riferisce a cosa. Ci sono molte possibilit di scrivere la stessa cosa; alcuni scriverebbero cos: sub bla { print "something"; if ($something_else) { &do_something; return; } even_more_stuff; } mentre altri scriverebbero cos: sub bla { print "something"; if ($something_else) { &do_something; return; } even_more_stuff; } La cosa importante essere il pi chiari possibile, e mantenere sempre lo stesso "stile"; l'interprete perl non si interessa assolutamente di come il codice viene scritto, occupandosi solo della sua correttezza e del suo contenuto; inoltre, non bada a spazi vuoti ($abc = 3 identico a $abc=3), tabulazioni e simili che sono utilizzate solo per rendere il codice pi chiaro. Il codice sopra, potrebbe addirittura essere scritto cos: sub bla { print "something"; if (something_else) { &do_something ; return; } even_more_stuff; }

Lezione

successiva

[Sommario]

http://www.html.it/perl/perl_13.htm [19/06/2001 14.26.06]

PERL: Qualche utile consiglio ..

Qualche utile consiglio ..


Per prima cosa, utilizzate spesso (soprattutto in fase di editing) l'opzione -w (come gi detto, la si pu inserire o come '#!/usr/bin/perl -w' oppure come $ perl -w script.pl ; questo vi faciliter non poco le cose, visto che se l'esecuzione del codice si blocca, tramite l'opzione -w avrete pi possibilit di capire dov' l'errore. Se scrivete un file di codice che comprende pi comandi concatenati, vi conviene spesso testare il tutto un paio di istruzioni alla volta, non tutto d'un fiato. Come si fa? Semplice, editate un nuovo file con le 4/5 linee di codice che dovete testare, eseguitelo e vedete se fila tutto liscio. Poi baster solamente reinserire il codice appena testato nel file originale. Sembra un po' una cavolata, ma spesso utilissimo.

Lezione

successiva

[Sommario]

http://www.html.it/perl/perl_14.htm [19/06/2001 14.26.09]

PERL: Dove trovare informazioni

Dove trovare informazioni


Sicuramente la documentazione di Perl, tanto mastodontica quanto completa. I siti www.perl.com/perl (l'homepage del perl, che contiene le novit dal mondo perl, documentazione, faq, codice sorgente, moduli prodotti da terze parti e altre informazioni) e www.perl.org (l'homepage del Perl Institute, che offre vari servizi alla comunit perl). Inoltre, se state utilizzando Windows provate a dare un'occhiata alle risorse perl per Windows (toh, un CGI!) Libri: - "programmare in perl" di Larry Wall, Christiansen e Schwartz, edito da O'Reilly e pubblicato in italiano da Jackson Libri - "learning perl" di R. Schwartz, edito anch'esso da O'Reilly (questo pi una giuda per chi inizia, mentre "programmare in perl" pi un libro di riferimento - "Perl 5 Desktop Reference" di J. Vromans, un manuale di riferimento veloce Usenet: In italiano si trova it.comp.lang.perl, newgroup molto "aperto" al cui interno si trovano (almeno al momento in cui scriviamo) molte persone preparate e disponibili ad aiutare chi si trovi in difficolt. C' poi tutta la gerarchia comp.lang.perl.*, tra i quali il pi interessante (a livello di perl in generale) sembra essere comp.lang.perl.misc. Ovviamente, tutto in inglese!

Lezione

successiva

[Sommario]

http://www.html.it/perl/perl_15.htm [19/06/2001 14.26.12]

PERL: Utilizzare i moduli

Utilizzare i moduli
Partiamo innanzitutto dalla domanda che qualcuno potrebbe porgersi: cosa sono i moduli? Un modulo un insieme di operazioni che possono essere utilizzate all'interno di qualsiasi script in Perl semplicemente richiamando il modulo a cui si fa riferimento e le operazioni che di questo ci interessa utilizzare. Ovviamente, all'interno di uno script si possono richiamare diversi moduli a seconda di ci che effettivamente serve a chi sta programmando; inoltre, alcuni moduli sono dipendenti a loro volta da altri moduli: se, ad esempio, si vuole utilizzare il modulo "A" che necessita del modulo "B", sar necessario all'interno dello script richiamare solamente il modulo "A" con la sicurezza che esso stesso andr a cercare ed utilizzare il modulo "B". I moduli, all'interno degli script, si richiamano semplicemente con una riga simile a : use Modulo; equivalente alla scrittura: BEGIN { require "Modulo.pm"; # indica all'interprete la necessit di precaricare il modulo Modulo->import(); # importa la lista completa di simboli contenuti nel modulo } Ma cosa significa veramente utilizzare un modulo? Se andiamo a leggere il codice di qualsiasi modulo, possibile che sia presente una lista con il nome @EXPORT: utilizzare quindi il modulo significa utilizzare i simboli che in essa sono contenuti, precaricandone la lista completa (nel caso si utilizzi "use Modulo;") oppure solamente quelli che ci interessano (utilizzando "use Modulo LIST", dove LIST la lista dei simboli che ci interessa usare) in fase di compilazione dello script. Solitamente, i moduli hanno un nome che termina con ".pm" (English.pm, Apache.pm e via dicendo, che comunque va omessa nel caso si utilizzi "use Modulo", come abbiamo visto sopra) per cui possono essere semplicemente localizzabili all'interno della directory "lib" o equivalente del Perl (potrebbe essere /usr/lib/perl5). In questa directory, inoltre, sono presenti alcune directory: Apache, CGI, DBI, WWW, Text ecc. I moduli presenti in queste directory sono tutti legati all'argomento deducibile dal nome della directory: ad esempio, nella directory CGI sono presenti tutti i moduli che hanno a che fare con i CGI (processano i dati del form ecc.), nella directory Apache tutti quelli che hanno a che fare con Apache e via di seguito. Prendiamo ad esempio il modulo Form.pm contenuto nella directory CGI: questo sar comunemente chiamato CGI::Form per indicare che esso contenuto nella directory CGI e che, quindi, ha a che fare con i CGI. Inoltre, per molti moduli presente della documentazione (POD) inclusa direttamente nel codice del modulo nella forma: =head1 NAME Modulo.pm - Serve per fare ... =head1 ABSTRACT Con questo modulo possibile fare ... =head1 INSTALLATION: Questo modulo si installa ..... Questo formato di documentazione (che viene ignorata dall'interprete nella lettura del

http://www.html.it/perl/perl_16.htm (1 di 4) [19/06/2001 14.26.16]

PERL: Utilizzare i moduli

modulo se richiamato all'interno di uno script) leggibile a fatica: per leggerla comodamente sar necessario il comando perldoc nome_modulo.pm che formatter la documentazione visualizzandola come solitamente avviene per le pagine di manuale, rendendola quindi umanamente leggibile! Il risultato sar molto simile a: Modulo.pm(3pm) User Contributed Perl Documentation Modulo.pm(3pm) NAME Modulo.pm - Serve per fare ecc. ecc. ecc. ecc. ecc. ecc. ecc. ecc. ecc. ecc. ecc. ecc. .... ABSTRACT Con questo modulo possibile fare ... INSTALLATION: Questo modulo si installa ..... Senza dubbio, molto pi comoda da leggere nonch impaginata a dovere! Prendiamo ora un modulo completo e vediamo qualche esempio pratico su come si pu con questo operare. Prima di tutto, vediamo la documentazione: utilizzeremo qui il modulo "English.pm", che utilizza i nomi inglesi per le variabili di punteggiatura (ad esempio, $! diventa $OS_ERROR, $< diventa $REAL_USER_ID e via dicendo), alquanto stringata ma utile ai nostri scopi. Leggendo il file, la documentazione (per non dilungarci troppo e inutilmente ne abbiamo tagliato alcune parti!): =head1 NAME English - use nice English (or awk) names for ugly punctuation variables =head1 SYNOPSIS use English; ... if ($ERRNO =~ /denied/) { ... } =head1 DESCRIPTION This module provides aliases for the built-in variables whose names no one seems to like to read. Variables with side-effects which get triggered just by accessing them (like $0) will still be affected. Letta invece con perldoc English.pm risulta: NAME English - use nice English (or awk) names for ugly punctuation variables SYNOPSIS use English; ... if ($ERRNO =~ /denied/) { ... } DESCRIPTION This module provides aliases for the built-in variables whose names no one seems to like to read. Variables with side-effects which get triggered just by accessing them (like $0) will still be affected.

http://www.html.it/perl/perl_16.htm (2 di 4) [19/06/2001 14.26.16]

PERL: Utilizzare i moduli

Non credo serva aggiungere altro se non che, con il comando "pod2man" potrete convertire la documentazione nel formato classico delle pagine di manuale, redirigendo il tutto ad un file che potr essere poi letto con "man -l nomefile". Un veloce esempio: pod2man Modulo.pm > file per creare il file; man -l file per leggerlo tramite il comando "man" Ora vediamo brevemente come utilizzare i moduli all'interno degli script: utilizzeremo qui un modulo che mi piace molto, ossia "perlmenu.pm" che permette di creare dei comodi menu per gli script. Prendete questo codice d'esempio: #!/usr/bin/perl $| = 1; BEGIN { $Curses::OldCurses = 1; } use Curses; use perlmenu; &menu_init(1, " Scegli: "); &menu_item("Prima opzione", "1"); &menu_item("Seconda opzione", "-b"); $sel=&menu_display_mult("$ppppp"); if ($sel eq '1') { # Fai una determinata cosa } elsif ($sel eq '2') { # Fai un'altra cosa } else {exit} Vediamo di sottolinearne le peculiarit, senza soffermarci sulle specifiche richieste del modulo in questione quali "$|=1" oppure "BEGIN { $Curses::OldCurses = 1; }" o ancora "use Curses" (richieste dal modulo per alcune sue funzioni). La riga dove il modulo "perlmenu.pm" viene richiamato la quarta: semplicemente, abbiamo utilizzato la sintassi "use Modulo", dove a Modulo abbiamo sostituito il nome "perlmenu". Iniziano poi delle subroutines: ma dove sono definite? Andate a leggere il codice del modulo alla riga 343 (circa) dove verr spiegato cos' menu_init e, poco sotto, sar possibile vedere il codice della suboutine nella forma: sub menu_init { ... } e capire a fondo la sua funzione; in due parole, questa sub non fa altro che dare vita ad un menu utilizzando le librerie Curses. La stessa cosa avviene per &menu_item, solo che questa subroutine ha il compito di inserire degli elementi nel menu. Il resto del codice un semplice blocco if/else e l'output dello script su terminale risullter:

Scegli: 1) (Done with selections) -> 2) [X] Prima opzione 3) [ ] Seconda opzione

(All)

h)elp q)uit u)p a)ll m)atch c)lear b)egin e)nd r)efresh

La cosa che qui pi ci interessa, comunque, non il layout dello script risultante, ma come pu essere richiamato un modulo e come possono essere utilizzati i simboli, le operazioni e le funzioni che esso contiene. Per sapere utilizzare correttamente un modulo comunque necessario leggere attentamente la documentazione a suo corredo: se ad alcuni potr sembrare una banale perdita di tempo, soprattutto per i moduli "semplici", sottolineiamo qui che ne varr la pena per diminuire il tempo necessario per la scrittura del vostro codice con
http://www.html.it/perl/perl_16.htm (3 di 4) [19/06/2001 14.26.16]

PERL: Utilizzare i moduli

la sicurezza di utilizzare funzioni ed operazioni gi testate da persone preparate e quindi affidabili sotto tutti i punti di vista; perch quindi perdere tempo a scrivere funzioni quando queste esistono gi in determinati moduli e possono essere pi sicure o almeno pi performanti di quelle che andremo noi a scrivere? Un'ultima cosa prima di chiudere: intanto, se utilizzate un modulo all'interno di uno script, ovviamente anche le altre persone che utilizzeranno lo script avranno bisogno dello stesso modulo per la corretta escuzione dello script: in caso contrario l'interprete Perl visualizzer un messaggio d'errore simile a: Can't locate Modulo.pm in @INC (@INC contains: /usr/lib/perl5/i386-linux/5.004 /usr/lib/perl5 /usr/local/lib/site_perl/i386-linux /usr/local/lib/site_perl .) at prova.pl line 2. BEGIN failed--compilation aborted at prova.pl line 2. Quindi, se il vostro script utilizza dei moduli e sar utilizzato anche da terzi, non dimenticate di ricordare loro che devono procurarsi il modulo in questione o non riusciranno mai ad eseguire lo script.

[Sommario]

http://www.html.it/perl/perl_16.htm (4 di 4) [19/06/2001 14.26.16]

http://www.html.it/linguaggi.htm [19/06/2001 14.26.38]

HTML.it

PROGRAMMAZIONE | HARDWARE | MAC | LINUX | WAP | PALMARI | ADSL | FLASH5 | FREEASP | CGI | GIF | FONT FORUM CHAT EDICOLA DOWNLOAD

cerca

HTML.it su cd-rom E' in vendita il cd-rom di HTML.it, comodamente navigabile off-line e senza pubblicit. GLi script, le guide, i tutorial, i download e tutto il resto >>

PARTNER EDITORIALI HARDWARE ZONE TUTTOGRATIS MATCH MUSIC CWW TECNOLOGICI OMNIBIT SWISSCOM HARDWARE UPGRADE LINK Web Hosting Italiano Hosting di qualit Web Hosting/Housing Domini .it Internet-Service Domini a 25.000 lire Guadagnate il 51% Hosting di qualit

Guida a Corel Draw Prime 9 lezioni della guida al programma di grafica Download di oggi: Auto Graphics Html Servizio free di oggi: Eudoramail GUIDE DI BASE Guida HTML, fogli di stile, XML, usabilit, accessibilit disabili, HTML per bambini GUIDE SOFTWARE Front Page, Dreamweaver, 1st Page 2000, IIS, Apache, CFusion HOSTING E HOUSING Hosting, housing, domini, guida all'acquisto SERVIZI PER WEBMASTER Controllo di qualit, servizi free, sondaggi, Webmaster finder, Chat, test MAILING LIST GIF, Javascript, pillole, archivio arretrati FORUM DI DISCUSSIONE HTML, Flash, Asp/Php/Javascript, webgrafica, cgi, hosting/housing, off-topic LINGUAGGI PER IL WEB Javascript, ASP, PHP, JSP, CGI, Perl, Dhtml, SQL, VBscript, Smil, WML RACCOLTE SCRIPT 300 Javascript, 550 applet Java, 130 Dhtml, 264 script Cgi GRAFICA PER IL WEB Photoshop, Psp, Fireworks, Corel Draw FAQ HTML, Css, Javascript, ASP, PHP, Perl, SQL, Coldfusion, Apache, Smil APPROFONDIMENTI Diritto, fisco, marketing, advertising, libri OSSERVATORI Browser, domini, portali, motori di ricerca, lavoro, leggi, pubblicit, ecommerce

STIAMO CERCANDO - Collaboratori Per articoli, guide e altri contenuti da pubblicare on-line

PERCORSI DI NAVIGAZIONE DOWNLOAD Principianti, avanzato, Editor HTML, grafica, FTP, XML, Css professionale ...

http://www.html.it/ (1 di 2) [19/06/2001 14.27.00]

HTML.it

Dossier: HDSL Cos', come funziona e a chi serve realmente una connessione HDSL.

Nessun accordo fra Microsoft e Aol Salta la trattativa fra Microsoft e America on line-Time Warner

Edicola on-line del articoli hi-tech selezionati e proposti dalla Redazione ULTIM'ORA
Oracle in ripresa Microsoft entra nella telefonia mobile UE: privacy anche fuori dallUnione ePlanet salvata da Angel Venture Microsoft si compra il marchio Xbox Il Numtel ancora a picco: meno 3,96% Le tastiere wireless a rischio sicurezza ULTIMI FOCUS Maghun contro l'ICANN Netscape vivo Largo a chi masterizza Wall Street Journal vs Microsoft Formazione e Net Economy Sun sfida Microsoft Excite lascia l'Europa

ALTRE RUBRICHE DOSSIER Edicola Off-line, storie della settimana, Newsletter, Webpromotion, MP3, WebTv, Statistiche, flat rate, pubblicit, editoriali, verba volant, Forum lavoro ...

Le distribuzioni Linux Le maggiori dieci distribuzioni Linux commentate da HTML.it. HARDWARE Articoli e prove, news dal Web, download LINUX Articoli, news dal Web, download WAP Guida WML, WMLscript, HDML, faq, test DOWNLOAD Hardware, macintosh, Linux ... FORUM DI DISCUSSIONE Hardware, Mac, Linux, palmari, software, programmazione, Wap

Guida a Linux Che cos' e come si installa il sistema operativo Linux


PROGRAMMAZIONE Visual Basic, Delphi, C++, C, Java MACINTOSH Articoli e tutorial, news dal Web, download PALMARI Palm, Pocket, Psion, confronta, articoli, news ALTRI SERVIZI Siti del giorno, glossario ADSL Tutte le offerte, le migliori, le pi cliccate, le pi economiche, faq, articoli

Pubblicit | Supportaci | HTML.it in Home page | contatti | staff | Copyright | Privacy

http://www.html.it/ (2 di 2) [19/06/2001 14.27.00]