2009-06-18 7 views
1

Je suis nouveau sur xpath et je rencontre des problèmes avec l'ancienne implémentation XPath de PHP. Est-il exact que //@url est simplement la forme abrégée de //attribute::url? Je suis en train d'interroger le flickr rss pour les tests, mais la requête abrégée trouve les noeuds corrects, alors que celui verbeux retourne 0 éléments:Sélection de la valeur de l'attribut avec le chemin xpath de PHP

$xml = file_get_contents('http://api.flickr.com/services/feeds/geo/?format=rss_200'); 
$doc = new DOMDocument(); 
$doc->loadXML($xml); 
$xpath = new DOMXPath($doc); 
$xpath->query('//media:content/@url')->length > 0; 
$xpath->query('//media:content/attribute::url')->length == 0; 

Est-ce que je méprendre sur le w3c specs ou est-ce un bug PHP?

question connexe:

La requête réussie retourne DOMAttr objets comme prévu. Mais n'y a-t-il aucun moyen d'obtenir la valeur textuelle de ces nœuds directement? Quelque chose comme //media:content/attribute::url/child::text()? J'en aurais besoin pour un outil où les requêtes xpath seront entrées par les utilisateurs et la détection d'erreur serait bien meilleure si je pouvais attendre des objets DOMText (au lieu de coder pour une multitude d'objets DOM *).

Répondre

4

semble que vous avez probablement atterri sur un bug là-bas. Cela me semble 100% bon.

en ce qui concerne votre question connexe, utilisez evaluate au lieu de la requête pour obtenir PHP pour essayer de retourner un résultat tapé. si elle échoue, elle renvoie la nodelist normale

Edit:

Avez-vous essayé d'ajouter un namespace? les médias: une partie pourrait être lancer pour une boucle. par exemple.

$xpath->registerNamespace('media', "http://search.yahoo.com/mrss/"); 

Edit 2: juste pour la référence, j'ai essayé aussi cela en javascript en utilisant les éléments suivants

function nsResolve() { 
    return "http://search.yahoo.com/mrss/" 
} 

document.evaluate("//media:content/attribute::url",document,nsResolve,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null); 

et il fonctionne de la même que l'utilisation @url (actuellement 7 résultats)

+0

Thx, mais l'utilisation de evaluate() n'a pas aidé. J'ai essayé d'ajouter l'espace de noms, aussi - pas de succès. Je ne sais pas avec certitude, mais je pense que les espaces de noms sont extraits du document par PHP, de toute façon. – soulmerge

+0

dans ce cas, allez avec la forme abrégée. J'ai tendance à préférer le format verbeux dans de nombreux cas (descendant ou soi par exemple) mais je ne peux pas dire que j'ai essayé d'utiliser l'attribut verbeux :: axe –

+0

Merci beaucoup de l'avoir testé :) – soulmerge

0

Est-ce //*@url travail?

Questions connexes