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 puis-je rectifier pour supprimer ces avertissements?
(XML est généré à partir de l'URL http://..../index.php/site/projects
et chargé dans une variable du fichier test.php. Je n'ai pas de privilèges en écriture sur index.php)
Le XML est probablement invalide.
Le problème pourrait être le "&"
$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $text);
va se débarrasser du "&" et le remplacer par sa version HTML ... essayez-le.
Trouvé ceci ici ...
Problème: Un analyseur XML renvoie l'erreur “xmlParseEntityRef: noname”
Cause: Il y a un ‘&’ (caractère esperluette) dispersé quelque part dans le texte XML, par exemple. du texte et du texte supplémentaire
Solution:
- Solution 1: Retirez l'esperluette.
- Solution 2: Encodez l'esperluette (remplacez le caractère '&' par '& amp;'). N'oubliez pas de décoder lors de la lecture du fichier XML texte.
- Solution 3: Utilisez les sections CDATA (le texte à l'intérieur d'une section CDATA sera ignoré par l'analyseur.) <! [CDATA [un texte et un peu plus texte]]>
Remarque: ‘&’ ‘<''>‘ donnera tous des problèmes s’ils ne sont pas gérés correctement.
Essayez de nettoyer le HTML d'abord en utilisant cette fonction:
$html = htmlspecialchars($html);
Les caractères spéciaux sont généralement représentés différemment en HTML, ce qui peut prêter à confusion pour le compilateur. Comme &
devient &
.
J'utilise une version combinée:
strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&",$textorhtml))
PROBL&EGRAVE;ME
simplexml_load_file
génère une erreur d'analyse parser
error : xmlParseEntityRef
lors de la tentative de chargement du fichier XML à partir d'une URL.CAUSE
&
valeur Au lieu de &
. Il est fort possible qu'il existe d'autres erreurs qui ne sont pas évidentes à ce stade.Choses hors de notre contrôle
simplexml_load_file
, mais il semble que nous n’ayons aucun contrôle sur la manière dont le fichier XML est créé. simplexml_load_file
à traiter un fichier XML Invalide. Cela ne nous laisse pas beaucoup d'options, autres que Réparer le fichier XML lui-même.SOLUTION POSSIBLE
Convertir un XML invalide en XML valide. Cela peut être fait en utilisant PHP tidy extension
. Des instructions supplémentaires sont disponibles sur http://php.net/manual/fr/book.tidy.php
Une 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);
MISE EN GARDE
Le développeur doit essayer de comparer le code XML non valide à un fichier XML valide (généré par tidy), afin de s'assurer qu'il n'y a pas d'effets secondaires indésirables après l'utilisation de tidy. Tidy fait un très bon travail, mais il n'est jamais mauvais de le voir visuellement et d'être sûr à 100%. Dans notre cas, cela devrait être aussi simple que de comparer $ xml avec $ tidy.
Le XML n'est pas valide.
<![CDATA[
{INVALID XML}
]]>
CDATA doit être entouré de tous les caractères XML spéciaux, comme indiqué dans W3C
Cela est dû aux personnages qui manipulent les données. Utiliser htmlentities($yourText)
a fonctionné pour moi (j'avais le code HTML dans le document XML). Voir http://uk3.php.net/htmlentities .
Si vous rencontrez ce problème avec opencart, essayez de modifier
catalogue/contrôleur/extension/feed/google_sitemap.php Pour plus d'informations et comment le faire, reportez-vous à ceci: xmlparseentityref-no-name-error
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))));