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 23/08/2007, 00h23   #1
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
Par défaut [DOM] Utilisation d'Xpath

Bonjour,

Je cherche a récupérer la valeur d'un noeud :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0"?>
<feed>
  <entry>
    <id>id</id>
    <title>ICI</title>
    <updated>date</updated>
  </entry>
  <entry>
    <id>id</id>
    <title>pas ici par contre</title>
    <updated>date</updated>
  </entry>
</feed>
J'ai compris qu'il fallait utiliser un truc comme :
Code :
1
2
	$xpath = new DomXPath($dom);
	$path = $xpath->query('/feed/entry/title');
Mais j'arrive pas a trouver quoi mettre dans le query pour que ça soit bon.

Mon but étant de trouver un noeud qui a comme texte : ICI afin de modifier ce texte après.

NB : J'ai lu ce topic mais ca m'avance pas plus : http://www.developpez.net/forums/sho...d.php?t=397194.
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 01h37   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 827
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 827
Points : 3 459
Points : 3 459
Tu veux récupérer le <title> du 1er <entry> ? Dans ce cas :

__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 08h54   #3
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
Je veux récupéré le title de l'entry qui a pour texte ICI.
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 09h18   #4
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
C'est plutot un problème de XPath que de PHP dans ce cas...
Syntaxe de XPath
je dirai
Code :
/feed/entry/[title=='ICI']
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 09h36   #5
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
Marche pas. Avec 1 egale non plus.
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 11h04   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
$xml = <<< EOX
<?xml version="1.0" encoding="ISO-8859-1"?>
<feed>
  <entry>
    <id>id</id>
    <title>ICI</title>
    <updated>date</updated>
  </entry>
  <entry>
    <id>id</id>
    <title>pas ici par contre</title>
    <updated>date</updated>
  </entry>
</feed>
EOX;
 
$dom = new DomDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->formatOutput = TRUE;
$dom->loadXML($xml);
$xpath = new DomXPath($dom);
$res = $xpath->query('//*[text() = "ICI"]');
foreach ($res as $node) {
    printf('%s : %s<br/>', $node->nodeName, $node->nodeValue);
}


Pour le(s) modifier ensuite vous avez la réponse dans l'autre sujet.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 11h35   #7
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
Ta solution marche mais elle va surement me prendre d'autre ligne qu'il ne faut pas d'après ce que j'ai compris.

Je veux uniquement récupérer les ligne qui sont sous feed->entry->title.

Pas des autre qui pourrait etre dans feed->autrechose.
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 11h38   #8
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Code :
$res = $xpath->query('/feed/entry/title[text() = "ICI"]');
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 11h41   #9
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
Non ca j'ai essayé

Ca me renvoie NULL donc c'est pas bon.
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 11h48   #10
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
D'où la nécessité d'être précis

Je me suis fait grillé par mon fillot car j'allais proposer la même chose. Vous n'auriez pas par le plus grand hasard des caractères spéciaux ?
Code :
$res = $xpath->query(utf8_encode('/feed/entry/title[text() = "Mémé dans les orties"]'));
Ce n'est pas forcément LA solution car cela dépend de l'encodage que vous pouvez utiliser/spécifier.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 12h01   #11
Membre du Club
 
Inscription : juillet 2006
Messages : 66
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 66
Points : 50
Points : 50
Euh dites moi... pourquoi est-ce que vous mettez "/feed/"

( la réponse de koopajah etait : "$res = $xpath->query('/feed/entry/title[text() = "ICI"]');" donc presque correcte )
Code :
1
2
3
4
 
$nodes = $str -> xPath('//entry/title[text()="ICI"]');
 
var_dump( $nodes );
Finidrigoler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 12h04   #12
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Citation:
Envoyé par _cqu_ Voir le message
Euh dites moi... pourquoi est-ce que vous mettez "/feed/"

( la réponse de koopajah etait : "$res = $xpath->query('/feed/entry/title[text() = "ICI"]');" donc presque correcte )
Code :
1
2
3
4
 
$nodes = $str -> xPath('//entry/title[text()="ICI"]');
 
var_dump( $nodes );
Je mets feed parce que je dis / <= en partant de la racine
feed <= dans les noeuds feed
/entry <= dans les noeuds entry fils du noeud feed
/title <= dans le noeud title
[text() = "ICI"] <= dont la valeur est "ici"

dans ta formulation, si on a des noeuds entry qui sont fils d'un noeud title par exemple ca les prendra en compte quand meme.
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 12h07   #13
Membre du Club
 
Inscription : juillet 2006
Messages : 66
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juillet 2006
Messages : 66
Points : 50
Points : 50
Ah oui c'est vrai
Finidrigoler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 12h16   #14
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
Je n'ai aucun caractère accentuer, juste un espace dans la chaine.

La solution de cqu donne NULL aussi.

Voila le XML que j'utilise pour les test :
Code XML :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>http://localhost/zf/public/</id>
  <title>News</title>
  <link href="http://example.org/"/>
  <updated>2003-12-13T18:30:02Z</updated>
  <author>
    <name>Yoshio</name>
    <email>mail@example.com</email>
  </author>
  <link rel="self" href="http://localhost/zf/public/feed"/>
  <category term="anime"/>
  <rights>&#xA9; 2007 Yoshio</rights>
  <entry>
    <id>luciela-feed:id:1041086e6f26beb0daa6eacd14a8595c</id>
    <title>Test RSS</title>
    <updated>2007-08-22T19:59:40+02:00</updated>
  </entry>
</feed>

et le code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
 
// Load Xml
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->load('public/feed/news.xml');
 
$oldNewsTitle = 'Test RSS';
 
$xpath = new DomXPath($dom);
$res = $xpath->query('/feed/entry/title[text()="'.$oldNewsTitle.'"]');
 
var_dump($res->item(0)->nodeValue);
 
foreach ($res as $node) {
    printf('%s : %s<br/>', $node->nodeName, $node->nodeValue);
}
 
 
// Save XML to file
$dom->save('public/feed/news.xml');	
 
 
?>
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 13h29   #15
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
C'est à cause du namespace :
Code :
1
2
3
4
5
# ...
$xpath = new DomXPath($dom);
$xpath->registerNamespace('ns', $dom->documentElement->namespaceURI);
$res = $xpath->query('/ns:feed/ns:entry/ns:title[text() = "'.$oldNewsTitle.'"]');
# ...
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 13h59   #16
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
Ah gg ca

Est ce que je pourrais avoir un petit supplément d'information ?
C'est quoi ce namespace ? ns ? Pourquoi le fait de le rajouter ca marche ?
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 14h22   #17
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par Yoshio
C'est quoi ce namespace ?
C'est toi qui en donne un par défaut pour Atom dans ton document ici :
Code X :
xmlns="http://www.w3.org/2005/Atom"

Citation:
Envoyé par Yoshio
ns ?
C'est simplement un nom que j'ai choisi pour renommer le namespace par défaut qui n'est pas reconnu.

Citation:
Envoyé par Yoshio
Pourquoi le fait de le rajouter ca marche ?
XPath (libxml2, la librairie sous-jacente ?) ne sait pas s'en sortir seule avec un espace de nom par défaut. On aurait pu écrire autrement l'expression XPath sans modifier le document XML pour s'en sortir, du style :
Code X :
/*[local-name() = "feed"]/*[local-name() = "entry"]/*[local-name() = "title" and text() = "Test RSS"]
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 14h33   #18
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
Ok merci des précisions.
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h48.


 
 
 
 
Partenaires

Hébergement Web