DomXML lecture d'attribut

Mammouth du PHP | 1311 Messages

11 oct. 2005, 17:55

salut
j'ai un souci avec la lecteure des attributs d'un noued
fichier xml

Code : Tout sélectionner

<?xml version="1.0" encoding="iso-8859-1"?> <Bibliotheque> <action methode="Get" user="all">Init</action> <action methode="None" user="all">Erreur</action> </Bibliotheque>
et fichier php
function XML($file)
{
	$document =new DomDocument();
	$document->load($file);
	$racine=$document->documentElement;
	foreach($racine->childNodes as $action)
	{
		if($action->nodeType== XML_ELEMENT_NODE)
			$txt= $action->nodeName.'-'.$action->nodeValue.'-';
		if($action->hasAttribute())
			$txt.='methode='.$action->getAttribute('methode').' - user='.$action->getAttribute('user');
               else
                        $txt.='non';
		print($txt.'<br/>');
	}
}
a l'execution j'ai une erreur fatal(impossible d'apeller la methode getAttribute())
je suis sous php5 et libXML version 2.6.11
merci

Mammouth du PHP | 1311 Messages

12 oct. 2005, 10:30

ce code fonctionne
function XML($file)
{
	$document =new DomDocument();
	$document->load($file);
	$racine=$document->documentElement;
	foreach($racine->childNodes as $action)
	{
		if($action->nodeType== XML_ELEMENT_NODE)
			$txt= $action->nodeName.'-'.$action->nodeValue.'-';
		if($action->hasAttributes())
			$txt.='methode='.$action->getAttribute('methode').' - user='.$action->getAttribute('user');
		print($txt.'<br/>');
	}
}
mais si je fait celui il ne fonctionne pas
function XML($file)
{
	$document =new DomDocument();
	$document->load($file);
	$racine=$document->documentElement;
	foreach($racine->childNodes as $action)
	{
		if($action->nodeType== XML_ELEMENT_NODE)
			$txt= $action->nodeName.'-'.$action->nodeValue.'-';
		//if($action->hasAttributes())
			$txt.='methode='.$action->getAttribute('methode').' - user='.$action->getAttribute('user');
		print($txt.'<br/>');
	}
}
:?: :?:

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

12 oct. 2005, 10:35

Quel est ton message d'erreur ?
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Mammouth du PHP | 1311 Messages

12 oct. 2005, 11:13

la voila

Code : Tout sélectionner

Fatal error: Call to a member function getAttribute() on a non-object in e:\wamp\www\projet_ing\lib\fonctions\DomXml.php on line 12
mais bon je refait tous sous la forme d'une classe
Class ActionXml extends domDocument
{
	private $file;
	
	public function __construct()
	{
		parent::__construct();
		$this->fic=null;
	}
	
	public function SetFic($file)
	{
		$this->fic=$file;
	}

	public function ReadXml()
	{
		$this->load($this->fic);
		$racine=$this->documentElement;
		$i=0;
		foreach($racine->childNodes as $action)
		{
				if($action->nodeType== XML_ELEMENT_NODE && $action->hasAttributes())
				{
					$tab[$i]=array('action'=>$action->nodeValue,'method'=>$action->getAttribute('methode'),'user'=>$action->getAttribute('user'),'url'=>$action->getAttribute('url'));
					$i++;					
				}
		}
		return 	$tab;
		print_r($tab);
	}
}

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

12 oct. 2005, 11:39

$action->getAttribute('methode')

'methode' est une chaîne de caractères et c'est un objet qui est attendu...

Mammouth du PHP | 1311 Messages

12 oct. 2005, 11:51


Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

12 oct. 2005, 12:02

Pardon j'ai pris le truc à l'envers...c'est $action qui n'est pas un obj, donc remonte à l'endroit où tu génères $action

et fais un var_dump($action)

Mammouth du PHP | 1885 Messages

12 oct. 2005, 14:04

Essaie ceci:
<?php
function XML($file)
{
	$document = new DomDocument();
	$document->load($file);
	$racine = $document->documentElement;
	foreach($racine->childNodes as $action)
	{
		if($action->nodeType== XML_ELEMENT_NODE) {
			$txt= $action->nodeName.'-'.$action->nodeValue.'-';
			if($action->hasAttributes())
			{
				$txt .= 'methode='.$action->getAttribute('methode').' - user='.$action->getAttribute('user');
			}
			print($txt.'<br/>');
		}
	}
}

XML('bibliotheque.xml');
?>
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

Mammouth du PHP | 1311 Messages

12 oct. 2005, 14:49

bon ba c'est resolu
merci
	public function VerifAction($array)
	{
		foreach($this->documentElement->childNodes  as $action)
		{
			if($action->nodeValue==$array[0] && strtolower($action->getAttribute('methode'))==$array[1] )
				$flag='ok';
		}
		isset($flag)&&$flag='ok'?$r=true:$r=false;
	return $r;
	}

Mammouth du PHP | 1885 Messages

14 oct. 2005, 06:32

Un petit break; pour éviter de boucler alors que tu as déjà trouvé?
Et puis, juste isset() serait suffisant puisque s'il trouve pas, $flag ne sera jamais initialisé.
Comme dirait ma professeure de scripts shell Windows et Linux: Non, ce n'est pas optimal :D

Alors
	public function VerifAction($array)
	{
		$flag = FALSE;
		foreach($this->documentElement->childNodes  as $action)
		{
			if($action->nodeValue==$array[0] && strtolower($action->getAttribute('methode'))==$array[1] ) {
				$flag = TRUE;
				break;
			}
		}
		
		return $flag;
	}
Une variable de moins et une sortie de boucle lorsque trouvé.

;)
La programmation est l'expression de la poésie d'un programmeur
Génération PHP