simpleXml et ua prof

Petit nouveau ! | 7 Messages

07 janv. 2008, 16:42

Bonjour;
j'ai améliorer mon code en créant une classe qui fait le travail du script précédant. Je pense que la est moins lourde et elle est plus élaborer. En plus elle peut aider dans la résolution de mon problème que j'ai posté le 03 janvier dans la rubrique xml. Le titre du sujet est : création d'une classe qui utilise données du simpleXml. Donc je vous mets ci-après le code de la classe qui utilise le simplexml sur un xml qui a des namespaces.
class doc{
	//la propriété qui va contenir l'objet SimpleXMLElement
	private $xml;
	//la propriété qui va contenir l'url de l'ua profile
	private $x_wap_profile;
	//la propriété qui va contenir les namespaces 
	private $ns;
	// la propriété qui va contenir la description
	private $profile;
	//la propriété qui va contenir le composant courrent
	private $devices;
	
	// le constructeur qui permet d'instancier l'objet
	function __construct(){
		//on  initialise l'url de l'ua profile envoyé par le serveur
		$this->x_wap_profile = (isset($_SERVER['HTTP_X_WAP_PROFILE']))?$_SERVER['HTTP_X_WAP_PROFILE']:'';
		//on crée l'objet SimpleXMLElement
		$this->xml = simplexml_load_string(file_get_contents($this->x_wap_profile));
		//on récupère tous les namespaces utilisés
		$this->ns = $this->currentNamespaces($this->xml);
		//on récupère tous les fils qui appartiennent au namespace rdf
		$this->profile = $this->xml->children($this->ns['rdf']);
		//<prf:component> les éléments du namespace prf
		$this->devices = $this->profile->children($this->ns['prf']);
		
	}
	
	//on récupère que les namespaces de l'objet SimpleXMLElement
	public function currentNamespaces($_currentObject){
		//on vérifie que le paramètre en lecture est un objet
		if(is_object($_currentObject)){
			//Si c'est la racine de l'objetSimpleXMLElement
			if($_currentObject ==$this->xml){
				//on récupère tous ses namespaces
				$this->ns = $this->xml->getNamespaces(true);
				//on les retourne puis on sort
				return $this->ns;				
			}else{
				for($i =0; $i<count($this->ns); $i++){
					$elements = $this->xml->children($this->ns[$i]);
					$childs = $elements->children($this->ns[$i]);
					if(is_object($elements) && is_object($childs)){
						//Si  l'objetSimpleXMLElement est un fils de la racine
						if($_currentObject == $elements){
							//on récupère tous ses namespaces
							$this->ns = $elements->getNamespaces(true);
							//on les retourne puis on sort
							return $this->ns;
						}//Si  l'objetSimpleXMLElement est un petit fils de la racine
						elseif($_currentObject == $childs){
							//on récupère tous ses namespaces
							$this->ns = $childs->getNamespaces(true);
							//on les retourne puis on sort
							return $this->ns;
						}
					}
				}
			}	
		}
	}
	
	public function readInfo(){
		//on parcourre tous les composants 
		for($index= 0; $index < count($this->devices); $index++){
			//on récupère les fils rdf
			$cmp=$this->devices[$index]->children($this->ns['rdf']);
			//on parcourre les namespaces
			foreach($this->ns as $values=>$key){
				//on récupère le fils de <rdf:Description rdf:ID=" "> en tenant compte du namespace de ce fils
				$res = $cmp->children($this->ns[$values]);
				print_r($res);
				
				//si le fils courrent a un namespace prf ou mms ou pss5 ou pss6
				if($values == 'prf' || $values == 'mms' 
					|| $values == 'pss5' || $values == 'pss6'){
					//on vérifie qu'il existe des fils pour le prf courrent
					foreach($res as $val=>$keys){					
						//on vérifie qu'il y'a un fils prf qui a au moins un fils
						if(count($res->$val->getNamespaces(true))>1 && 
								$res->$val->getNamespaces(true) != 'prf'){
							//on affiche le père prf	
							print_r("[".$res->$val->getName()."]"."\n");
							
							//on affiche les fils rdf
							print_r($res->$val->children($this->ns['rdf']));
							
						}
					}
				}
			}
		}

	}
	
}
Je suis aussi ouvert au critiques qui peuvent apporter des améliorations.