Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > DOMXML
DOMXML Forum d'entraide pour l'extension DOMXML permettant de manipuler des documents XML en PHP 4 (approche DOM). Avant de poster -> tutoriels DOMXML
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 18/08/2011, 20h39   #1
Invité de passage
 
Inscription : juin 2006
Messages : 84
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 84
Points : 4
Points : 4
Par défaut Lecture contenu xml

Bonjour,
je suis actuellement en train de lire un fichier xml et de le mettre dans une page en php.

un bout de mon xml :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
<CRITERES>
<Crit CLEF_CRITERE="121212" CLEF_MODA="4000014"/>
<Crit CLEF_CRITERE="79785464" CLEF_MODA="102"/>
<Crit CLEF_CRITERE="7895646" CLEF_MODA="0">http://www.monsite.fr/photos/imgsdsd.jpg</Crit>
<Crit CLEF_CRITERE="756456" CLEF_MODA="0">PAS UNE IMAGE</Crit>
<Crit CLEF_CRITERE="78965656" CLEF_MODA="1"/>
<Crit CLEF_CRITERE="785546" CLEF_MODA="1"/>
<Crit CLEF_CRITERE="4568755" CLEF_MODA="2"/>
<Crit CLEF_CRITERE="648765" CLEF_MODA="16"/>
</CRITERES>
Pour récupérer les valeurs je fais par exemple :

Code :
1
2
3
4
5
6
7
 
	$img = $item->getElementsByTagName('CRITERES');
	$img = $img->item(0)->nodeValue;
	if ($img != '') 
	{
        echo ' <img src="'.$img.'" width="100" class="gauchebrd"><br/>';
    }
le problème est que au lieu d'avoir un image qui s'affiche j'ai un erreur car dans le cas là j'ai au lieu de récupérer juste "http://www.monsite.fr/photos/imgsdsd.jpg"
je récupère "http://www.monsite.fr/photos/imgsdsd.jpgPAS UNE IMAGE" et je n'ai donc pas d'image qui s'affiche.

comment dois-je modifier mon code pour récupérer indépendamment les valeurs de <Crit CLEF_CRITERE=".....
fabrice88 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 18/08/2011, 21h36   #2
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 normal, c'est ce que vous demandez !

Et du coup, on ne sait pas ce que vous voulez, précisément et le code est incomplet. C'est les sous-éléments Crit qu'il faut logiquement atteindre.

Code :
1
2
3
4
5
6
7
8
9
10
11
<?php
$dom = new DomDocument;
//$dom->preserveWhiteSpace = FALSE;
$dom->load('monFichier.xml');
 
$crits = $dom->getElementsByTagName('Crit');
foreach ($crits as $crit) {
    if (!empty($crit->nodeValue)) {
        echo '<img src="'. $crit->nodeValue . '" width="100" class="gauchebrd" /><br />';
    }
}
? (non testé)
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 14h10   #3
Invité de passage
 
Inscription : juin 2006
Messages : 84
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 84
Points : 4
Points : 4
J'ai essayé et comme sa ne fonctionne pas je reprend depuis le début.

voici mon fichier XML :

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
 
<sit_liste>
    <NOM>Fini les vacances</NOM>
    <ADRPROD_CP>88250</ADRPROD_CP>
    <ADRPROD_TEL/>00 00 00 00 00<ADRPROD_TEL/>
    <ADRPROD_URL>www.unsite.com<ADRPROD_URL/>
    <COMMENTAIRE>infos sur l’actualité fini les vacances, retour à l’école</COMMENTAIRE>
    <CRITERES>
        <Crit CLEF_CRITERE="45" CLEF_MODA="4000014"/>
        <Crit CLEF_CRITERE="123" CLEF_MODA="102"/>
        <Crit CLEF_CRITERE="775" CLEF_MODA="0">http://www.monsite.com/ img4.jpg</Crit>
        <Crit CLEF_CRITERE="2323" CLEF_MODA="0">FAB</Crit>
        <Crit CLEF_CRITERE="4562" CLEF_MODA="1"/>
        <Crit CLEF_CRITERE="7897" CLEF_MODA="1"/>
        <Crit CLEF_CRITERE="32386" CLEF_MODA="2"/>
        <Crit CLEF_CRITERE="4658" CLEF_MODA="16"/>
    </CRITERES>
    <HORAIRES>
        <Horaire>
            <DATE_DEBUT fmt="DD/MM/YYYY">22/08/2011</DATE_DEBUT>
            <DATE_FIN fmt="DD/MM/YYYY">22/08/2011</DATE_FIN>
        </Horaire>
    </HORAIRES>
</sit_liste>
pour afficher les données via dom et php je fais :
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
42
43
44
45
46
<?php
$fichier = 'http://www.sitedistant.fr/fichier.xml';
$dom = new DOMDocument();
if (!$dom->load($fichier)) {
    die('Impossible de charger le fichier XML');
}
 
$itemList = $dom->getElementsByTagName('sit_liste');
 
foreach ($itemList as $item) 
{
 
$titre = $item->getElementsByTagName('NOM');
	$titre = $titre->item(0)->nodeValue;
	if ($titre != '') 
	{
echo '<h2>'.$titre.'</h2>'."\n";
} 
 
	$img = $item->getElementsByTagName('CRITERES');
	$img = $img->item(0)->nodeValue;
	if ($img != '') 
	{
echo ' <img src="'.$img.'" width="100" class="gauchebrd"><br/>';
} 
 
 
$commune = $item->getElementsByTagName('ADRPROD_LIBELLE_COMMUNE');
if ($desc->length > 0)
{
echo ' Commune : '.$commune->item(0)->nodeValue.'<br/>'."\n";
}
 
$debut = $item->getElementsByTagName('DATE_DEBUT');
if ($desc->length > 0) 
	{
        	echo ' Du : '.$debut->item(0)->nodeValue ;
    	}
 
    	$desc = $item->getElementsByTagName('COMMENTAIRE');
   	 if ($desc->length > 0) 
	{
        	echo ' '.$desc->item(0)->nodeValue.'<br/>'."\n";
    	}
}
?>
C'est lorsque j’essaie d'afficher les images qui sont dans Crit que sa bug.

par exemple si j'ai dans mon xml juste un seul Crit avec valeur comme:
Code :
<Crit CLEF_CRITERE="775" CLEF_MODA="0">http://www.monsite.com/ img4.jpg</Crit>
ok je récupère bien et affiche une image avec php

Mais si j'ai plusieurs résultats comme:
Code :
1
2
<Crit CLEF_CRITERE="775" CLEF_MODA="0">http://www.monsite.com/ img4.jpg</Crit>
<Crit CLEF_CRITERE="2323" CLEF_MODA="0">FAB</Crit>
Alors la au lieu de récupérer uniquement http://www.monsite.com/ img4.jpg je récupère http://www.monsite.com/ img4.jpgFAB et je ne peu donc pas afficher l'image avec mon php. (je ne veux récupérer de Crit que le type image et rien d'autre pour le moment)

j'ai essayé dans mon fichier php de remplacer
Code :
	$img = $item->getElementsByTagName('CRITERES');
par
Code :
	$img = $item->getElementsByTagName('Crit');
mais le problème est que je ne récupéré rien sauf si le 1er Crit contient qqc.

J’espère que c'est plus claire et que vous pourrez m'aider.
fabrice88 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 14h19   #4
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 normal, comme je vous l'ai déjà dit, puisque vous le faites depuis l'élément parent (CRITERES) alors que ce sont ses éléments Crit qu'il faut individuellement considérer.

Et c'est, une fois de plus, normal de ne "récupérer" que le 1er Crit si vous faites un ->item(0) au lieu d'une boucle.

PS : il y a éventuellement XPath comme solution (si ça convient), genre :
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
42
$xml = <<<EOX
<sit_liste>
    <NOM>Fini les vacances</NOM>
    <ADRPROD_CP>88250</ADRPROD_CP>
    <ADRPROD_TEL>00 00 00 00 00</ADRPROD_TEL>
    <ADRPROD_URL>www.unsite.com</ADRPROD_URL>
    <COMMENTAIRE>infos sur l’actualité fini les vacances, retour à l’école</COMMENTAIRE>
    <CRITERES>
        <Crit CLEF_CRITERE="45" CLEF_MODA="4000014"/>
        <Crit CLEF_CRITERE="123" CLEF_MODA="102"/>
        <Crit CLEF_CRITERE="775" CLEF_MODA="0">http://www.monsite.com/img4.jpg</Crit>
        <Crit CLEF_CRITERE="2323" CLEF_MODA="0">FAB</Crit>
        <Crit CLEF_CRITERE="4562" CLEF_MODA="1"/>
        <Crit CLEF_CRITERE="7897" CLEF_MODA="1"/>
        <Crit CLEF_CRITERE="32386" CLEF_MODA="2"/>
        <Crit CLEF_CRITERE="4658" CLEF_MODA="16"/>
    </CRITERES>
    <HORAIRES>
        <Horaire>
            <DATE_DEBUT fmt="DD/MM/YYYY">22/08/2011</DATE_DEBUT>
            <DATE_FIN fmt="DD/MM/YYYY">22/08/2011</DATE_FIN>
        </Horaire>
    </HORAIRES>
</sit_liste>
EOX;
 
$dom = new DomDocument;
//$dom->preserveWhiteSpace = FALSE;
$dom->loadXML($xml);
 
foreach ($dom->getElementsByTagName('Crit') as $crit) {
    if (!empty($crit->nodeValue)) {
        echo '<img src="'. $crit->nodeValue . '" width="100" class="gauchebrd" /><br />';
    }
}
 
echo '<hr />';
 
$xpath = new DomXPath($dom);
foreach ($xpath->query('//Crit[starts-with(text(), "http://")]') as $r) {
    echo '<img src="' . $r->nodeValue . '" width="100" class="gauchebrd" /><br />';
}
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 14h25   #5
Invité de passage
 
Inscription : juin 2006
Messages : 84
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 84
Points : 4
Points : 4
Dsl j'ai édité mon message alors que vous mettiez un réponse.

j'ai essayé d’intégré votre code dans le mien mais j'ai un message d'erreur du style :
Citation:
Fatal error: Can't use method return value in write context in /homepages/12/454565656/htdocs/actus2.php on line 152
en gros je ne sais pas comment modifier mon code pour y ajouter le votre.
fabrice88 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 14h34   #6
Invité de passage
 
Inscription : juin 2006
Messages : 84
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 84
Points : 4
Points : 4
Ah ok dsl.
j'ai donc remplacé dans mon fichier php :

Code :
1
2
3
4
5
6
7
 
	$img = $item->getElementsByTagName('CRITERES');
	$img = $img->item(0)->nodeValue;
	if ($img != '') 
	{
echo ' <img src="'.$img.'" width="100" class="gauchebrd"><br/>';
}
par :

Citation:
foreach ($dom->getElementsByTagName('Crit') as $crit) {
if (!empty($crit->nodeValue)) {
echo '<img src="'. $crit->nodeValue . '" width="100" class="gauchebrd" /><br />';
}
}

echo '<hr />';

$xpath = new DomXPath($dom);
foreach ($xpath->query('//Crit[starts-with(text(), "http://")]') as $r) {
echo '<img src="' . $r->nodeValue . '" width="100" class="gauchebrd" /><br />';
}
du coup sa fonctionne mais en partie car a chaque boucle on retrouve toutes les images du xml au lieu de n'avoir que celle correspondant a la boucle affiché.
fabrice88 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 14h53   #7
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-à-dire ? sit_liste n'est pas la racine, il y en a plusieurs ?

De toute façon, il y a juste à adapter les nœuds de référence à la structure réelle du document.
Code :
1
2
3
4
5
6
7
8
9
$sits = $dom->getElementsByTagName('sit_liste');
foreach ($sits as $sit) {
    # ...
    foreach ($sit->getElementsByTagName('Crit') as $crit) {
        if (!empty($crit->nodeValue)) { // + parse_url ?
            echo '<img src="'. $crit->nodeValue . '" width="100" class="gauchebrd" /><br />';
        }
    }
}
Ici, SimpleXML paraît plus approprié.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 15h07   #8
Invité de passage
 
Inscription : juin 2006
Messages : 84
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 84
Points : 4
Points : 4
par la suite je voudrai faire d'autre traitement sur le fichier xml (trie, recherche... mais bien plus tard. là j’essaie de comprendre comme sa fonctionne).

C'est bon sa fonctionne. les photos s'affiche bien comme on veut.
Un grand merci pour votre patience et votre partage de savoir.
fabrice88 est déconnecté   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 16h22.


 
 
 
 
Partenaires

Hébergement Web