Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > SimpleXML
SimpleXML Forum d'entraide pour l'extension SimpleXML, qui permet de manipuler des documents XML en PHP (approche 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 24/05/2007, 13h04   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 24
Points : 11
Points : 11
Par défaut [SimpleXML] je sèche sur l'origine d'une erreur

Bonjour à tous...

Voilà, je m'adresse à vous... car la je comprends pas mon erreur...

Conf: Php 5.2.0

J'ai une classe de chargement de modules qui doit parser un fichier xml lors de la construction, qui me retourne une erreur simpleXml...

le fichier xml modules.xml

Code XML :
1
2
3
4
5
6
7
<?xml version='1.0' encoding="UTF-8" ?>
<modules>
	<module name="SystemCore" status="1" src="./class/SystemCore.php" />
	<module name="log" status="1" src="./class/log.php" />
	<module name="mysql" status="1" src="./class/mysql.php" />
	<module name="test" status="1" src="./class/class.test.php" />
</modules>

Le constructeur en question: awaeCore.php

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
protected function __construct() {
 
		$classname = strtolower(get_class($this));
 
		// Si la classe a déja été instancié, pas la peine de refaire une recherche.
		if ( !isset(self::$_module[$classname]) ) {
			// On charge le fichier de conf.
			self::$_xml = simplexml_load_file($this->FileConf);
 
			// On regarde si le module existe dans le fichier modules.xml.
			$var = self::$_xml->xpath('//module[@name="'.$classname.'"]');
			// Si c'est pas le cas ==> erreur
			if ( $var === FALSE )
			throw new Exception('Module '.$classname.' introuvable dans le fichier de configuration');
 
			// On recherche la chaine XML du module.
			$mod = simplexml_load_string($var[0]->asXml());
			// On vérifie son status.
			if ( (int) $mod['status'] === 0 ) {
				throw new Exception('Module '.$classname.' ne peut être chargé : Status = 0');
			} elseif ( (int) $mod['status'] === 2 ) {
				$this->debug = TRUE;
			}
		}
Lors de l'appel... j'ai un Fatal error:
Citation:
Call to a member function asXml() on a non-object in /Applications/MAMP/www/masociete.local/awae-r1/awaeCore.php on line 29...
la ligne 29:

Code :
$mod = simplexml_load_string($var[0]->asXml());
Si je comprends bien... il me dit que $var[0] n'est pas un objet simplexml... pourtant...

un print_r de $var[0]:

Code X :
1
2
3
4
5
6
7
8
9
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [name] => test
            [status] => 1
            [src] => ./class/class.test.php
        )
)

Voila... au secours, là je suis vraiment désespéré... cherché partout... déjà passé quelques heures sur le problème... éclairé moi de vos lanternes...

Manu
fastmanu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2007, 13h14   #2
Membre confirmé
 
Inscription : mai 2006
Messages : 196
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 196
Points : 278
Points : 278
Mwep en fait déjà il y a un petit truc qui me chiffone c'est :
Code :
$classname = strtolower(get_class($this));
Pourquoi tu la met tout en minuscule ? Car après tu refait un test du nom mais dans ton XML l'attribut comporte des majuscule alors que ta variable PHP sera tout en minuscule et l'XML est sensible à la case :
Code :
1
2
3
4
5
6
7
8
9
 
//Tu le recherche :
$var = self::$_xml->xpath('//module[@name="'.$classname.'"]');
 
//Mais dans ton XML pour cet attribut il te faut les majuscules je pense.
<module name="SystemCore" status="1" src="./class/SystemCore.php" />
 
//Et essaye de charger depuis $var et non $var[0]
$mod = simplexml_load_string($var->asXml());
Mais je vois pas pourquoi tu fait sa :o car au final $mod sera identique à ton $var :s donc reste avec $var. Car var[0]->asXML() va transformer ton objet XML en une chaîne pour du XML 1.0 (si tu veut utiliser les fonctions DOM en fait) et apres simplexml_load_string va convertir la chaine XML 1.0 en une chaîne simplexml soit ton $var au début !! Sinon un conseil utilise les fonctions DOM c'est un peu plus complexe à comprendre mais sa te permet de faire beaucoups plus de choses, le simplexml je l'utilisai au début surtout pour extraire des données facilement pour du multi language mais jsuis passé au DOM le DOM normal, car y a les fonctions DOM XML et les fonctions DOM (le mieu c'est DOM normal ^^).
meliandah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2007, 14h44   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 24
Points : 11
Points : 11
En effet...

j'ai finallement carrément viré le

Code :
$mod = simplexml_load_string($var->asXml());
et le strtolower...

Merci pour ta lanterne
fastmanu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2007, 15h22   #4
Membre confirmé
 
Inscription : mai 2006
Messages : 196
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 196
Points : 278
Points : 278
Donc sa marche la ?
meliandah 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 03h41.


 
 
 
 
Partenaires

Hébergement Web