J'ai un fichier XML
$xml_str = file_get_contents('xmlfile'); $xml = simplexml_load_string($xml_str); if(!empty($xml)) { $nodes = $xml->xpath('//xml/events'); }
3 Réponses :
SimplexML a un peu un problème avec CDATA, utilisez donc:
Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [date] => 01-10-2009 [color] => 0x99CC00 [selected] => true ) [event] => SimpleXMLElement Object ( [title] => You can use HTML and CSS [description] => This is the description ) ) )
Tort! SimplexML n'a aucun problème avec CDATA, ce qui est un mythe persistant qui ne doit pas être perpétué. Il est seulement print_r code> qui ne peut pas voir le CDATA, car SimplexML ne stocke pas réellement ses données comme objet PHP "réel", il tousse simplement la demande.
Vous êtes probablement en erreur de penser que le CDATA est manquant en utilisant Si vous exécutez Pour obtenir du contenu complet de la chaîne fiable, dites simplement à PHP que ce que vous voulez est une chaîne à l'aide de la Pour déboguer des objets SimplexML et ne pas être bapiné par des piqûres comme ceci, utilisez une fonction de débogage dédiée telle que l'une d'entre elles: https: // github .COM / IMSOP / SIMPLEXML_DEBUG P> print_r code> ou l'une des autres fonctions de débogage PHP "normales". Ceux-ci ne peuvent pas voir le contenu complet d'un objet SimplexML, car ce n'est pas un objet PHP "réel". P>
echo $ nœuds [0] -> Description code>, vous trouverez que votre CDATA sort bien. Ce qui se passe est que php sait que
echo code> attend une chaîne, alors demande à Simplexml pour un; SimplexML répond avec tout em> le contenu de la chaîne, y compris CDATA. P>
(chaîne) code> Opérateur de distribution, par exemple.
$ Description = (string) $ nœuds [0] -> Description code>. P>
Ceci pourrait également être une autre option viable, qui supprimerait ce code et rendrait la vie un peu plus facile.
$xml = str_replace("<![CDATA[", "", $xml); $xml = str_replace("]]>", "", $xml);