XML - suppresion de noeuds dynamiquement [erreur]

XML - suppresion de noeuds dynamiquement [erreur] - XML/XSL - Programmation

Marsh Posté le 15-05-2006 à 16:27:13    

BOnjour a tous,
Je souhaite supprimer un noeud de mon XML via PHP...J'ai une erreur qui apparait et
je n'arrive pas a la resoudre...

 

Code php

 
Code :
  1. <?php
  2. $idfile=$_POST['idfile'];
  3. if(!$dom = domxml_open_file("videos.xml" )) {
  4.   echo "Erreur lors de l'analyse du document\n";
  5.   exit;
  6. }
  7. $elements = $dom->get_elements_by_tagname($_POST['idfile']);
  8. //$parent = $ref->parent_node();
  9. //$element = $elements[0];
  10. //echo $element;
  11. //$children = $element->domxml_children();
  12. $child = $element->remove_child($elements);
  13. $dom->dump_file("videos.xml", false, true);
  14. echo "Article supprimer";
  15. ?>


ficheir xml:

 

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="style.css" type="text/css"?>
<Liste>
<File
id="1" label1="Exposition 'RE-INVENTEZ-VOUS' de J-L TORMOS"
data1="videos/videos1.flv" description="La rencontre d’un artiste"
realiser="Réalisation Nom Prenom" date="Le 04/02/2006" urlnom="Google"
urllien="http://www.google.fr"/>
</Liste>

 

Merci d'avance pour votre aide...

Reply

Marsh Posté le 15-05-2006 à 16:27:13   

Reply

Marsh Posté le 15-05-2006 à 16:29:51    

il est valide ton xml ?
il manquerait pas un </File> ?

Reply

Marsh Posté le 15-05-2006 à 16:36:56    

/> cette syntaxe ferme la balise normalement...C'est le racourci de </File> non?

Reply

Marsh Posté le 15-05-2006 à 16:43:23    

mouais;
je prefere fermer les balises explicitement
 
avec les balises ca donne:

Code :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <?xml-stylesheet href="style.css" type="text/css"?>
  3. <Liste>
  4.    <File id="1" label1="Exposition 'RE-INVENTEZ-VOUS' de J-L TORMOS" data1="videos/videos1.flv" description="La rencontre d’un artiste" realiser="Réalisation Nom Prenom" date="Le 04/02/2006" urlnom="Google" urllien="http://www.google.fr" </File>
  5. </Liste>


Message édité par _darkalt3_ le 15-05-2006 à 16:49:11
Reply

Marsh Posté le 15-05-2006 à 16:59:21    

ton fichier xml est correctement, c'est ton traitement php qui suxxe :o ( d'ailleurs ce post n'a rien a faire dans la cat XML/XSL).
 
Tout d'abord le module DOMXML de php est à proscrire, depuis la version 4.3.0 il faut utiliser le DOM ( tout court ).
Ensuite tu mélanges getElementsByTagName et getElementById, si tu passes un id à la 1ere fonction alors que celle-ci s'attend à un nom de balise ça risque pas de marcher.  
Enfin pour pouvoir faire un removeChild il faut être sur le "père" du noeud que l'on veut supprimer.
 
Morale de l'histoire, le code devrait ressembler à:

Code :
  1. <?php
  2. $idFile=1;
  3. if(!$dom = DOMDocument::load("videos.xml" )) {
  4.   echo "Erreur lors de l'analyse du document\n";
  5.   exit;
  6. }
  7. $filesNodeList = $dom->getElementsByTagName('File');
  8. foreach($filesNodeList as $fileNode){
  9.   if ( $fileNode->getAttribute('id') == $idFile){
  10.     $fileNode->parentNode->removeChild($fileNode);
  11.   }
  12. }
  13. $dom->save("videos.xml" );
  14. ?>


Note: le test via le getAttribute est obligatoire, tu ne peux pas te servir de getElementById( ce qui t'aurais grandement simplifier la vie)...
Enfin si tu pourrais te servir de getElementById mais tu dois auparavant valider ton document via DOMDocument->validate() avec une DTD qui définie l'attribut ID ( ce qui je pense n'est pas pour tout de suite)

Reply

Marsh Posté le 16-05-2006 à 09:32:21    

Merci beaucoup de m'avoir repondu...Tu m'a bien eclairer sur le removeChild et la difference entre getelementByTagName et GetElementById...
Je voulais utiliser DOM au lieu de DOMXML mais c'a me mettait tout plein d'erreur...
Il reste encore une erreur : Fatal error: Call to undefined function: load() mais je vais essayer de trouver d'ou ca vient...
 
Comme tu ma l'air bien caler en xml, j'ai une tite question pour créer un fichier xml faut mieux passer par une DTD avant? Je sais pas si j'ai été clair dans ma question...
 
 

Reply

Marsh Posté le 16-05-2006 à 09:55:15    

Pour le problème du load n'aurrais tu point oublier le DOMDocument:: devant?
 
Ta question est pas specialement claire mais en gros:
- un bon article sur l'interet des DTD
- a mon avis, un DTD est obligatoire lorsqu'il y a "echange" entre différentes entités du flux xml et ce afin de s'assurer de la validité de celui-ci. Si c'est juste pour toi l'interêt est pas énorme, si tu bosses en equipe à vous de pesez le pour et le contre


Message édité par anapajari le 16-05-2006 à 09:55:40
Reply

Marsh Posté le 16-05-2006 à 12:49:07    

Pour le probleme de load j'ai un peu chercher sur Internet et finallement j'ai toruver une soluction qui disait de mettre le fichier en .php5 et ca a marcher.
 
En fait je suis actuellement en stage je suis en train de créer un player videos en flash géré par xml et avec la partie administration en php/xml. Je me posait la question si je devais créer une DTD ou pas en faite...
 
J'ai deux autre petite question je doit faire la modification d'article est ce qu'il faut mieux que j'utilise replaceNode ou bien que quand l'utilisateur clique su rmodifier ca supprimer l'ancien noeud et il en recré un autre?
 
Et mon autre petite question j'ai une liste deroulante qui sleectionne un article et il affiche un formulaire avec des champs de texte et les attribut du xml dedans seulement il m'affiche seulement le premier mot de l'attribut...Je sais pas d'ou ca vient...quand je fait echo ($lavraible); ca marche y a tout le texte...

Reply

Marsh Posté le 16-05-2006 à 13:25:14    

Fourmiz83 a écrit :

je doit faire la modification d'article est ce qu'il faut mieux que j'utilise replaceNode ou bien que quand l'utilisateur clique su rmodifier ca supprimer l'ancien noeud et il en recré un autre?


ça revient au même de faire un replaceNode et de créer puis de supprimer ton noeud ( sauf que dans ce cas l'ordre des entités dans ton flux peut ne pas être conservé).
La question est plutot: dois-je modifier les valeurs et attributs de l'entité concernée ou la recréer... Et la il n'y a que toi qui peut répondre ;)
 

Fourmiz83 a écrit :

Et mon autre petite question j'ai une liste deroulante qui sleectionne un article et il affiche un formulaire avec des champs de texte et les attribut du xml dedans seulement il m'affiche seulement le premier mot de l'attribut...Je sais pas d'ou ca vient...quand je fait echo ($lavraible); ca marche y a tout le texte...

rien compris  [:pingouino]  code?

Reply

Marsh Posté le 16-05-2006 à 13:43:53    

En fait pour pouvoir modifier l'article j'ai créer un menu deroulant qui va vers un page php. Cette page php contient un formulaire avec des champs de texte. Les champs de texte sont remplis depuis le fichier xml avec le titre, date,...
 
code php
 
<?php
$idFile=$_POST['idfile'];
//$dom=new::DOMDocument();
if(!$dom=DOMDocument::load("videos.xml" )) {
//if(!$dom->load("videos.xml" )){
echo "Erreur lors de l'analyse du document\n";
exit;
}
$filesNodeList = $dom->getElementsByTagName('File');
foreach($filesNodeList as $file){
$titre=$file->getAttributeNode("label1" )->value;
$realiser=$file->getAttributeNode("realiser" )->value;
$date=$file->getAttributeNode("date" )->value;
$description=$file->getAttributeNode("description" )->value;
$lvideos=$file->getAttributeNode("data1" )->value;
$urlliens=$file->getAttributeNode("urllien" )->value;
$urlnom=$file->getAttributeNode("urlnom" )->value;
$id=$file->getAttributeNode("id" )->value;
if ( $id == $idFile){
echo "<form method='post' action='modif_f.php'><BR>";
echo "<input name='titre' type='text' value=".$titre." size='70'><BR>";
echo "<input name='realiser' type='text' value=".$realiser." size='50'><BR>";
echo "<input name='date' type='text' value=".$date." size='10'><BR>";
echo "<textarea name='description' cols='66' rows='4'>".$description."</textarea><BR>";
echo "<input name='date' type='text' value=".$date." size='50'><BR>";
echo "<input name='l_videos' type='text' value=".$lvideos." size='50'><BR>";
echo "<input name='l_article' type='text' value=".$urlliens." size='50'><BR>";
echo "<input name='soumettre' type='submit' value='Modifier'>";
echo "</form>";
}
}
?>
 
Dans es champs de texte y a juste le premier mot de chaque attribut du XML...
Petite capture de ce que ca donne:
 
http://designmania.free.fr/capture.png


Message édité par Fourmiz83 le 16-05-2006 à 13:45:08
Reply

Marsh Posté le 16-05-2006 à 13:43:53   

Reply

Marsh Posté le 16-05-2006 à 13:51:11    

s'quoi ces grosses bouses là:

Code :
  1. $titre=$file->getAttributeNode("label1" )->value;
  2. $realiser=$file->getAttributeNode("realiser" )->value;
  3. $date=$file->getAttributeNode("date" )->value;
  4. $description=$file->getAttributeNode("description" )->value;
  5. $lvideos=$file->getAttributeNode("data1" )->value;
  6. $urlliens=$file->getAttributeNode("urllien" )->value;
  7. $urlnom=$file->getAttributeNode("urlnom" )->value;
  8. $id=$file->getAttributeNode("id" )->value;


C'est normal tu t'amuses a retourner un noeud puis tu utilises value dessus au lieu de nodeValue.
Et de toute manière tu as une fonction qui te récupère directement l'attribut: http://fr.php.net/manual/fr/functi [...] ribute.php

Reply

Marsh Posté le 16-05-2006 à 14:17:48    

Ouais mais meme avec getAttribute ca fait ca....

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed