Administrateur PHPfrance |
3088 Messages
08 nov. 2007, 10:53
que pensez vous alors de cette methode suivante:
J'en pense que
Parse error: syntax error, unexpected '{'.
Quand tu postes un extrait de source, il est primordial que tu l'aies déjà exécuté et testé son fonctionnement. S'il ne fonctionne pas de la manière attendu il te faut alors expliquer ce qui diffère entre le fonctionnement attendu et le fonctionnement réel. De la même façon, si tu postes du XML, il faut que ce soit du XML valide, donc il te faut inclure l'élément racine (sans pour autant recopier les éléments/attributs qui ne sont pas concernés), sans quoi il nous est impossible de tester sa validité. Et dans ce cas on se retrouve à répondre au hasard et ça n'avance personne.
À part ça, le code que tu proposes souffres de plusieurs défaut de conception. Par exemple, xpath() renvoit
systématiquement un tableau, tu ne peux donc pas le comparer à une chaîne. D'ailleurs, cette comparaison n'est pas vraiment nécessaire puisqu'on peut l'inclure dans l'expression XPath: (voir
http://www.w3.org/TR/xpath#predicates)
SimpleXML n'est d'ailleurs pas conçu pour ce genre de modification et ne possède pas de méthodes pour remplacer des éléments. J'ai créé
une classe visant à pallier ce manque, et je viens de la mettre à jour pour permettre les remplacements par XPath.
Il te faut donc modifier ton script pour inclure cette classe, utiliser cette classe pour ton objet $oXml, créer un objet pour représenter l'image de remplacement (il est impératif de redéclarer les namespaces pour créer cet objet), et finalement effectuer le remplacement. Le résultat doit ressembler à
<?php
include 'sxe.php';
$oXml = new SXE('<?xml version="1.0"?>
<root xmlns:text="urn:text" xmlns:draw="urn:draw" xmlns:xlink="urn:xlink" xmlns:svg="urn:svg">
<foo>
<text:p>{Image}</text:p>
</foo>
</root>');
$xpath = '//text:p[text() = "{Image}"]';
$img = new SXE('<draw:frame xmlns:draw="urn:draw" />');
$oXml->replaceNodes($xpath, $img);
die($oXml->asXML());
Dernière chose, tu demandes "
comment gerer les fins de balise?", la réponse est : tu ne le fais pas. Tu ne dois surtout pas imaginer le contenu de SimpleXML comme du texte,
SimpleXML n'est pas du texte, c'est un objet. Lorsque tu utilises la méthode asXML(), l'objet est transformé en texte et SimpleXML se charge de tous les détails techniques, ouvrir/fermer les balises, mettres les namespaces/préfixes, etc...