Recherche

Calendrier

Février 2010
L M M J V S D
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
             
<< < > >>

Illustrations

  • Drow.jpg
  • Linea.jpg

Catégories

Présentation

Recommander

Jeudi 1 octobre 2009 4 01 /10 /2009 09:35
PHP est un langage qui allie le moins bon et le meilleur. Le module SimpleXML en est un excellent exemple. A la base, ce module permet une gestion simple et intuitive du XML, sans la complexité du DOM.

Malheureusement dans ce cas, la Simplicité rime aussi avec Limitation. Certaines gestions sont très approximative, le typage des données est curieux par moments. C'est en gros ce qui m'est arrivé hier. Dans le cadre de la programmation du coeur d'Overblog, je me suis retrouvé dans un cas où je voulais mettre à jour la valeur d'un noeud unique à partir d'un xpath.Et là, c'est le drame, ça ne marche absolument pas comme ça devrait. Alors on fouille un peu, et on trouve l'exemple qui correspond exactement à ce qu'on cherche, qui explique que ça ne fonctionne pas comme prévu, et qui donne une façon de contourner le problème : http://fr.php.net/manual/en/simplexml.examples.php#87011.

Bingo ! Problème réglé ? En fait non, car la "correction" ne fonctionne pas mieux... Elle ne marche pas, mais différement. 

Encore une fois, il faut passer au plan B. Bon, le bon point de SimpleXML, c'est qu'on peut étendre la classe SimpleXMLElement. On ne peut pas surcharger les méthodes existantes certes, mais on peut en créer des nouvelles. En outre il est possible de passer du objet SimpleXML à un objet DOM et réciproquement, et donc on peut en général toujours s'en sortir de cette manière. 

class ExtendedSimpleXMLElement extends SimpleXMLElement
{
public function getParent ()
{
$node = dom_import_simplexml($this);
$parent = simplexml_import_dom($node->parentNode);

return ($parent);
}

public function setValueFromXpath($xpath, $value)
{
$nodes = $this->xpath($xpath);

if (count($nodes) !== 1 or (count($nodes[0]->children()) > 1))
{
return false;
}
$parent = $nodes[0]->getParent();
$name = $nodes[0]->getName();
$parent->{$name} = $value;
return true;
}
}

Et là miracle, ça marche. Mais quelle galère pour en arriver là, et que de temps perdu.

Prions pour qu'un jour SimpleXML soit crédible !
Par Torgan - Publié dans : Overblog
Ecrire un commentaire - Voir les commentaires
Retour à l'accueil
 
Créer un blog sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus