8
votes

Obtenir du contenu CDATA lors de l'analyse de fichier XML

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');
}


0 commentaires

3 Réponses :


9
votes

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 
                )

        )

)


1 commentaires

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 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.



9
votes

Vous êtes probablement en erreur de penser que le CDATA est manquant en utilisant print_r 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".

Si vous exécutez echo $ nœuds [0] -> Description , vous trouverez que votre CDATA sort bien. Ce qui se passe est que php sait que echo attend une chaîne, alors demande à Simplexml pour un; SimplexML répond avec tout le contenu de la chaîne, y compris CDATA.

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 (chaîne) Opérateur de distribution, par exemple. $ Description = (string) $ nœuds [0] -> Description .

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


0 commentaires

2
votes

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);


0 commentaires