Classe per la scrittura di un file XML

MarcoGrazia

Utente Attivo
15 Dic 2009
853
21
28
63
Udine
www.stilisticamente.com
Quello che vado postando è un file che contiene una semplice classe in grado di creare un file XML.
Ovviamente è una versione alfa, funzionante ma pregna di possibilità inespresse :D
Tanto per capirci è possibile modificarne l'intestazione in modo da definire una codifica diversa da quella predefinita che utf-8, di fatto l'unica che tendo ad utilizzare nei miei progetti, ma mica a tutti piace :)

File: creaxml.class.php
PHP:
<?php

	/*
		Marco Grazia
		13 marzo 2010
		versione 0.0.2
                rilasciata sotto GPL v.3
		
			Crea un file xml
	*/		
	
	interface intCreaXML {}	//	fine interfaccia intCreaXML
	
	class creaxml {
	
		protected $dom = null;
		
		function __construct() {}	//	__construct()
		
                //    Crea l'intestazione del file XML e impone la regola di indentare il codice per poterlo leggere meglio.
                //    Questa in una versione più avanzata potrebbe essere opzionale, dopotutto l'indentazione prende spazio ;-)
		protected function inizializzaXML() {
			$this->dom = new DOMDocument( '1.0', 'utf-8' );
			$this->dom->preserveWhiteSpace = false;
			$this->dom->formatOutput = true;
		}	//	inizializzaXML()
		
                //    Crea un attributo con testo all'interno.
                //    @parent nodo del dom
                //    @nodo stringa (nodo dove va inserito l'attributo)
                //    @attributo stringa (nome dell'attributo)
                //    @testo stringa (valore dell'attributo)
		protected function createAttributeText( $parent, $nodo, $attributo, $testo ) {
			try {
				$nodo = $parent->getElementsByTagName( $nodo )->item(0);
				$attributo = $nodo->setAttributeNode( new DOMAttr( $attributo, $testo ));
			} catch (DOMException $err) {
				echo 'Errore! '. $err->getMessage();
				exit();
			}
		}	//	createAttributeText()
		
		//	Crea un elemento XML e se previsto vi inserisce del testo
                //     @nodo nodo del dom
                //     @elemento stringa (nome dell'elemento da creare)
                //     @testo stringa (valore da inserire, può essere nullo per creare dei nodi vuoti)
		protected function createElementText( $nodo, $elemento, $testo = null ) {
			try {
				$elemento = $nodo->appendChild( new DOMElement( $elemento ));
				//	Se c'è del testo (non nullo) lo scrive, se no passa oltre.
				if ( !is_null( $testo ) ) {
					$testo = $elemento->appendChild( new DOMText( $testo ));
				}
			} catch (DOMException $err) {
				echo 'Errore! '. $err->getMessage();
				exit();
			}
		}	//	createElementText()
		
		//	Crea un elemento XML e vi inserisce del testo in un campo CDATA come sopra ma con un campo CDATA.
		protected function createElementTextCDATA( $nodo, $elemento, $testo ) {
			try {
				$elemento = $nodo->appendChild( new DOMElement( $elemento ));
				$testo = $elemento->ownerDocument->createCDATASection( $testo );
				$elemento->appendchild( $testo );
			} catch (DOMException $err) {
				echo 'Errore! '. $err->getMessage();
				exit();
			}
		}	//	createElementTextCDATA()
		
                //      Salva il file
                //      @percorso stringa (percorso dove va salvato il file
                //      @nomeFile stringa (il nome del file :-))
                //      la funzione ottiene il LOCK del file in fase di scrittura.
		protected function salvaXML( $percorso, $nomeFile ) {
			//	Salva il file nel percorso indicato, mentre lo salva ne acquisice il lock esclusivo.
			file_put_contents( $percorso.$nomeFile, $this->dom->saveXML(), LOCK_EX );
			unset( $this->dom );	//	Libera la risorsa.
		}	//	salvaXML()
		
	}	//	fine classe intestazione
?>
sia chiaro che essendo rilasciata sotto GPL3 valgono tutte le regole di questa licenza, prime fra tutte che chi la usa è pregato di citarne la fonte e che inoltre viene rilasciata così com'è ovvero i bugs vanno fatti notare se volete ma non potrete prendervela con me per ciò che vi possono causare :)

Come la si usa!
Per esempio richiamandola da un'altra classe (anche perché non si può fare altrimenti :D)
File: miofile.php
PHP:
<?php
require_once 'creaxml.class.php';
class mioXML extends creaxml {

              function __construct( $nomefile ) {

			$this->inizializzaXML();
			$root = $this->dom->createElement( 'root' );

			//	Root del file
			$this->createElementText( $root, 'lingua', 'it' );
			$this->createElementText( $root, 'direzione', 'ltr' );
			$this->createElementText( $root, 'codifica', 'utf-8' );
                        $this->dom->appendChild( $root );

			//	Salva il file ed esce
			$this->salvaXML( 'files/', $nomefile.'.xml' );
		}	//	__construct()

	}	//	fine classe creaxml

$obj = new mioXML( $nomefile );
?>
Semplice? Abbastanza, come detto è in alfa e quindi soggetta a grossissime modifiche, modifiche che ovviamente si possono apportare anche qui sul forum, considerate solo di mantenerla semplice.

Alcune modifiche da apportare sicuramente sono nella gestione degli errori.
Il file di implementazione è in bianco visto che per ora la classe non esporta nulla e quindi rimane inutilizzato al momento.

Have fun.
 
La nobiltà non c'entra, la classe principale serve a definire le funzioni di base, la seconda a implementare dei metodi.
Parafrasando si può dire che per accedere ad un database puoi usare le funzioni predefinite del php o decidere di usare mysql da linea comando.
La classe principale è abbastanza astratta, in realtà molto poco dato che faparte di un progetto più ampio, ma permette di aprire/creare un file xml e scrivere dentro.
La senconda implementa un tipo di file xml.
Ah dimenticavo usano il DOM ;)
 
mettila in download da qualche parte che te la recensisco e la linko su Mrwebmaster nella sezione degli script
 

Discussioni simili