fishScript.com d
Home| Progetto| Web| Faq| Acronimi

Argomenti

Documenti pubblicabili:1120
Scripts:1282
Documenti non pubblicabili:162
Categorie tematiche:68
.Net
   |_C#
   |_Visual basic.net
   |_Asp.net
Active Server Pages
C++
Cascade Style Sheet
JavaScript
Mysql
Php
Xml
Java
   |_Java 2 Micro Edition
   |_Java server pages
   |_Java Servlet
Oracle
   |_PLSQL
PostgreSQL
Unix



Oracle... Script: Conditional update



Php... Tip: Ignorare gli errori
Php... Faq: What is PHP?


A User Agent, like a web browser, uses HTTP to request a HTML document



In programming the danger of exploring the small details of coding is that you get obsessed with every line of code you write, thereby greatly reducing productivity.
In general, is not worth obsessing over code.
On the other hand you should code with deliberation and intent. Steven Feurstein Oracle Magazine July /August 2004

A User Agent, like a web browser, uses HTTP to request a HTML document

Php

Home >Php > Estrazione di dati da un file XML

Stampa  Stampa


Obiettivo

L'obiettivo di questo tutorial è di accedere e leggere dei dati in formato XML e visualizzarli in una pagina web attraverso Php.
Esistono diversi tecniche e strumenti per eseguire il parsing di un file Xml con Php.
In questo caso utilizzerò l'oggetto Php xml_parser_create() che permette appunto di creare un parser e restituisce una risorsa che può essere sfruttata da altre funzioni Xml di Php.
Di fatto, viene eseguito un parsing e i valori degli elementi vengono caricati in una matrice che poi viene "scorsa" e formattata da un apposita funzione.
Di fatto ho utilizzato questo codice per visualizzare in un portale delle informazioni approssimativamente strutturate secondo il RSS.

l file xmlnews.zip contiene il codice completo per la pagina xmlnews.php come per il file xmlnews.xml. Il codice è descritto interamente, pertanto coloro che hanno già conoscenza di Php possono seguire l'esempio copiando e incollando il codice all'interno di una pagina php, che ho chiamato appunto xmlnews.php.

Prerequisiti

Per questo tutorial occorre una buona conoscenza di PHP.
E' pertanto necessario disporre di un web server (per esempio Apache) configurato con il motore Zend /Php. Il codice è stato testato con le versioni di PHP 4.2 che con la versione 5.

Il file Xml

Come si può vedere il file news.xml è diviso in due principali nodi <left> e <right> i quali compongono i vari <item>, dove sono memorizzati elementi come il titolo, la descrizione, il link o l'url di un'immagine:

<?xml version="1.0" encoding="iso-8859-1"?>
<list>
<left>
<item>
<image>java.jpg</image>
<title>Jsp</title>
<link>http://www.fishscript.com/?a=JSP</link>
<description>Java server pages</description>
</item>
(...)


E' compito del codice Php leggere e comporre con l'appropriato html questi valori.

Classe e variabili

Nella classe News_Parser sono raggrupate le funzioni necessarie per raggiungere l'obiettivo fissato.
Subito vengono dichiarate le variabili necessarie.

<?php
// Marco Magnani
// ©2005 www.fishscript.com
// Use this script as you like it
class News_Parser{
var $fp;
var $parser;
var $folding = true;
var $item_counter = 0;
var $dati = array();
var $blocco;

(....)


I nomi dei tag sono in inglese perchè, in una futura implementazione, si intende dare la possibilità ad altri portali di caricare questi dati nei propri siti atraerso protocollo RSS.

Caricamento del file Xml

Prima di tutto dotiamo la classe News_Parser della funzione setInputFile che permette di caricare il file Xml.

function setInputFile($file){
$fp = fopen($file,"rb");
$this->fp = $fp;
return $fp;
}

Parsing del file Xml

La funzione parse si occupa del parsing di ogni riga del file Xml:

function parse(){
while ($data = fread($this->fp,2048)){
xml_parse($this->parser,$data,feof($this->fp)) or
die (sprintf("Errore XML: %s linea: %d",
xml_error_string(xml_get_error_code($this->parser)),
xml_get_current_line_number($this->parser)));
}
fclose($this->fp);
xml_parser_free($this->parser);
return true;
}


La funzione si occupa di leggere riga per riga il file Xml, se ad esempio, non è ben rappresentato, ovvero non è well formed restituisce un messaggio di errore. Al termine di questo tutorial può essere utile simulare errori nel file xml per comprendere il funzionamento del controllo sugli errori.

La funzione principale

La funzione News_Parser instanzia un oggetto xml_parser attraverso xml_parser_create().

function News_Parser(){
$xmlp = xml_parser_create();
$this->parser = $xmlp;
xml_set_object($this->parser,$this);
// Trasforma in maiuscolo tutti i nomi dei tag
xml_parser_set_option($xmlp,XML_OPTION_CASE_FOLDING,$this->folding);
//Definisce le due funzioni che vengono lanciata ad inizio e fine di ogni tag
xml_set_element_handler($xmlp,"startHandler","endHandler");
xml_set_character_data_handler($xmlp,"cdataHandler");
}


E' pratica frequente trasformare in maiuscolo tutti i nomi dei tag, anche per ridurre errori di parsing dovuti ad una errata denominazione maiuscolo/minuscolo dei tag attraverso la seguente opzione:

xml_parser_set_option($xmlp,XML_OPTION_CASE_FOLDING,$this->folding)

Mentre xml_set_element_handler definisce le due funzioni (startHandler,endHandler) che vengono lanciate ad inizio (per esempio <description>) e fine(</description>) di ogni tag, che nel paragrafo successivo prenderemo in esame. Infine xml_set_character_data_handler si occupa, come indica il nome, della gestione dei dati.
La denominazione delle tre funzioni (startHandler,endHandler,cdataHandler) non è casuale, anche in questo caso è quasi una convenzione denominare così queste funzioni, anche se potrebbero essere chiamate con qualsiasi altro nome di gradimento.

Funzioni startHandler e endHandler

Come sopra indicato, le due funzioni vengono rispettivamente attivate ad apertura e chiusura di ogni elemento.
Di fatto, xml_set_element_handler passa alla funzione startHandler il parser, il nome dell'elemento ed eventuali attributi, non utilizzati comunque in questo esempio.
Per ogni riga che viene presa in esame vengono caricati i metodi dell'oggetto $this. Così si può vedere viene memorizzato se l'elemento appartiene al blocco left o a quello right, oltre al nodo e l'elemento corrente.

function startHandler($parser,$element_name,$element_attribute){
switch($element_name){
case 'LEFT': $this->blocco = "left";
break;
case 'RIGHT':
$this->blocco = "right";
break;
case 'ITEM':
$this->current_node = $element_name;
break;
default:
$this->current_tag = $element_name;
}
}


Mentre, in questo script, la funzione endHandler incrementando item_counter conta i vari elementi.
Di fatto questo contatore rappresenta il nostro indice di un'oggetto/array bidimensionale attraverso il quale verranno indicizzati e memorizzati i valori contenuti nei vari elementi.

function endHandler($parser,$element_name){
$this->current_tag = '';
if ($element_name=="ITEM")
$this->item_counter++;
}

Funzione di data handling

Si è visto come l'istruzione: xml_set_character_data_handler($xmlp,"cdataHandler"); lanci la funzione cdataHandler il cui compito, come si intuisce, consiste nel caricare i valori ($cdata) in un oggetto bidimensionale, $this->datidefinito da un indice e un blocco.

function cdataHandler($parser,$cdata){
switch ($this->current_node){ case "ITEM":
switch ($this->current_tag){
case "TITLE":
$this->dati[$this->item_counter] [$this->blocco] ["title"]=$cdata."<br/>";
break;
case "LINK":
$this->dati[$this->item_counter][$this->blocco]["link"]=$cdata;
break;
case "DESCRIPTION":
$this->dati[$this->item_counter][$this->blocco]["description"]=$cdata."<br/>";
break;
case "IMAGE":
$this->dati[$this->item_counter][$this->blocco]["image"]=$cdata;
break;
}
}
}


Funzione di formattazione dei dati degli elementi Xml

La classe News_Parser è dotata infine della funzione ComposeXml.
La funzione bisogna di 3 parametri, l'oggetto dati, ovvero $NewsP->dati, un parametro che specifica il blocco (sinistra o destro) e l'indice dell'array/oggetto nel quale sono stati memorizzati i dati letti dal file Xml.
Se l'elemento <image> o <link> sono valorizzati la funzione incapsula il dato all'interno dell'appropriato codice Html.

function ComposeXml($obj,$block,$i){
if ($obj[$i] [$block]["image"] !="") {
$immagine = "<img src='".$obj[$i] [$block]["image"]."' alt='$block' align='left' width='40' height='40'>";}
$Fhtml=$Fhtml.$immagine;
$Fhtml=$Fhtml.$obj[$i] [$block] ["title"] ; if ($obj[$i] [$block]["link"] !=""){
$Fhtml=$Fhtml."<a href='".$obj[$i] [$block]["link"]."'>"; }
$Fhtml=$Fhtml. $obj[$i] [$block]["description"];
if ($obj[$i] [$block]["link"] !=""){
$Fhtml=$Fhtml. "</a><br/>";
}
return $Fhtml;
}

Instanza della classe e visualizzazione dei dati Xml

Preparata la classe News_Parser adesso è possibile instanziarne un oggetto, e quindi caricare il file,eseguire il parsing dei dati e visualizzarli nel Browser.
// Creazione oggetto $NewsP derivato da News_Parser()
$NewsP =& new News_Parser();
// Caricamento del file Xml
$NewsP->setInputFile("news.xml");
// Lancio funzione parse
$NewsP->parse();



Quindi attraverso un semplice ciclo adesso è possibile acquisire i dati, eventualmente formattati in Html, due variabili ($NewsLeft e $NewsRight ).

for ($i=0;$i < $NewsP->item_counter;++$i){
if (($NewsP->dati[$i] ["left"]["title"]!="") OR ($NewsP->dati[$i] ["left"]["description"]!="")){
$NewsLeft = $NewsLeft. $NewsP->ComposeXml($NewsP->dati,"left",$i);
}
if (($NewsP->dati[$i] ["right"]["title"]!="") OR ($NewsP->dati[$i] ["right"]["description"]!="")){
$NewsRight = $NewsRight. $NewsP->ComposeXml($NewsP->dati,"right",$i);
}
}
Infine per concludere il codice con un pò di "stile" predispongo gli elementi dove stampare il contenuto delle 2 variabili:

<style>
div.left{
background: #eec;
font-family: verdana, arial, serif;
color: #000;
float: left;
width: 100%;
border: 1px solid #000;
padding: 3px;
float:left;
width:40%;
}
div.right{ background: #eec;
font-family: verdana, arial, serif;
color: #000;
float: left;
width: 100%;
border: 1px solid #000;
padding: 3px;
float:left;
width:40%;
}
div.spacer{
float:left;
width:10%;
}
</style>


E finalmente le due variabili contenenti i dati Xml formatti in html potranno essere stampati:


<div class="left">
<h3>LEFT</h3>
<?=$NewsLeft;?>
</div>
<div class="spacer"></div>
<div class="right">
<h3>RIGHT</h3>
<?=$NewsRight;?>
</div>


Il risultato finale della pagina xmlnews.php dovrebbe essere simile al seguente:





Warning: include(ads/text468x15.html): failed to open stream: No such file or directory in D:\inetpub\webs\fishscriptcom\documents\view_document.php on line 131

Warning: include(): Failed opening 'ads/text468x15.html' for inclusion (include_path='.;C:\php\pear') in D:\inetpub\webs\fishscriptcom\documents\view_document.php on line 131

Tutorial
Estrazione di dati da un file XML Una classe per eseguire il parsing   [Php] 
Php and Oracle executing pl/sql procedure with input and output values Passing and getting values with pl/sql procedures and functions  [Php] 
Funzione mail() Inviare mail con Php  [Php] 
Php4 / Php5 con Apache Installazione di Php5/Php4 in ambiente Windows  [Php] 
Php and Oracle OCI connection and query to Oracle database  [Php] 
Script
Convertire in maiuscolo il primo carattere di una stringa   [Php] 
Funzione validazione IP Interrompe l'esecuzione degli script se l'ip non è autorizzato. Utile per tenere lontani curiosoni dalla pagine che si stanno ancora sviluppando.  [Php] 
Una funzione di debug attraverso un alert dei messaggi A volte visualizzare un valore in un alert javascript consente di analizzare la procedura senza interrompere il corso dello script con die  [Php] 
Sottrarre il nome del file da un percorso completo Operazioni sulle stringhe  [Php] 
Utilizzare le doppie virgolette per codice il html all'interno di una variabile Regole di sintassi  [Php] 
Test di connessione a db e stampa dei risultati Operazioni con data base (Mysql)  [Php] 
Ricavare l'indirizzo della pagina da cui si proviene (Referer) Variabili server  [Php] 
Ricavare l'indirizzo ip del server dove si trovano le pagine php Variabili server  [Php] 
ereg_replace: sostituzione di parte del testo contenuto in una stringa Operazioni sulle stringhe  [Php] 
Utilizzo di phpinfo() Come ricavare informazioni sul server, interprete php, connessione a database, variabili di sessione, etc.  [Php] 
Generazione di una password composta da n lettere Pronunciabile secondo regole fonetiche lingua italiana   [Php] 
Generarazione di un numero casuale Funzione rand  [Php] 
Primo script con Php Stampa di una variabile. Incapsulare codice php tra istruzioni html  [Php] 
Creating a Mysql Database using php How tp establish a connection and create a database   [Php] 
Log counter simple example function registering hits info on a mysql table  [Php] 
Comandi
Ricavare l'impostazione della lingua del browser $HTTP_SERVER_VARS['HTTP_ACCEPT_LANGUAGE']  [Php] 
Ricavare dati sull'agente (browser, sistema operativo, dispositivo,terminale, mobile... ) $HTTP_SERVER_VARS["HTTP_USER_AGENT"];  [Php] 
Determinare dimensioni di un file filesize e round  [Php] 
Rinominare un file rename  [Php] 

signal Marco Magnani marcomagnani@fishscript.com



Cerca





Anger is creative, depression is useless.
Dyson, Freeman J.


Anger is creative, depression is useless.
Dyson, Freeman J.

Php... Info: Php's story


Php... Definizioni: PHP

Oracle... Definizioni: SCN


Shell scripting... Script: Passing parameters to shell script



fishScript.Com is accessible by Mobile access technology as mobile phones, Palm and Pocket PC .

Nicoleta e Marco Magnani tutorial, examples, courses, esempi, corsi, esercizi, appunti vari Dottoressa Nicoleta Dragu Formatrice Docente Insegnante Mediatrice Culturale Dott. Marco Magnani Universita La Sapienza Roma Master Computer Science Hunter College New York , Data Base Administrator DBA oracle System architect

Last modified: 2017-11-30 amministratore@fishscript.comNico and Marco Magnani Software Production
Home|About this Site © 2003-2008 www.fishScript.com ®