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 !