PHP DOM & XML

Petit nouveau ! | 3 Messages

29 oct. 2010, 18:28

Salut à tous,
Je rencontre pas mal de problème pour lire un XML avec par PHP DOM. L'utilisation de getElementById me rend fou.
Voici la composition de mon XML (news_fr.xml) :

Code : Tout sélectionner

<?xml version="1.0" encoding="utf-8"?> <niouz> <news id="a1"> <news_date>01-01-2010</news_date> <news_langue>fr</news_langue> <news_categorie>Qualit&eacute;</news_categorie> <news_titre>test 1</news_titre> <news_texte>tetvcrfds</news_texte> <news_image>images/actus/</news_image> </news> <news id="a2"> <news_date>01-01-2010</news_date> <news_langue>fr</news_langue> <news_categorie>Qualit&eacute;</news_categorie> <news_titre>test 2</news_titre> <news_texte>regrgre</news_texte> <news_image>images/actus/</news_image> </news> </niouz>
Voici la composition de mon PHP pour la lecture de mes noeuds <news>:
                <?php

		if(isset($_GET['langue'])) $langue = $_GET['langue'];
		else $langue = '';
		if(isset($_GET['id'])) $id = $_GET['id'];
		else $id = '';

					if($langue == 'fr') {$fichier = 'news_fr.xml';}
					else {$fichier = 'news_uk.xml';}
					
					$dom = new DOMDocument('1.0', 'utf-8');
					$dom->validateOnParse = true;
					$dom->load($fichier);
					
					$news_node = $dom->getElementById('a'+$id);					
					$news_date = $news_node->nodeValue;

					echo '<h1>'.$news_date.'</h1>';
					
				?>
J'ai l'erreur suivante : Notice: Trying to get property of non-object in "ligne echo"
Comment récupérer les différents noeuds qui compose <news> par un id.
Merci d'avance pour votre aide.

devlop78
Invité n'ayant pas de compte PHPfrance

29 oct. 2010, 18:38

Moi aussi il m'a rendu fou. J'ai laissé tomber ^^

Mammouth du PHP | 19672 Messages

29 oct. 2010, 18:41

Peut-être qu'en faisant des concaténations avec un « . » comme en PHP au lieu d'un « + » comme en JavaScript ça fonctionnerait mieux ?
En faisant :
$news_node = $dom->getElementById ('a'. $id);
Et non
$news_node = $dom->getElementById ('a'+ $id);
:-*
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 3 Messages

29 oct. 2010, 18:47

Modif réalisé : + en .
Rien n'a changé.

J'ai essayé ca aussi :
$news_node = $dom->getElementById('a'.$id)->tagName;
echo '<h1>'.$news_node.'</h1>';
Toujour la même erreur sur l'echo : Notice: Trying to get property of non-object

Une après-midi de flinguer sur ce petit bug. J'ai cherché et testé pas mal de truc.
J'aimerai tellement faire fonctionner l'attribut "id" de news et passer par cette fonction getElementById.

Si pas de réponse dans le weekend, je ferai un noeud <news_id>.
J'invoque les dieux du débugage, ceux du PHP et toutes les divinités XML !!!

Mammouth du PHP | 19672 Messages

29 oct. 2010, 19:34

Je vois, on va t'aiguiller un peu alors : utilise simple_xml.

C'est fait à l'arrache, mais le résultat est là. Je n'ai pas fait de fioritures, à toi d'arranger les détails :
<?php
$langue  = (isset ($_GET['langue'])) ? $_GET['langue'] : 'fr';
$id      = (isset ($_GET['id']))     ? $_GET['id']     : 1;
$fichier = ($langue == 'fr')         ? 'news_fr.xml'   : 'news_uk.xml';

$sx = simplexml_load_file($fichier);

$sId = 'a'. $id;
foreach($sx as $n => $news)
{
    if($news['id'] == $sId)
    {
        $news_node = $sx->news;
    }
}

$news_date = (string) $news_node->news_date;
echo '<h1>' . $news_date . '</h1>';
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 5462 Messages

30 oct. 2010, 18:32

un xpath serait plus simple :wink:
$sx->xpath("//news[@id=\"a$id\"]");

Petit nouveau ! | 3 Messages

02 nov. 2010, 11:39

Merci pour vos aides.
J'ai écouté vos conseils. J'ai finalement utilisé Simple XML pour parvenir à mes fins.
Sujet clos.
A bientot