PHP: Classe per gestire un qualsiasi XML

17 Apr 2019 | M.A.D.R.

Piccola classe in PHP XML per parsare un qualsiasi XML e lavorare con i formati a noi più familiari.

Salve a tutti e scusate la latitanza, ma eccomi qui per passarvi un’interessante classe  per la manipolazione di  file xml  PHP XML (manipolazione sarebbe lettura, per chi volesse approfondire come manipolare in modifica il file segnalo questa classe di facile implementazione qui).

Quante volte avete sognato di utilizzare un xml come un’array o un obj?

Bene oggi raccontiamo come fare questi piccoli interessantissimi passi, detto questo vediamo subito come implementare il nostro sistema di gestione (parse scusate il gioco di parole) di un file .xml.

Partiamo subito inizializzando la nostra classe:

class MadiParseXml {

	private $target='';
	private $remote=FALSE;
	private $guzzle;
	/**
	 * Tipologia di output accetta array,json,xml,csv
	 * @var string
	 */
	private $output='array';

	public $result;
	private $result_request='';
	public function __construct($option=[]) {
		if(!empty($option)){
			foreach ($option as $k=>$v){
				if(property_exists($this,$k))$this->$k=$v;
			}
		}
	}

Questa bella classetta inizializza l’oggetto come vogliamo ed effettua delle operazioni elementari sulk’obj XML, detto questo è doveroso spiegare che il linguaggio XML è di tipo markup, ossia descrive al suo interno un oggetto (item) con descrittori autoparlanti.

La nostra classe altro non fa che settare i parametri di default e rendere disponibile alcuni metodi per il recupero della risorsa.

In questa versione possiamo passare sia un url remoto che un puntatore ad un file non fa differenza sull’utilizzo delle cose, ma come ben sanno tutti per recuperare in remoto una risorsa utilizzo sempre Guzzle quindi prima di continuare provvedete a scaricare guzzle http…..

Vediamo i parametri che ci potranno essere utili:

  • target: Ossia l’ospite del file .xml che dobbiamo recuperare
  • output: Definiamo il nostro output finale (array,json,serialize)
  • remote: Specifica se la risorsa è un file locale e/o una risorsa remota, nel cosa in cuoi sia remota la nostra lib. di supporto Guzzle farà il lavoro al posto nostro.
  • result: La variabile contenente il risultato finale della nostra elaborazione
  • result_request: Variabile contenente il risultato della lettura del file *.xml all’interno (in questo caso simplexml_load_string)

Come possiamo vedere poche proprietà per ottenere un grande risultato.

Il cuore pulsante della classe si basa solo su queste linee di codice, che faranno esattamente ciò che chiediamo:

private function get_request(){
		if($this->remote){
			$this->guzzle=new GuzzleHttpClient();
			try{
				$this->result_request=simplexml_load_string($this->guzzle->get($this->target)->getBody()->getContents());
			}catch (Exception $e){
				$this->result_request=['status'=>'Errore'];
			}
		}else{
			$this->result_request=simplexml_load_string(file_get_contents($this->target));
		}
	}

che faranno esattamente quello che serve per recuperare la risorsa…

Per ultimo ma non per importanza è la creazione dell’oggetto MadiParseXml che come sempre, chi mi conosce sa che limito al massimo le chiamate a metodi, è la seguente:

parse=new MadiParseXml(['target'=>'test.xml','output'=>'serialize','remote'=>FALSE,'guzzle'=>new GuzzleHttpClient()]);
print_r($parse->__init__()->result);

Allora a questo punto non resta che specificare che la nostra classe accetta in input un qualsiasi *.xml sia remoto che locale, lo si trasforma in 3 diversi formati per post elaborazione.

class MadiParseXml {

	private $target='';
	private $remote=FALSE;
	private $guzzle;
	/**
	 * Tipologia di output accetta array,json,xml,csv
	 * @var string
	 */
	private $output='array';

	public $result;
	private $result_request='';
	public function __construct($option=[]) {
		if(!empty($option)){
			foreach ($option as $k=>$v){
				if(property_exists($this,$k))$this->$k=$v;
			}
		}
	}
	public function set_target($target){
		$this->target=$target;
	}
	public function set_remote($remote){
		$this->remote=$remote;
	}
	public function set_output($output){
		$this->output=$output;
	}

	public function __init__(){
		$this->get_request();
		$this->operation_result_Request();
		return $this;
	}

	private function operation_result_Request(){
		switch($this->output){
			case 'array':$this->parse_to_array();
				break;
			case 'json':$this->parse_to_json();
				break;
			case 'serialize':$this->parse_serialize();
				break;
		}
		return $this;
	}

	public function get_result(){
		return $this->result;
	}
	public function get_result_request(){
		return $this->result_request;
	}

	private function parse_serialize(){
		$this->result=serialize(json_decode(json_encode($this->result_request),TRUE));
	}
	private function parse_to_json(){
		$this->result=json_encode($this->result_request);
	}
	private function parse_to_array(){
		$this->result=json_decode(json_encode($this->result_request),TRUE);
	}

	private function get_request(){
		if($this->remote){
			$this->guzzle=new GuzzleHttp\Client();
			try{
				$this->result_request=simplexml_load_string($this->guzzle->get($this->target)->getBody()->getContents());
			}catch (Exception $e){
				$this->result_request=['status'=>'Errore'];
			}
		}else{
			$this->result_request=simplexml_load_string(file_get_contents($this->target));
		}
	}
}

Soluzioni complete per ogni esigenza