Laboratorio Di Basi Di Dati 12 P H P Gestione Di File X M L
1. Corso di Basi di Dati e Laboratorio
PHP e XML
Alfio Ferrara - Stefano Montanelli
A.A. 2005/2006 Basi di Dati e Laboratorio 1
Introduzione
L’eXtensible Markup Language è un meta
linguaggio di marcatura che costituisce un
sottoinsieme proprio di SGML
SGML
XML
XHTML
HTML
…
A.A. 2005/2006 Basi di Dati e Laboratorio 2
Esempio
<?xml version=“1.0” encoding=“UTF-8”>
<!–- XML document about books -->
<bookstore>
<book genre=quot;autobiographyquot;>
<title>
The Autobiography of Benjamin Franklin
</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price coin=“USDollar”>8.99</price>
</book>
<book genre=quot;novel”>
<title>The Confidence Man</title>
…
</book>
</bookstore>
A.A. 2005/2006 Basi di Dati e Laboratorio 3
1
2. Vantaggi
• Definizione formale della struttura del documento
• Convalida della struttura
• Flessibilità nel layout
• Indipendenza dalla piattaforma
• Definizione parziale della semantica del documento
• Definizione di una base di dati semi-strutturata
Riferimento:
World Wide Web Consortium (W3C)
http://www.w3.org
A.A. 2005/2006 Basi di Dati e Laboratorio 4
Sintassi XML
Dal punto di vista sintattico un documento
XML ben formato:
• E’ composto da tag chiusi
• I tag non sono sovrapposti
• E’ presente la dichiarazione XML
• Il documento ha una struttura ad albero
composta da nodi dotati di una sola radice
Non è obbligatorio un DTD esplicito
A.A. 2005/2006 Basi di Dati e Laboratorio 5
Sintassi XML – tag e attributi
<?xml version=“1.0” encoding=“UTF-8”>
<!–- XML document about books --> dichiarazione
<bookstore> attributo commento
<book genre=quot;autobiographyquot;> apertura
<title>
The Autobiography of
elemento contenuto
Benjamin Franklin
</title>
</book> chiusura
radice
</bookstore>
A.A. 2005/2006 Basi di Dati e Laboratorio 6
2
3. Sintassi XML– struttura del documento
La struttura di un documento XML è definita dal suo
DTD ed è costituita dalle relazioni fra gli elementi
Essi devono dare origine ad una struttura ad albero
ben formata:
radice
nodo nodo
foglia foglia foglia
A.A. 2005/2006 Basi di Dati e Laboratorio 7
Sintassi XML– esempio di struttura
La struttura di un documento XML è definita dal suo
DTD ed è costituita dalle relazioni fra gli elementi
Essi devono dare origine ad una struttura ad albero
ben formata:
bookstore
book book
title title author
A.A. 2005/2006 Basi di Dati e Laboratorio 8
Sintassi XML – tipologie di errore
Errori di struttura
radice
nodo nodo nodo
foglia
foglia
Errori di sintassi
<E1>testo<E2>testo</E2>
<E1>testo<E2>testo</E1></E2>
A.A. 2005/2006 Basi di Dati e Laboratorio 9
3
4. DTD – struttura logica
I DTD (Document Type Definition) consistono in
una grammatica formale attraverso la quale è
possibile definire:
• Elementi
contenuto La gerarchia fra elementi viene
definita ricorsivamente,
occorrenze ponendo gli elementi figli
come contenuto degli
• Attributi elementi genitore
tipo
valori possibili
opzionalità
A.A. 2005/2006 Basi di Dati e Laboratorio 10
DTD – sintassi
Le definizioni ammesse sono:
• Elementi <!ELEMENT …>
• Attributi <!ATTLIST …>
• Notazioni <!NOTATION …>
• Entità <!ENTITY …>
Una notazione è un qualunque dato che non
può essere interpretato (o non si vuole
venga interpretato) dal processore XML.
Può trattarsi sia di dati binari che di testo
A.A. 2005/2006 Basi di Dati e Laboratorio 11
DTD – elementi compositi
Esempio:
<!ELEMENT book(title, author+, price?)>
Elementi compositi Elenco dei sotto-elementi
<!ELEMENT author(first-name+, last-name)>
Documento conforme Occorrenze
<book >
<title>Obsession</title> Fattori di ripetizione
<author> ? Zero o più occorrenze
<first-name>Henry</first-name> + Una o più occorrenze
<first-name>James</first-name> * Zero o più occorrenze
<last-name>York</last-name> (a|b) a o b, ma non entrambi
</author> (a,b) a e b in sequenza
</book>
A.A. 2005/2006 Basi di Dati e Laboratorio 12
4
5. DTD – elementi semplici
Esempi:
Testo
<!ELEMENT title(#PCDATA)>
Vuoto
<!ELEMENT image EMPTY>
Qualsiasi dato
<!ELEMENT comment ANY>
<!ELEMENT chapter(#PCDATA|section)+>
Un elemento può contenere sia dati semplici che sotto-
elementi
A.A. 2005/2006 Basi di Dati e Laboratorio 13
DTD – attributi
Esempi:
<!ATTLIST image file NMTOKEN #IMPLIED
size CDATA “1MB”>
<!ATTLIST book genre (autobiography|novel)
ISBN ID #REQUIRED
references IDREFS>
<!ATTLIST chapter name CDATA #REQUIRED>
Elemento Attributo Tipo Vincolo
A.A. 2005/2006 Basi di Dati e Laboratorio 14
DTD – notazioni
Esempi:
<!NOTATION jpeg SYSTEM “C:APPSSHOWJPEG.EXE”>
<!NOTATION tiff SYSTEM “C:APPSSHOWTIFF.EXE”>
...
<!ELEMENT image EMPTY)>
<!ATTLIST image format NOTATION (jpeg | tiff)>
A.A. 2005/2006 Basi di Dati e Laboratorio 15
5
6. DTD – entità
Nel DTD:
<!ENTITY xml “eXtensible Markup Language”)>
...
Nel documento XML:
<chapter>
<section>
<name> related technologies </name>
<paragraph> &xml; technology comprises ...
</paragraph>
...
</section>
</chapter>
A.A. 2005/2006 Basi di Dati e Laboratorio 16
DTD – entità
Nel DTD:
<!ENTITY structure “(paragraph|list|table)”>
...
<!ELEMENT section (name, (%structure;)*>
Nel documento XML:
<chapter>
<section>
<name> related technologies </name>
<paragraph> &xml; technology comprises ...
</paragraph>
...
</section>
</chapter>
A.A. 2005/2006 Basi di Dati e Laboratorio 17
Dal DTD al documento XML
<!DOCTYPE bookstore SYSTEM “books.dtd”>
Books.dtd <bookstore>
<!ENTITY structure <book genre=“technical” ISBN=“01”>
“(paragraph|list|table)”>
<title> XML Companion </title>
<!ELEMENT bookstore(book+)>
<!ELEMENT book(title, author+, <author>
chapter+)> <first-name> Neil</first-name>
<!ATTLIST book genre (technical | <last-name> Bradley</last-name>
fiction)
ISBN ID #REQUIRED
</author>
references IDREFS> <chapter name=“Introduction”>
<!ELEMENT title(#PCDATA)> XML raises as a standard ...
<!ELEMENT author(first-name+,
<section>
last-name)>
<!ELEMENT first-name(#PCDATA)> <name> XML Technology </name>
<!ELEMENT last-name(#PCDATA)> ...
<!ELEMENT </section>
chapter(#PCDATA|section)+>
<!ATTLIST chapter name CDATA
</chapter>
#REQUIRED> ...
<!ELEMENT section (name, </book>
(%structure;)*> ...
</bookstore>
A.A. 2005/2006 Basi di Dati e Laboratorio 18
6
7. DTD – principi di progettazione
La definizione di un DTD per un insieme di
documenti XML può avere lo scopo di:
• Rappresentare documenti XML esistenti
• Definire uno standard per la
documentazione in un dato contesto
• Rappresentare schemi di basi di dati
esistenti
A.A. 2005/2006 Basi di Dati e Laboratorio 19
DTD regole di definizione
La definizione di un DTD richiede una fase di
analisi del materiale documentale e dei dati
esistenti:
• per ogni elemento di un documento occorre chiedersi se
può essere ripetuto o generalizzato, quale rapporto abbia
con altri elementi, etc
• Definire lo scopo della marcatura, di carattere sintattico,
strutturale o semantico
• Definire elementi e attributi possibili in un documento
A.A. 2005/2006 Basi di Dati e Laboratorio 20
DTD regole di definizione
Si passa dunque a progettare il DTD
decidendo:
• Nomi semanticamente ricchi e brevi per
i tag
• La struttura del documento (albero)
• Caratteristiche e vincoli per entità e
attributi
• Gli elementi nell’ordine: notazioni,
entità, elementi, attributi
A.A. 2005/2006 Basi di Dati e Laboratorio 21
7
8. XML Schema – caratteristiche
• Standard per la progettazione logica
• Descrive la struttura di documenti XML
• Utilizza la sintassi XML (è processabile da
un parser XML)
• Presenta alcune nuove caratteristiche
rispetto ai DTD (tipi dei dati etc.)
A.A. 2005/2006 Basi di Dati e Laboratorio 22
XML Schema – esempio
<schema>
<complexType name=quot;tBookquot;>
<element name=”titlequot; type=quot;string”
minOccurs=’1' maxOccurs='1'/>
<element name=”pages” type=quot;Integerquot;
minOccurs='0' maxOccurs='1'/>
<element name=”author” type=“tAuthorquot;
minOccurs=‘1' maxOccurs=‘unbounded'/>
</complexType>
<element name=”bookquot; type=quot;tbookquot;/>
<complexType name=“tTechnicalBook” base=“tBook”
derivedBy=“extension”>
<element name=”areaquot; type=quot;stringquot;
minOccurs=’1' maxOccurs=’unbounded'/>
</complexType>
...
</schema>
A.A. 2005/2006 Basi di Dati e Laboratorio 23
Il modello DOM
La struttura di un documento XML richiede che gli elementi
e gli attributi che la compongono siano visibili ed accessibili
per applicazioni esterne (ad esempio per le operazioni di
parsing)
Nasce il problema di una interfaccia (API) fra XML e le
applicazioni esterne (a prescindere dal linguaggio in cui
sono scritte)
Per poter implementare nei diversi linguaggi delle interfacce
verso XML occorre poter fare riferimento ad un protocollo
univoco
Nasce lo standard W3C DOM (Document Object Model)
A.A. 2005/2006 Basi di Dati e Laboratorio 24
8
9. DOM – caratteristiche
Modello ad oggetti di documenti XML
L’idea è quella che i diversi linguaggi (Java, C++,
Python, php etc.) mettano a disposizione dello
sviluppatore classi di oggetti utili a manipolare e
creare elementi e attributi XML
A.A. 2005/2006 Basi di Dati e Laboratorio 25
DOM – modello di rappresentazione
Il DOM definisce una struttura ad albero per ogni
oggetto, allo scopo di rappresentarne le
caratteristiche: <book type=“technical” ISBN=“01”>
<title> XML Companion </title>
<author>
<first-name>Neil</first-name>
<book> <last-name>Bradley</last-name>
Type = </author>
“technical” ...
</book>
<title> <author>
ISBN =
“01”
Sono previsti metodi
XML Companion <first-name> per creare, manipolare,
<last-name> avere informazioni da e
aggiornare i diversi
Neil
Bradley oggetti
A.A. 2005/2006 Basi di Dati e Laboratorio 26
XPATH – caratteristiche
Il linguaggio XPATH è nato per
rappresentare la posizione delle entità entro
la struttura di un documento XML. Tale
posizione è rappresentata da un percorso
che permette di individuare l’elemento
XPATH è utilizzato da altri linguaggi della
famiglia XML (XSLT ed altri) per fare
riferimento agli elementi del documento XML
A.A. 2005/2006 Basi di Dati e Laboratorio 27
9
10. XPATH – espressioni
Un elemento può essere indicato da:
percorsi assoluti root
/
book article
/book/title
title
percorsi relativi
I percorsi relativi fanno riferimento
title
al path che è necessario percorrere
author/first-name a partire dal contesto nel quali si è
../title collocati
Una espressione XPATH indica un elemento se esiste un
elemento del documento che la soddisfa
A.A. 2005/2006 Basi di Dati e Laboratorio 28
XPATH – caratteri speciali
Sono disponibili caratteri speciali che indicano in astratto
parti dei percorsi
book/*/section (* indica un elemento qualsiasi)
book/chapter/section
book//section (indica il percorso fra book e section)
book/chapter/part/section
.//section (. indica la attuale posizione)
A.A. 2005/2006 Basi di Dati e Laboratorio 29
XPATH – espressioni di ricerca
elementi alternativi
book/*/first-name | book/*/last-name
ricerca degli attributi
book@genre
A.A. 2005/2006 Basi di Dati e Laboratorio 30
10
11. XPATH – predicati
book[title = quot;XML Companionquot;]
book[@genre = quot;technicalquot;]
book/chapter[name=“help” | name=“Support”]
book/chapter[position() = 1]
book[count(chapter) < 10]
book[title contains(text(), quot;XMLquot;)]
A.A. 2005/2006 Basi di Dati e Laboratorio 31
XSL – XML Style Sheet Language
Secondo lo stesso principio dei CSS i fogli di stile
XSL appongono una formattazione ad un
documento XML
Un processore XSL si occupa di mostrare il
documento XML secondo un layout coerente a
quello definito attraverso l’XSL
Le istruzioni XSL possono risiedere sia nel
documento XML che in un file esterno
A.A. 2005/2006 Basi di Dati e Laboratorio 32
XSLT – XSL transformation
L’XSLT è lo standard proposto per la trasformazione di
documenti XML in altri formati (o in XML formattato)
attraverso l’uso di fogli di stile
Si prevede di usare un processore (xsltproc, 4XSLT, etc.)
che filtra il documento XML attraverso il foglio di stile XSL e,
sequenzialmente, produce in output il documento originale
ad eccezione delle parti su cui l’XSL definisce delle regole
di trasformazione
Queste ultime risultano trasformate nell’output
A.A. 2005/2006 Basi di Dati e Laboratorio 33
11
12. XSLT – processore XSLT
input output
XSLT
Doc
XSL(T) text
Processor doc
oppure
XML - XML
Doc - HTML
- XML + XSL
- TeX
- ...
A.A. 2005/2006 Basi di Dati e Laboratorio 34
XSLT – regole di trasformazione
<stylesheet xmlns = quot;http://www.w3.org/XSL/Transform/1.0quot;>
Elemento root Namespace di default
<template match = quot;book/authorquot;>
...
</template>
Indica l’elemento su cui va
... Applicata la trasformazione
(l’elemento viene individuato
<template match = quot;book/titlequot;>
... attraverso una
</template> espressione XPATH)
</stylesheet>
Regola di
trasformazione
A.A. 2005/2006 Basi di Dati e Laboratorio 35
XSLT – regole di trasformazione
Processamento ricorsivo
<template match = quot;bookstorequot;>
<html>
<head><title> Technical Books </title></head>
<apply-templates/>
</html>
</template> Processamento anche dei nodi figli
Trasformazione basata su predicati
<template match = quot;bookquot;>
<apply-template
select=quot;book[@genre=quot;technicalquot;]quot;/>
... Predicato XPath
</template> Che seleziona
i nodi figli
A.A. 2005/2006 Basi di Dati e Laboratorio 36
12
13. XSLT – regole di trasformazione
dichiarazione Variables
<variable name = quot;alignmentquot;> justify
</variable>
... Valore della variabile
<template match = “sectionquot;>
<block text-align = quot;{$alignment}quot;>
<value-of select = quot;.quot;>
</block>
</template>
Inserisce il contenuto dell’elemento
L’XSLT prevede anche l’uso di elementi
procedurali, controlli di flusso etc.
A.A. 2005/2006 Basi di Dati e Laboratorio 37
XSLT – esempio di trasformazione
<testo>
<autore>N. Bradley</autore>
<titolo>Tutorial</titolo>
<sottotitolo>XML</sottotitolo> Frammento XML
<s1>…</s1>
</testo>
<xsl:stylesheet version=quot;1.0“ xmlns:xsl=quot;http://www.w3.org/1999/XSL/Transformquot;
<xsl:output method=“htmlquot; indent=quot;yesquot; encoding=quot;ISO-8859-1quot;/>
<xsl:template match=quot;/quot;>
<html><head><title><xsl:value-of select=quot;titolo”></head>
<body><div>
<h1><xsl:value-of select=quot;//testo/titolo“/></h1>
<h2><xsl:value-of select=quot;//testo/sottotitolo“/></h2>
<span>di <i><xsl:value-of select=quot;//testo/autore“/></i></span></div> …
<xsl:for-each select=quot;//s1quot;>
<div><xsl:apply-templates/></div>
</xsl:for-each>
</body></html>
</xsl:template> Frammento XSL
<xsl:template match=“s1quot;>… </xsl:template>
…
</xsl:stylesheet>
A.A. 2005/2006 Basi di Dati e Laboratorio 38
XSLT – esempio di trasformazione
Frammento di output
<html>
<head>
<title>Tutorial</title>
</head>
<body>
<div>
<h1>Tutorial</h1>
<h2>XML</h2>
<span>di <i>N. Bradley</i></span>
</div>
<div>
…
</div>
…
</body></html>
A.A. 2005/2006 Basi di Dati e Laboratorio 39
13
14. Corso di Basi di Dati e Laboratorio
XML con PHP
Lettura e creazione di documenti XML
A.A. 2005/2006 Basi di Dati e Laboratorio 40
Parsing di XML
• SAX (Simple API for XML)
– Il parser scorre il documento XML attivando
degli eventi in corrispondenza dell’apertura e
chiusura dei tag. Il programma si occupa di
gestire gli eventi sollevati dal parser
• DOM (Document Object Model)
– Il parser analizza l’intero documento e ne
genera una rappresentazione ad albero in
memoria. A quel punto il programma si occupa
di navigare l’albero che rappresenta il
documento
A.A. 2005/2006 Basi di Dati e Laboratorio 41
SAX e DOM
esempio
a
b
SAX testo1
a
<?xml version=“1.0” encoding=“ISO-8859-1” ?> b
<esempio>
<a> testo2
<b>testo1</b> c
</a>
<a> testo3
<b>testo2</b>
<c>testo3</c>
</a> esempio
</esempio>
DOM a a
b b c
testo1 testo2 testo3
A.A. 2005/2006 Basi di Dati e Laboratorio 42
14
15. Soluzioni PHP
• Librerie native
– SAX
– DOM
• SimpleXML
• PEAR
A.A. 2005/2006 Basi di Dati e Laboratorio 43
SAX
• Creazione di un handle al parser XML
– $xml = xml_parser_create(‘UTF-8’);
• Inizializzazione degli handler per gli eventi SAX
– xml_set_element_handler($xml, ’opentag’,’closetag’);
– xml_set_character_data_handler($xml, ’content’);
• Prima di eseguire il parsing occorre
implementare gli handler specificati in
precedenza
• Il parser ha delle opzioni, come ad esempio il
folding
– xml_parser_set_option($xml,
XML_OPTION_CASE_FOLDING, false)
A.A. 2005/2006 Basi di Dati e Laboratorio 44
Handler
• Esempio di implementazione degli handler
– function opentag($xml,$tag,$attr){…}
– function closetag($xml,$tag){…}
– function content($xml,$data){…}
A.A. 2005/2006 Basi di Dati e Laboratorio 45
15
16. DOM
• Inizializzazione di un nuovo oggetto DOM
– $dom = new DomDocument();
– $dom->load(‘file’);
• Individuazione del nodo radice
– $root = $dom->documentElement;
• Individuazione dei nodi figli
– $root->childNodes;
• Individuazione del tipo di nodo
– $node->nodeType;
A.A. 2005/2006 Basi di Dati e Laboratorio 46
Tipi di nodo
• I possibili tipi di nodo sono
– XML_TEXT_NODE
– XML_ELEMENT_NODE
• Altri metodi utili del nodo
– nodeName
– getAttributeNode
• Altri metodi della classe
– getElementsByTagName
A.A. 2005/2006 Basi di Dati e Laboratorio 47
Uso di XPath
• Un nodo può essere ricercato anche per
mezzo di espressioni XPath
– $x = new DomXPath($dom);
– $nodes = $x->query(“interrogazione xpath”,
$dom->documentElement);
A.A. 2005/2006 Basi di Dati e Laboratorio 48
16
17. Creazione di documenti
• Creazione dell’elemento radice
– $root->createElement(‘nome’);
– $dom->appendChild($root);
• Creazione degli attributi
– $node->setAttribute(“nome”, “valore”);
• Inserimento dei nodi
– $node->appendChild($nuovo_nodo);
• Inserimento di nodi di testo
– $nuovo_nodo->appendChild($dom->
createTextNode(“contenuto”));
• Salvataggio
– $dom->saveXML();
A.A. 2005/2006 Basi di Dati e Laboratorio 49
Altre librerie di supporto
• Oltre alle principali PHP offre anche altre
librerie di supporto
• Si ricordano in particolare:
– SimpleXML
– PEAR::XML_Tree e PEAR::XML_RSS
– PEAR::XML_Transformer (alternativo a XSLT)
– PEAR::SOAP
A.A. 2005/2006 Basi di Dati e Laboratorio 50
17