Je lis un xml en php en utilisant simplexml_load_file
. Cependant, en essayant de charger le xml, il affiche une liste d'avertissements
Warning: simplexml_load_file() [function.simplexml-load-file]: <project orderno="6" campaign_name="International Relief & Development" project in /home/bluecard1/public_html/test.php on line 3
Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /home/bluecard1/public_html/test.php on line 3
Warning: simplexml_load_file() [function.simplexml-load-file]: http://..../index.php/site/projects/:15: parser error : xmlParseEntityRef: no name in /home/bluecard1/public_html/test.php on line 3
Warning: simplexml_load_file() [function.simplexml-load-file]: ional Relief & Development" project_id="313" client_name="International Relief & in /home/bluecard1/public_html/test.php on line 3
Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in /home/bluecard1/public_html/test.php on line 3
Warning: simplexml_load_file() [function.simplexml-load-file]: http://..../index.php/site/projects/:15: parser error : xmlParseEntityRef: no name in /home/bluecard1/public_html/test.php on line 3
Comment rectifier pour supprimer ces avertissements?
(XML est généré à partir de l'url http://..../index.php/site/projects
et chargé dans une variable dans le test.php. Je n'ai pas d'écriture de privilèges dans index.php)
@
devantsimplexml_load_file
ou en ajoutant un drapeau, voir la page de manuel desimplexml_load_file
pour plus d'informations et veuillez supprimer votre question, c'est un doublon.Réponses:
Le XML est très probablement invalide.
Le problème pourrait être le "&"
$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $text);
se débarrassera du "&" et le remplacera par sa version de code HTML ... essayez-le.
la source
$text=preg_replace('/&(?!#?[a-z0-9]+;)/g', '&', $text);
Trouvé ceci ici ...
la source
Essayez d'abord de nettoyer le HTML en utilisant cette fonction:
$html = htmlspecialchars($html);
Les caractères spéciaux sont généralement représentés différemment en HTML et cela peut être déroutant pour le compilateur. Comme
&
devient&
.la source
htmlspecialchars()
est la fonction précise pour convertir les&, ", <, >
caractères dans les données d'élément.htmlspecialchars()
et de ne pas casser XML. J'ai essayé quelques drapeaux et mon XML était toujours en panne.htmlspecialchars
sur le contenu d'une balise xml, pas sur l'ensemble du XMLJ'utilise une version combinée:
strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&",$textorhtml))
la source
simplexml_load_file
génère une erreur d'analyseparser error : xmlParseEntityRef
lors de la tentative de chargement du fichier XML à partir d'une URL.&
valeur au lieu de&
. Il est tout à fait possible qu'il y ait d'autres erreurs qui ne sont pas évidentes à ce stade.simplexml_load_file
fonction PHP , mais il semble que nous n'avons aucun contrôle sur la façon dont le XML est créé.simplexml_load_file
le traitement d'un fichier XML non valide. Cela ne nous laisse pas beaucoup d'options, à part la correction du fichier XML lui-même.Convertissez le XML non valide en XML valide. Cela peut être fait en utilisant
PHP tidy extension
. Des instructions supplémentaires peuvent être trouvées sur http://php.net/manual/en/book.tidy.phpUne fois que vous êtes sûr que l'extension existe ou est installée, procédez comme suit.
/** * As per the question asked, the URL is loaded into a variable first, * which we can assume to be $xml */ $xml = <<<XML <?xml version="1.0" encoding="UTF-8"?> <project orderno="6" campaign_name="International Relief & Development for under developed nations"> <invalid-data>Some other data containing & in it</invalid-data> <unclosed-tag> </project> XML; /** * Whenever we use tidy it is best to pass some configuration options * similar to $tidyConfig. In this particular case we are making sure that * tidy understands that our input and output is XML. */ $tidyConfig = array ( 'indent' => true, 'input-xml' => true, 'output-xml' => true, 'wrap' => 200 ); /** * Now we can use tidy to parse the string and then repair it. */ $tidy = new tidy; $tidy->parseString($xml, $tidyConfig, 'utf8'); $tidy->cleanRepair(); /** * If we try to output the repaired XML string by echoing $tidy it should look like. <?xml version="1.0" encoding="utf-8"?> <project orderno="6" campaign_name="International Relief & Development for under developed nations"> <invalid-data>Some other data containing & in it</invalid-data> <unclosed-tag></unclosed-tag> </project> * As you can see that & is now fixed in campaign_name attribute * and also with-in invalid-data element. You can also see that the * <unclosed-tag> which didn't had a close tag, has been fixed too. */ echo $tidy; /** * Now when we try to use simplexml_load_string to load the clean XML. When we * try to print_r it should look something like below. SimpleXMLElement Object ( [@attributes] => Array ( [orderno] => 6 [campaign_name] => International Relief & Development for under developed nations ) [invalid-data] => Some other data containing & in it [unclosed-tag] => SimpleXMLElement Object ( ) ) */ $simpleXmlElement = simplexml_load_string($tidy); print_r($simpleXmlElement);
Le développeur doit essayer de comparer le XML invalide avec un XML valide (généré par tidy), pour voir qu'il n'y a pas d'effets secondaires indésirables après l'utilisation de tidy. Tidy fait un très bon travail de le faire correctement, mais cela ne fait jamais de mal de le voir visuellement et d'en être sûr à 100%. Dans notre cas, cela devrait être aussi simple que de comparer $ xml avec $ tidy.
la source
Le XML n'est pas valide.
CDATA doit être enveloppé autour de tous les caractères XML spéciaux, conformément au W3C
la source
Ceci est en effet en raison de personnages qui dérangent avec les données. L'utilisation a
htmlentities($yourText)
fonctionné pour moi (j'avais du code html dans le document xml). Voir http://uk3.php.net/htmlentities .la source
Cela résout mon problème:
$description = strip_tags($value['Description']); $description=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $description); $description= preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $description); $description=str_replace(' & ', ' & ', html_entity_decode((htmlspecialchars_decode($description))));
la source
Si vous rencontrez ce problème avec opencart, essayez de modifier
la source