simpleXml et ua prof
Posté : 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.
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.