Jeudi 1 octobre 2009
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.
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 !
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 !
Toujours dans le cadre des recherches sur la similarité d'articles d'overblog, j'ai expérimenté un
logiciel d'extraction de mots-clef :