simplexml_load_file et méthode attributes()

Eléphanteau du PHP | 19 Messages

06 mars 2007, 17:20

Bonjour,
j'utilise actuellement simplexml_load_file pour récupérer des informations depuis un fichier xml. Les informations qui m'intéressent se présentent sous la forme :

Code : Tout sélectionner

<item> <!-- divers éléments //--> <enclosure url="http://www.example.com/image1.jpg" type="image/jpeg" length="1965"></enclosure> </item>
Or parfois, les attributs de enclore ne sont pas définis ou meme enclosure est purement absent. J'essaye de me limiter aux éléments dont enclore est présent et définit... Pour cela, j'utilise la méthode attributes() avec un controle du type

Code : Tout sélectionner

$a = $item->attributes(); if (!empty($a[url']) && $f = file($a[url'])) {/* action */}
Mais cette méthode me produit une erreur 'Warning: main() [function.main]: Node no longer exists in /var/www/actu.php on line 11'. Existe-t-il une méthode pour controler les attributs d'une balise?

Merci.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

06 mars 2007, 19:07

Je ne suis pas sûr de tout comprendre, tu as des données XML sous la forme

Code : Tout sélectionner

<item> <enclosure url="..." /> </item <item> <!-- no enclosure --> </item>
...et tu ne veux récupérer que les nœuds "item" qui possèdent un descendant "enclosure" c'est ça ?

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

06 mars 2007, 19:18

Je viens de faire un test rapide, une fois de plus XPath nous rend les choses extrêmement simples.
$xml = simplexml_load_string('<root>
	<item id="1">
	   <enclosure url="..." />
	</item>
	<item id="2">
	   <enclosure />
	</item>
	<item id="3">
	   <!-- no enclosure -->
	</item>
</root>');

foreach ($xml->xpath('item[enclosure/@url]') as $item)
{
	echo $item['id'], "\n";
}
Donc si je ne me trompe pas, item[enclosure] renverra tous les nœuds "item" qui possèdent un descendant "enclosure" et item[enclosure/@url] fait la même chose à condition que le "enclosure" ait un attribut "url".

PS: pour les attributs, j'utilise les indices de tableaux (merci SimpleXML).