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 25/11/2010, 16h25   #1
Membre éclairé
 
Avatar de Space Cowboy
 
Inscription : avril 2005
Messages : 493
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 493
Points : 304
Points : 304
Par défaut [DOM] Informations sur l'affichage des informations récupérer via Xpath Query

Bonjour,

Suite de ce précédent topic.

J'ai réussi à extraire mes données via une requête Xpath. J'aimerais maintenant les manipuler. J'aimerais savoir si il était possible de récupérer la valeur et le code HTML contenu dans le "nodeValue" ?


Voici 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
<?php
$url='    <h2 class="title_lowercase">MATERIEL 1</h2>
    <h2>Général</h2>
 
    <div class="carac">
    	<table class="description">
            <tr>
                <td>Info 1</td>
                <td class="td-desc">
					<ol>
						<li>Valeur 1</li>
						<li>Valeur 2</li>
					</ol>
				</td>
            </tr>
            <tr>
                <td>Info 2</td>
                <td class="td-desc">Valeur 2</td>
            </tr>
    	</table>
    </div>
';
 
 
	$dom = new DOMDocument();
	@$dom->loadHTMLFile($url);
	$xpath = new DOMXPath($dom);
 
	$caracteristiques = array(); // info => valeur
	$caracteristiques_entries = $xpath->query('//table[@class="description" and position() = 1]/tr');
 
	// //h3/following-sibling::node[1]/tr 
 
	foreach($caracteristiques_entries as $entry){
		$caracteristiques[$entry->childNodes->item(0)->nodeValue] = $entry->childNodes->item(2)->nodeValue;
	}
 
	echo '<pre>';
	print_r($caracteristiques);
	echo '</pre>';
Ce code m'affiche :
Code :
1
2
3
4
5
    [Info 1] => 
					Valeur 1
						Valeur 2
 
    [Info 2] => Valeur 2
Mais sans le code HTML, donc je n'ai pas la possibilité de séparer les deux valeurs.
Sachant que je ne sais pas par avance si la valeur contient du code HTML !

Je trouve très peu d'information sur la facon de lire le résultat d'une requête Xpath. Auriez vous des infos la dessus ? J'arrive à deviner le fonctionnement de cette ligne, mais sans plus.
Space Cowboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 16h44   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 464
Points : 8 464
loadHTML et pas loadHTMLFile

pourquoi ne pas rester dans le même sujet ?
http://www.developpez.net/forums/d10...tion-attribut/

le html il est visiblement la, c'est juste qu'il est interprété par ton navigateur regarde la source
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 18h17   #3
Modérateur
 
Avatar de ThomasR
 
Homme Thomas Rambaud
Développeur Web
Inscription : décembre 2007
Messages : 2 134
Détails du profil
Informations personnelles :
Nom : Homme Thomas Rambaud
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2007
Messages : 2 134
Points : 2 877
Points : 2 877
Space Cowboy, tu as dû loupé quelque-chose en PHP, dans l'exemple que tu montres, je t'ai montré comment récupérer le contenu de ton tableau HTML sous la forme d'une tableau PHP.

Tu peux très bien réafficher ce résultat sous une autre forme :
Code :
1
2
3
4
 
foreach($caracteristiques as $nom => $carac){
    echo $nom . ' : ' . $carac . '<br/>';
}
Si ton but est d'afficher directement le HTML du tableau, pas besoin de parcourir les lignes de ton tableau via XPath, tu peux directement récupérer le HTML.

Code :
1
2
3
 
$caracteristiques_table = $xpath->query('//table[@class="description" and position() = 1]');
$caracteristiques_table_html = $dom->saveXML($caracteristiques_table->item(0));
__________________
Développeur Web, accessoirement geek (ou l'inverse)
http://thomasrambaud.com
ThomasR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 09h58   #4
Membre éclairé
 
Avatar de Space Cowboy
 
Inscription : avril 2005
Messages : 493
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 493
Points : 304
Points : 304
Citation:
Envoyé par stealth35 Voir le message
loadHTML et pas loadHTMLFile

pourquoi ne pas rester dans le même sujet ?
http://www.developpez.net/forums/d10...tion-attribut/

le html il est visiblement la, c'est juste qu'il est interprété par ton navigateur regarde la source

Le seul moyen de différencier les deux valeurs lorsqu'elle sont dans un ul/li c'est de garder le code HTML dans le tableau PHP.
Je ne pense pas que le code soit interprété par le navigateur, il n'est pas présent dans le code source.








Citation:
Envoyé par ThomasR Voir le message
Space Cowboy, tu as dû loupé quelque-chose en PHP, dans l'exemple que tu montres, je t'ai montré comment récupérer le contenu de ton tableau HTML sous la forme d'une tableau PHP.

Tu peux très bien réafficher ce résultat sous une autre forme :
Code :
1
2
3
4
 
foreach($caracteristiques as $nom => $carac){
    echo $nom . ' : ' . $carac . '<br/>';
}
J'avais vu, c'est les "childNodes" et "nodeValue" que je n'ai pas saisi.
Mais le code HTML de la balise /tr n'est pas dedans.








loadHTML au lieu de loadHTMLFile ne renvois rien.
Actuellement, je fais mes tests sur un fichier .html présent dans le même répertoire.
Space Cowboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 10h12   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 464
Points : 8 464
Citation:
Envoyé par Space Cowboy Voir le message
loadHTML au lieu de loadHTMLFile ne renvois rien.
Actuellement, je fais mes tests sur un fichier .html présent dans le même répertoire.
c'etait dans ton exemple que c'était pas bon
si je comprend bien tu veux récupérer le innerHTML ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 10h45   #6
Membre éclairé
 
Avatar de Space Cowboy
 
Inscription : avril 2005
Messages : 493
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 493
Points : 304
Points : 304
Citation:
Envoyé par stealth35 Voir le message
c'etait dans ton exemple que c'était pas bon
si je comprend bien tu veux récupérer le innerHTML ?
C'est ca.
Space Cowboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 10h52   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 464
Points : 8 464
Citation:
Envoyé par Space Cowboy Voir le message
C'est ca.
y'a pas de fonction pour créer ca directement, mais y'a des astuces pour le faire
http://www.php.net/manual/en/book.dom.php#89718
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 14h23   #8
Membre éclairé
 
Avatar de Space Cowboy
 
Inscription : avril 2005
Messages : 493
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 493
Points : 304
Points : 304
Code :
1
2
3
4
5
6
7
8
9
10
11
 
	foreach($caracteristiques_entries as $entry)
	{
		$A=$entry->childNodes->item(0)->nodeValue;
		$B=$entry->childNodes->item(2)->nodeValue;
		$B=str_replace('<br />','\n', $B);
		echo $A.' - '.$B.'<br />';
 
 
 
	}
Ca ne fonctionne pas.

Le problème viens du code renvoyé par $xpath->query Apparament ca supprime completement les balises HTML :/
Ca expliquerais pourquoi je ne récupére pas les images qui sont présente dans la balise /td
Space Cowboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 15h21   #9
Modérateur
 
Avatar de ThomasR
 
Homme Thomas Rambaud
Développeur Web
Inscription : décembre 2007
Messages : 2 134
Détails du profil
Informations personnelles :
Nom : Homme Thomas Rambaud
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2007
Messages : 2 134
Points : 2 877
Points : 2 877
Bonjour,

En fait ca ne supprime pas le HTML c'est nodeValue qui ne renvoie que la valeur du noeud texte.

Il faut utiliser la méthode saveXML de l'objet DomDocument et lui passer en paramètre le noeud à extraire, le fonction retourne alors une chaine de caractères.

Code :
1
2
3
4
5
6
7
8
 
foreach($caracteristiques_entries as $entry)
{
    $title = $dom->saveXML($entry->childNodes->item(0));
    $body = $dom->saveXML($entry->childNodes->item(2));
 
    echo $title . ' - ' . $body . '<br />'; 
}
http://www.gibdon.com/2010/06/php-do...t-and-xml.html
__________________
Développeur Web, accessoirement geek (ou l'inverse)
http://thomasrambaud.com
ThomasR est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/11/2010, 16h57   #10
Membre éclairé
 
Avatar de Space Cowboy
 
Inscription : avril 2005
Messages : 493
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 493
Points : 304
Points : 304
Citation:
Envoyé par ThomasR Voir le message
Bonjour,

En fait ca ne supprime pas le HTML c'est nodeValue qui ne renvoie que la valeur du noeud texte.

Il faut utiliser la méthode saveXML de l'objet DomDocument et lui passer en paramètre le noeud à extraire, le fonction retourne alors une chaine de caractères.

Code :
1
2
3
4
5
6
7
8
 
foreach($caracteristiques_entries as $entry)
{
    $title = $dom->saveXML($entry->childNodes->item(0));
    $body = $dom->saveXML($entry->childNodes->item(2));
 
    echo $title . ' - ' . $body . '<br />'; 
}
http://www.gibdon.com/2010/06/php-do...t-and-xml.html
Ca fonctionne ! j'ai quelque soucis de caractère spéciaux ( ) qui viennent mais rien de dramatique.
Space Cowboy 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 19h10.


 
 
 
 
Partenaires

Hébergement Web