suppression d'un element grace a son id [xml] php5

toomwayer
Invité n'ayant pas de compte PHPfrance

19 oct. 2007, 23:59

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)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

20 oct. 2007, 00:17

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

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Invité
Invité n'ayant pas de compte PHPfrance

20 oct. 2007, 09:54

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 :wink:

Eléphant du PHP | 443 Messages

20 oct. 2007, 10:13

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 :wink:
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.

toomwayer
Invité n'ayant pas de compte PHPfrance

20 oct. 2007, 10:29

--->"Comment fais-tu pour bosser sans doc "


le doc xml est ouvert plus haut

$xml="xml/playlist.xml";

Eléphant du PHP | 443 Messages

20 oct. 2007, 10:40

--->"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.

toowayer
Invité n'ayant pas de compte PHPfrance

20 oct. 2007, 10:54

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!

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

20 oct. 2007, 10:59

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)

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

toomwayer
Invité n'ayant pas de compte PHPfrance

20 oct. 2007, 11:11

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);?>

Eléphant du PHP | 443 Messages

20 oct. 2007, 11:14

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.

toomwayer
Invité n'ayant pas de compte PHPfrance

20 oct. 2007, 11:27

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 ...

Eléphant du PHP | 443 Messages

20 oct. 2007, 11:37

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.

toomwayer
Invité n'ayant pas de compte PHPfrance

20 oct. 2007, 11:43

c'est fait mais j'ai ça maintenant

Warning: DOMDocument::load() [function.load]: failed to load external entity

Invité
Invité n'ayant pas de compte PHPfrance

20 oct. 2007, 11:48

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> ......

Eléphant du PHP | 443 Messages

20 oct. 2007, 11:53

Laisse moi un moment pour faire un test.
Je te tiens au courant.


Tracker.