Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > DOM
DOM Forum d'entraide pour l'extension DOM permettant de manipuler des documents XML en PHP 5 (approche DOM). Avant de poster -> tutoriels DOM
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/09/2006, 09h22   #1
Fabouney
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Par défaut [DOM] problème de requête Xpath

bonjour à tous,

j'ai u nfichier xml comme ceci :

Code XML :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="ISO-8859-1" ?> 
<mobibase>
  <song id_song="5089">
    <title>Let_It_Be</title> 
    <artist>The_Beatles</artist> 
    <date_added>2006-01-04</date_added> 
    <date_update>2006-01-09</date_update> 
      <file id_file="134">
         <nom>000134-The_Beatles-Let_It_Be.mp3</nom> 
         <track_type>Instrumental</track_type> 
         <crc32>435948014</crc32> 
         <size>5514057</size> 
       </file>
    </song
</mobibase>

si je fait cette requête Xpath, il me retourne aucuns résultat, et je ne vois pas pk :

Code :
1
2
3
4
5
6
$xmlObject = new DomDocument();
$xmlObject->load($fichierXML);
$xmlPath = new DomXpath($xmlObject);
$songXpath = "//mobibase/song[id_song=\"5089\"]";
$result = $xmlPath->query($songXpath);
echo $result->length."<br>";
par contre si je recherche tt les song ("//mobibase/son")
cela fonctionne.

seriez-vous pourquoi ?

Dernière modification par julp ; 29/04/2007 à 17h38.
  Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2006, 09h33   #2
Membre expérimenté
 
Inscription : octobre 2004
Messages : 872
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 872
Points : 582
Points : 582
et comme ceci
Code :
$songXpath = "//mobibase/song[@id_song=\"5089\"]";
ca fait un momment que je n'ai pas pratiqué mais je crois qu'il une histoire @
http://www.w3.org/TR/xpath
jeff_! est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2006, 09h36   #3
Fabouney
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Ah bah vraiment merci jeff, comme quoi les doc c'est pas tjrs .... dans mon bouquin, ils mettent pas le @ ....
enfin merci bien

Dernière modification par Fabouney ; 29/09/2006 à 11h52.
  Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2006, 12h00   #4
Fabouney
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Another question ! lol
désolé ...

le résultat de mon Xpath me retourne le noeud <file>

mon objectif c'est de modifier la valeur des noeuds <crc32>, <track_type>, <size>.
pour infos, j'ai regarder dans la doc de DOM la méthode replaceChil() et je la trouve vraiment, mais alors vraiment pas clair.

faut-il que je parcours les enfants de mon noeud?
et que pour chaque enfants, je fait appel à la méthode replaceChild() pour modifier son contenu ?

j'avais commencé à faire ceci, mais franchement je trouve pas de solutions, c'est plutot frustrant :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$xmlObject = new DomDocument();
$xmlObject->load($fichierXML);
$xmlPath = new DomXpath($xmlObject);
$nodesList = $xmlPath->query("//mobibase/song[@id_song='$sid']/file[@id_file='$sfid']");
$node = $nodesList->item(0);
//parcours des enfants du noeuds trouvé
foreach($node->childNodes as $c)
{
//selon le nom du noed, on initialise les variables
if($c->nodeType == XML_ELEMENT_NODE)
{
	switch($c->nodeName)
	{
		case 'track_type' : ... ;
	}
}
}
$xmlObject->saveXML();
:'(
  Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2006, 12h10   #5
Membre expérimenté
 
Inscription : octobre 2004
Messages : 872
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 872
Points : 582
Points : 582
tu a juste te placer sur le noeud en question et utilisé la methode nodeValue
et c'est tout
Code :
$c->nodeValue = $newCRC
jeff_! est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2006, 12h14   #6
Fabouney
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
j'ai testé de faire ca .... et puis faire un saveXML aprés
mais il change rien du tout :s
  Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2006, 12h17   #7
Fabouney
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
AH c bon, en fait c'etait la méthode save() avec le fichier en paramétre ... lol
ca m'apprendras à pas regarder ! depuis le début j'avais fait ca en plus pfff.
merci pour le temp que tu m'a accordé jeff, bonne journée
  Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2006, 12h50   #8
Fabouney
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Décidement j'ai des problèmes de comrpéhension sur la classe DOM lol

est-il possible de supprimer un noeud particulier dans le fichier XML, je m'explique.
je récupére un noeud précis dans le fichierXML via Xpath, et je supprime ce noeud ainsi que ses enfants.

bon c'est la méthode removeChild() sans aucun doute.

j'ai procédé ainsi, mais il me dit que le noeud existe pas !

Code :
1
2
3
4
5
6
7
8
$nodeToDeleteList = $xmlPath->query("//mobibase/song[@id_song='$sid']");
							$nodeToDelete = $nodeToDeleteList->item(0);
try {
    $xmlObject->removeChild($node);
}catch(DOMException $e){
     //Gestion de l'exception
     echo $e->getMessage()."<br>";
}
j'ai cette exception :

Citation:
Not Found Error
P.S : je tient à préciser que $nodeToDelete est pas null, et que $noToDelete->nodeName = "song"
merci d'avance.
  Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2006, 15h50   #9
Fabouney
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
J'ai trouvé, pour ceux que ca interrese voila la solution :

Code :
1
2
3
4
5
6
7
8
$nodeToDeleteList = $xmlPath->query("//mobibase/song[@id_song='$sid']");
$nodeToDelete = $nodeToDeleteList->item(0);
try {
    $xmlObject->documentElement->removeChild($nodeToDelete);
}catch(DOMException $e){
     //Gestion de l'exception
     echo $e->getMessage()."<br>";
}
bonne nuit

Dernière modification par Fabouney ; 29/09/2006 à 23h57.
  Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h36.


 
 
 
 
Partenaires

Hébergement Web