DOMDocument - personnaliser ?

tipat10 Messages postés 9 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 8 mars 2007 - 30 nov. 2006 à 02:39
tipat10 Messages postés 9 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 8 mars 2007 - 1 déc. 2006 à 00:19
Bonjour,
Je souhaite "personnalier" les fonctions de DOMDocument.
J'ai donc créer ma propre classe :
class xml extends DOMDocument
{
    //pour une requète xpath
    public function xpq($query, $all=false)
    {
        $xpath = new DOMXPath($this);
        $result = $xpath->query($query, $this);
        if ($all) return $result;
        else return $result->item(0);
    }
   
    // attribut (nom plus court)
    public function attr($name)
    {
        return $this->getAttribute($name);
    }
}

Appel de la classe:
$xml = new xml();
$xml->load($file);
$node = $xml->xpq("//site/page[@nom='1']");
echo $node->attr("nom");
J'obtiens l'erreur suivante :
Fatal error: Call to undefined method DOMElement::attr()

Je crois quie le problème c'est que $node est de type DOMElement et donc qu'il ne peut pas accéder à attr().
Je ne sais vraiment pas quoi faire pour résoudre ce problème.  C'est la première fois que je m'aventure à faire une class.  Pouvez-vous m'aider SVP ?

2 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
30 nov. 2006 à 09:32
Hello,

$node = $xml->xpq("//site/page[@nom='1']");
appelle cette méthode de ta classe xml :
    public function xpq($query, $all=false)
    {
        $xpath = new DOMXPath($this);
        $result = $xpath->query($query, $this);
        if ($all) return $result;
        else return $result->item(0);
    }

qui retourne un DOMElement, et pas une instance de ta classe.

echo $node->attr("nom");

Appelle la méthode attr() de la classe DOMElement.
Et effectivement, cette méthode n'existe pas.

Tu ne parviendras pas à tes fins aussi facilement...
Si tu veux faire ce que tu essayes de faire, tu vas devoir surcharger plkusieurs classes, en plus de DOMDocument. Ici, tu devras déjà étendre DOMXpath, et surcharger sa méthode query, pour qu'elle renvoie une classe personnalisée, à toi, qui étendra DOMElement, et surcharger la méthode DOMElement::getAttribute ().

La POO est plus compliquée que ce que tu le penses ;-)
0
tipat10 Messages postés 9 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 8 mars 2007 1
1 déc. 2006 à 00:19
Bonjour,
Merci pour ta réponse

Si je comprend bien, il faudrait que je refasse toute les classes DOM* avec mes propre fonction.  C'est bien ça ?
si oui, comment obtenir les source php pour les modifier ?
0
Rejoignez-nous