Aller au contenu

[Résolu]XPath et DOM sur PHP


Sujets conseillés

Posté (modifié)

Bonjour. J'ai actuelement deux problèmes avec les implémentations PHP de DOM et XPath.

Tout d'abord, l'objet NodeList de DOM. Les spécifications du W3C ( http://www.w3.org/TR/2000/REC-DOM-Level-2-...ml#ID-536297177 ) indiquent bien que la methode item() doit retourner un autre objet, de type Node. Ce code devrait donc logiquement retourner DOMNode

$tree = new DomDocument();
$tree->load('./res/file.xml');
$list = $tree->getElementsByTagName('entry');
echo get_class($list->item(0));

Or, c'est DOMElement que je recoit à la place.

Le deuxième problème est avec les expressions XPath. Toute requête mentionnant le nom d'un élément ne retroune aucun résultat. Exemple :

$tree = new DomDocument();
$tree->load('./res/file.xml');
$xpath = new DomXPath($tree);
$list = $xpath->query('//entry');
echo $list->length;

Ce code renvoit 0 à l'écran alors que l'élément <entry> existe bel et bien (voir premier exemple ci-dessus). Une requête du style //* marche parfaitement bien et renvoit tous les noeuds du document, par contre.

Voilà, j'espère que quelqu'un arrivera à me sortir du brouillard, parce que j'ai beau chercher, je ne trouve pas vraiment de solution au problème. Je précise que je travaille avec PHP 5.0.3 et l'extension DOM (pas DOM XML de PHP4, donc).

Modifié par Tchyo
Posté
Ce code devrait donc logiquement retourner DOMNode ...

Or, c'est DOMElement que je recoit à la place.

Un DomElement *est* un DomNode, c'est un DomNode spécial mais un DomNode quand même (en xml un élément est un noeud) : DomElement est une classe dérivée de DomNode.

Toute requête mentionnant le nom d'un élément ne retroune aucun résultat.

Est-ce que tu as bien fais attention aux espaces de nom ? à vue de nez je dirai que ton <entry> est dans un espace de nom quelconque, ce qui explique que xpth ne le trouve pas mais que le getElementsByTagName le trouve.

Posté (modifié)
Un DomElement *est* un DomNode, c'est un DomNode spécial mais un DomNode quand même (en xml un élément est un noeud) : DomElement est une classe dérivée de DomNode.

En fait, il me renvoit une erreur fatale lors de l'utilisation de la methode insertBefore()

$tree->insertBefore($newentry, $firstentry)

Le problème est qu'il me renvoit une DOMException avec un essage Not Found Error (très explicite). Est-ce que ça voudrait plutôt dire qu'il n'a pas réussi à retrouver la Node que j'ai inséré en argument Refnode ?

Est-ce que tu as bien fais attention aux espaces de nom ? à vue de nez je dirai que ton <entry> est dans un espace de nom quelconque, ce qui explique que xpath ne le trouve pas mais que le getElementsByTagName le trouve.

Possible, j'ai pu rater un detail dans la notion d'espace de nommage. Il s'agit du code XML d'un feed Atom, à tout hasard (les specs sont disponibles ici : http://atomenabled.org/developers/syndicat...format-spec.php )

<?xml version="1.0" encoding="utf-8" ?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="fr">
<title>Feed Atom</title>
<link rel="alternate" type="text/html" href="http://fqdn/"/>
<link rel="alternate" type="application/xhtml+xml" href="http://fqdn/"/>
<modified>2005-02-12T23:43:50+01:00</modified>
<author>
 <name>Auteur</name>
</author>
<contributor>
 <name>Contributeur</name>
</contributor>
<tagline type="text/plain" mode="escaped">Exemple de feed Atom</tagline>
<id>http://fqdn/feed/atom/</id>

<entry>
 <title>Exemple d'entrée de feed Atom</title>
 <link rel="alternate" type="text/html" href="http://fqdn/news.php?id=1"/>
 <id>http://fqdn/feed/atom/1</id>
 <issued>2005-02-12T23:43:50+01:00</issued>
 <modified>2005-02-12T23:43:50+01:00</modified>
 <summary>Voici un court exemple d'article obtenu à travers un feed Atom</summary>
 <content type="text/html" mode="escaped">Texte</content>
</entry>
</feed>

Est-ce qu'il faudrait plutôt taper des noms d'éléments du style atom:entry ?

EDIT : Problème XPath résolu, c'était bien l'espace de nommage (très mal déclaré, on va dire ^^" )

EDIT : Décidément... Dernier problème résolu. J'ai considéré à tort que la partie Node de l'élément Document se referait à la Node feed, ce qui n'était semble-il pas le cas.

Merci beaucoup pour m'avoir aguillé sur la bonne voie ^^

Modifié par Tchyo

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...