Page 1 sur 2
suppression d'un element grace a son id [xml] php5
Posté : 19 oct. 2007, 23:59
par toomwayer
je veux supprimer l'element <track id='2'> avec ses noeuds
arbre:
Code : Tout sélectionner
<playlist version="1">
<trackList>
<track id="1">
<title>Il est temps</title>
<creator>cava</creator>
<location>audio/il est temps.mp3</location>
</track>
<track id="2">
<title>Il est temps</title>
<creator>cava</creator>
<location>audio/il est temps.mp3</location>
</track>
</trackList>
</playlist>
code php:
$document = new DomDocument('1.0', 'iso-8859-1');
$document->load($xml);
$racine = $document->documentElement;
$track = $racine >getElementsById("2");
$effacer>removeChild($track);
$document ->save($xml);
impossible d'effacer le track et le message d'erreur est le suivant:
Fatal error: Call to undefined function getElementsById() in
(je suis sou php 5)
Posté : 20 oct. 2007, 00:17
par Truc
Salut,
Pense à utiliser les balises de mise en page lorsque tu postes du code.
Pour ton souci commence par regarder cette ligne
$track = $racine >getElementsById("2");
manque un "-" pour "->" et un "s" de trop pour getElementById
Posté : 20 oct. 2007, 09:54
par Invité
merci effectivement j'ai recopié avec une erreur de frappe sur le forum
et j'ai retiré le "s".
Mais j'ai toujours
Fatal error: Call to undefined method DOMElement::getElementById() in...
merci pour ton aide Truc

Posté : 20 oct. 2007, 10:13
par Tracker
merci effectivement j'ai recopié avec une erreur de frappe sur le forum
et j'ai retiré le "s".
Mais j'ai toujours
Fatal error: Call to undefined method DOMElement::getElementById() in...
merci pour ton aide Truc

Salut,
Ben il te suffit d'ouvrir la doc pour remarquer que getElementById(...) est une méthode de DOMDocument, ce qui est plutot logique...
Comment fais-tu pour bosser sans doc ?
Tracker.
Posté : 20 oct. 2007, 10:29
par toomwayer
--->"Comment fais-tu pour bosser sans doc "
le doc xml est ouvert plus haut
$xml="xml/playlist.xml";
Posté : 20 oct. 2007, 10:40
par Tracker
--->"Comment fais-tu pour bosser sans doc "
le doc xml est ouvert plus haut
$xml="xml/playlist.xml";
Tu n'as pas compris, je disais 'sans documentation des API que tu ne connais pas et que tu es sensé utiliser correctement !!'
http://www.php.net/download-docs.php
Tracker.
Posté : 20 oct. 2007, 10:54
par toowayer
Tracker t'es sympas mais c pas le genre de réponse que j'attendais!
je suis pas développeur, j'ai juste un problème pour iddentifier un element par son id dans un arbre xml!
j'arrive bien a supprimer le premier element ou le dernier mais pas l'element avec l'id que je lui donne!
merci!
Posté : 20 oct. 2007, 10:59
par Truc
tu dois appeler la fonction d'id sur le document
$track = $document->getElementsById("2");
comme noté dans
la doc (
je suis passé un peu trop vite dessus)
Posté : 20 oct. 2007, 11:11
par toomwayer
tu veut surment parler de la dtd?
voici m'a dtd:
<!DOCTYPE trackList [
<!ELEMENT trackList (track*)>
<!ELEMENT track (title, creator, location)>
<!ATTLIST track id CDATA #REQUIRED>
<!ELEMENT title (#PCDATA)>
<!ELEMENT creator (#PCDATA)>
<!ELEMENT location (#PCDATA)>
]>
mais elle ne passe pas kan je l'appel dans le doc xml
<!DOCTYPE dtd SYSTEM "xml/dtd.dtd">
DOMDocument::load() [function.load]: failed to load external entity "file:///d%3A/www/your-music.fr/htdocs/xml/xml/dtd.dtd"
pour infos voici le nouveau code:
<?php
$xml="xml/playlist.xml";
$document = new DOMDocument();
$document->validateOnParse = true;
$document->load($xml);
$racine = $document->documentElement;
$track = $racine ->getElementById('2');
$effacer>removeChild($track);
$document ->save($xml);?>
Posté : 20 oct. 2007, 11:14
par Tracker
Tracker t'es sympas mais c pas le genre de réponse que j'attendais!
je suis pas développeur, j'ai juste un problème pour iddentifier un element par son id dans un arbre xml!
j'arrive bien a supprimer le premier element ou le dernier mais pas l'element avec l'id que je lui donne!
merci!
Excuse moi, la rémarque n'avait rien de 'méchant', quand je développe, je n'imagine pas ne pas avoir la doc ouverte à proximité. Je bosse généralement sous windows, et toutes les docs (php/mysql/javascript) sont dispo au format chm, ce qui est plutot pratique.
Pour ton problème, tu as un exemple dans la doc:
<?php
$doc = new DOMDocument;
$doc->load('book.xml');
$book = $doc->documentElement;
// Nous récupérons le chapitre et l'effaçons du livre
$chapter = $book->getElementsByTagName('chapter')->item(0);
$oldchapter = $book->removeChild($chapter);
echo $doc->saveXML();
?>
La démarche:
- tu récupères l'élément à supprimer via DOMDocument::getElementById(...)
- et depuis son père tu le supprimes.
$node = $doc->getElementById($id);
$node->parentNode->removeChild($node);
Tracker.
Posté : 20 oct. 2007, 11:27
par toomwayer
je suis désesperé!
$xml="xml/playlist.xml";
$document = new DOMDocument();
$document->validateOnParse = true;
$document->load($xml);
$node = $document->getElementById("2");
$node->parentNode->removeChild($node);
$document ->save($xml);
message:
Notice: Trying to get property of non-object in ...
Fatal error: Call to a member function removeChild() on a non-object in ...
Posté : 20 oct. 2007, 11:37
par Tracker
C'est normal:
doc DOMDocument::getElementById(...)
Pour que cette fonction fonctionne, vous devez soit définir les attributs ID avec DOMElement->setIdAttribute() ou définir une DTD qui définit un attribut devant être de type ID. Dans le dernier cas, vous devez valider votre document avec DOMDocument->validate() ou DOMDocument::validateOnParse avant d'utiliser cette fonction.
Donc modifie ta DTD:
Code : Tout sélectionner
// remplace
<!ATTLIST track id CDATA #REQUIRED>
// par
<!ATTLIST track id ID #REQUIRED>
Tracker.
Posté : 20 oct. 2007, 11:43
par toomwayer
c'est fait mais j'ai ça maintenant
Warning: DOMDocument::load() [function.load]: failed to load external entity
Posté : 20 oct. 2007, 11:48
par Invité
voici la dtdt entiere:
Code : Tout sélectionner
[color=olive]<!DOCTYPE trackList [
<!ELEMENT trackList (track*)>
<!ELEMENT track (title, creator, location)>
<!ATTLIST track id ID #REQUIRED>
<!ELEMENT title (#PCDATA)>
<!ELEMENT creator (#PCDATA)>
<!ELEMENT location (#PCDATA)>
]>[/color][color=green][/color]
et voici l'appel dans mon xml
Code : Tout sélectionner
<!DOCTYPE dtd SYSTEM "xml/dtd.dtd">
<playlist version="1">
<trackList>
<track id="1">
<title>Il est temps</title>
<creator>cava</creator>
<location>http://www.monsite.fr/audio/il est temps.mp3</location>
</track>
......
Posté : 20 oct. 2007, 11:53
par Tracker
Laisse moi un moment pour faire un test.
Je te tiens au courant.
Tracker.