Supprimer un noeud d'un xml

Invité
Invité n'ayant pas de compte PHPfrance

09 sept. 2007, 17:52

je teste une fonction qui permet de supprimer un noeud d'un xml mais j'ai une erreur :
fonction :
<?php 
//on recupere l'identifiant du noued a supprimer 
$id = $_GET['contrib_id']; 

/*on load le fichier xml*/ 
$data = new DOMDocument(); 

$data->load('myELECTRONSforum.xml'); 

$parent = $data->getElementsByTagName('message'); 

for( $i=0; $i<$parent->length; $i++ ) { 

  // ligne 14
 $attr = $parent->item($i)->attributes; 
   for( $j=0; $j<$attr->length; $j++ ) { 
      if( $attr->item($j)->nodeName == 'id' && $attr->item($j)->nodeValue == $_GET['contrib_id'] ) 
         $element = $parent->item($i); 
   } 

} 

$racine = $data->documentElement; 

$suppr = $racine->removeChild($element); 
?>
L'erreur :
Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /mnt/137/sda/9/c/electrons/myELECTRONSforum/myELECTRONSdelete.php on line 14

Invité
Invité n'ayant pas de compte PHPfrance

09 sept. 2007, 21:51

Je trouve pas de solution.
Après avoir essayer plusieurs codes j'ai toujours des erreurs.
Je suis chez free. J'ai essayé <?php phpinfo() ?> et j'ai vu :
DOM/XML enabled
DOM/XML API Version 20031129
libxml Version 2.6.26
HTML Support enabled
XPath Support enabled
XPointer Support enabled
Schema Support enabled
RelaxNG Support enabled
cela devrait donc marcher ! non ?

Mammouth du PHP | 19672 Messages

09 sept. 2007, 22:15

Pas très sûr, mais si au lieu de mettre "item($i)" tu essayais en mettant "item[$i]" :?: :-*
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

09 sept. 2007, 22:31

cela ne change rien.
J'ajoute la structure de mon xml si qq peut m'aider je galère grave.

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8"?> <forum> <message id="0" date="le 08/01/2006 à 18:24:48" de="Webmaster" mail="" message="Laissez un message, donnez votre avis, posez des questions..." club="1"/> <message id="1" date="le 14/04/2007 à 14:37:28" de="webmaster" mail="fr" message="Attention, le site va bientôt fermer pour quelques mois afin de mettre à jour les fichiers. (nouveaux jeux, nouveaux dossiers, nouveaux cours...) La date de fermeture est prévue pour le 20 avril 2007. " club="0"/> </forum>

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

09 sept. 2007, 23:22

J'ai essayé <?php phpinfo() ?> et j'ai vu
...que tu utilisais PHP4 ? Ce qui expliquerait que syntaxe que tu utilises dans ton script ne soient pas supportée.

Invité
Invité n'ayant pas de compte PHPfrance

09 sept. 2007, 23:26

je comprends pas tout a fait ce que tu veux dire mais c'est bien :
php 5.
Sinon j'ai essayé autre chose (trouvé sur un tuto):
<?php

$doc = new DOMDocument;
$doc->load('myELECTRONSforum.xml');

$book = $doc->documentElement;

// Nous récupérons le chapitre et l'effaçons du livre
$chapter = $book->getElementsByTagName('message')->item(0);
$oldchapter = $book->removeChild($chapter);

echo $doc->saveXML();


?>
et je n'ai plus de message d'erreur, mais le problème est le ciblage car il me faut effacer le message selon la valeur de l'id.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

09 sept. 2007, 23:38

Ton message d'erreur est
Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /mnt/137/sda/9/c/electrons/myELECTRONSforum/myELECTRONSdelete.php on line 14
Et d'après ton message ta ligne 14 est
$attr = $parent->item($i)->attributes;
Le T_OBJECT_OPERATOR est ->, d'après le message d'erreur PHP ne s'attend pas à voir cette opérateur à cet endroit. La seule explication plausible est que tu utilises PHP 4.

Essaie ça pour en être sûr
die(PHP_VERSION);
PS: je viens de tester ton script, et chez moi ça marche comme prévu (PHP 5.2.4)

Invité
Invité n'ayant pas de compte PHPfrance

09 sept. 2007, 23:47

j'ai testé et j'ai :
5.1.3RC4-dev

Invité
Invité n'ayant pas de compte PHPfrance

09 sept. 2007, 23:55

j'ai essayé : (plus de message d'erreur)
<?php  
//on recupere l'identifiant du noued a supprimer  
$id = "2";  

/*on load le fichier xml*/  
$data = new DOMDocument();  

$data->load('myELECTRONSforum.xml');  

$parent = $data->getElementsByTagName('message');  

for( $i=0; $i<$parent->length; $i++ ) {  

  // ligne 14 
 $attr = $parent->item($i)->attributes;  
   for( $j=0; $j<$attr->length; $j++ ) {  
      if( $attr->item($j)->nodeName == 'id' && $attr->item($j)->nodeValue == '2'  )  
         $element = $parent->item($i);  
   }  

}  

$racine = $data->documentElement;  

$suppr = $racine->removeChild($element); 
?>
Mais je n'efface pas le message dont l'id=2

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

10 sept. 2007, 00:00

j'ai essayé : (plus de message d'erreur)
Ton dernier script est virtuellement identique au premier, donc l'erreur devrait subsister. Soit Free alterne PHP4/PHP5 au hasard et entre chaque requête, soit tu te trompes dans tes copier/coller. :-k

Mon conseil : oublie DOM, utilise SimpleXML mais surtout soit plus attentif à ce que tu fais et ce que tu changes quand tu débogue un problème.

Invité
Invité n'ayant pas de compte PHPfrance

10 sept. 2007, 00:02

en faite pour supprimer l'erreur j'ai enregistré le fichier en php 5 c'est tout.
Je ne me trompe pas. Peux tu m'éclairer sur le pb de ciblage ?
Y a t-il une autre méthode pour supprimer un noeud. Je dois présenter cela mercredi oups !!
En tout cas merci à toi !!

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

10 sept. 2007, 00:39

en faite pour supprimer l'erreur j'ai enregistré le fichier en php 5 c'est tout.
Donc l'erreur que tu présentais dans ton premier message était bien dûe à PHP 4 ? (c'est pas comme si j'en doutais non plus...) c'est très important lorsque tu postes ici de préciser les conditions, et si tu changes certaines choses d'un message à l'autre.
Je ne me trompe pas. Peux tu m'éclairer sur le pb de ciblage ?
Pas vraiment, parce que je n'utilise pas DOM. Avec SimpleXML tu peux le faire comme ça
$forum = simplexml_load_file('myELECTRONSforum.xml');

// $i est la position de l'élément, le premier est 0, le second 1, etc...
$i = 0;
foreach ($forum->message as $msg)
{
	if ($msg['id'] == $id)
	{
		unset($forum->message[$i]);
		break;
	}
	++$i;
}
Modifié en dernier par Hubert Roksor le 10 sept. 2007, 00:55, modifié 1 fois.

Invité
Invité n'ayant pas de compte PHPfrance

10 sept. 2007, 00:44

C'est qd meme étrange car la version indiquée chez free est la 5 ? non ? je comprends aps vraiment le problème.
Merci pour ce code que je vais vite tester...
Sinon une précision : c'est quoi SXE ?

Invité
Invité n'ayant pas de compte PHPfrance

10 sept. 2007, 00:47

Zut ! c'est vraiment pas mon jour de chance !
j'ai
Fatal error: Call to undefined function: simplexml_load_file() in /mnt/137/sda/9/c/electrons/myELECTRONSforum/myELECTRONSdelete.php on line 3

la poisse !! il me reste peu de temps. Bon la je vois vraiment pas ce qu'il faut faire. Je suis désolé.
C'est quoi le problème maintenant ?

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

10 sept. 2007, 00:59

SXE c'est le nom d'une classe que j'utilise, j'ai corrigé l'exemple, tu n'en as pas besoin
Fatal error: Call to undefined function: simplexml_load_file() in /mnt/137/sda/9/c/electrons/myELECTRONSforum/myELECTRONSdelete.php on line 3
Free aurait désactivé SimpleXML ? C'est plus qu'étrange... encore un coup de PHP4/PHP5 ? Sans SimpleXML, tu n'as plus qu'à bosser ton DOM, désolé. D'ailleurs, en y réfléchissant, le premier script marche chez moi, donc je n'ai aucune idée de ce qui ne fonctionne pas chez toi/Free.