Page 1 sur 1
DomXML lecture d'attribut
Posté : 11 oct. 2005, 17:55
par jeff
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
Posté : 12 oct. 2005, 10:30
par jeff
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/>');
}
}

Posté : 12 oct. 2005, 10:35
par mere-teresa
Quel est ton message d'erreur ?
Posté : 12 oct. 2005, 11:13
par jeff
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);
}
}
Posté : 12 oct. 2005, 11:39
par mere-teresa
$action->getAttribute('methode')
'methode' est une chaîne de caractères et c'est un objet qui est attendu...
Posté : 12 oct. 2005, 11:51
par jeff
Posté : 12 oct. 2005, 12:02
par mere-teresa
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)
Posté : 12 oct. 2005, 14:04
par Xenon_54
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');
?>
Posté : 12 oct. 2005, 14:49
par jeff
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;
}
Posté : 14 oct. 2005, 06:32
par Xenon_54
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
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é.
