Obtenir cdata contenu lors de l'analyse du fichier xml
J'ai un fichier xml
<?xml version="1.0" encoding="utf-8"?>
<xml>
<events date="01-10-2009" color="0x99CC00" selected="true">
<event>
<title>You can use HTML and CSS</title>
<description><![CDATA[This is the description ]]></description>
</event>
</events>
</xml>
J'ai utilisé xpath et et xquery pour parser le xml.
$xml_str = file_get_contents('xmlfile');
$xml = simplexml_load_string($xml_str);
if(!empty($xml))
{
$nodes = $xml->xpath('//xml/events');
}
j'obtiens le titre correctement, mais iam de ne pas obtenir de description.Comment je peux obtenir des données à l'intérieur
la cdata
OriginalL'auteur Warrior | 2010-09-06
Vous devez vous connecter pour publier un commentaire.
SimpleXML a un peu d'un problème avec CDATA, afin de l'utiliser:
Cela vous donnera:
Faux! SimpleXML n'a aucun problème avec CDATA, et c'est un mythe tenace qui ne devrait pas être perpétué. C'est seulement
print_r
qui ne peut pas voir la CDATA, parce que SimpleXML ne pas stocker ses données comme un "vrai" PHP objet, il tousse tout sur demande.OriginalL'auteur ocodo
Vous êtes probablement induit en erreur en pensant que la CDATA est manquant en utilisant
print_r
ou de l'un de l'autre "normal" PHP les fonctions de débogage. Ils ne peuvent pas voir le contenu complet d'un objet SimpleXML, comme il n'est pas un "vrai" objet PHP.Si vous exécutez
echo $nodes[0]->Description
, vous trouverez votre CDATA sort fine. Ce qui se passe est que PHP sait queecho
s'attend à une chaîne, ce qui demande SimpleXML pour l'un; SimpleXML répond avec tous la chaîne de contenu, y compris CDATA.Pour obtenir à la chaîne complète de contenu de manière fiable, il suffit de dire à PHP que ce que vous voulez est une chaîne de caractères à l'aide de la
(string)
opérateur de cast, par exemple$description = (string)$nodes[0]->Description
.Pour déboguer SimpleXML objets et de ne pas se laisser berner par des bizarreries comme cela, utilisez un débogage fonction telle que l'un de ces: https://github.com/IMSoP/simplexml_debug
OriginalL'auteur IMSoP
Cela pourrait aussi être une autre option viable, ce qui permettrait de supprimer le code et rendre la vie un peu plus facile.
OriginalL'auteur vr_driver