web-dev-qa-db-fra.com

avertissements 'xmlParseEntityRef: no name' lors du chargement de XML dans un fichier php

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)

75
Rajat Gupta

Le XML est probablement invalide.

Le problème pourrait être le "&"

$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', $text);

va se débarrasser du "&" et le remplacer par sa version HTML ... essayez-le.

118
ricricucit

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.

59
King'ori Maina

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 &amp;.

8
Ufuk Özdemir

J'utilise une version combinée:

strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&amp;",$textorhtml))
6
Reign.85

PROBL&EGRAVE;ME

  • La fonction PHP 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

  • Le XML renvoyé par l'URL n'est pas un XML valide. Il contient & valeur Au lieu de &amp;. Il est fort possible qu'il existe d'autres erreurs qui ne sont pas évidentes à ce stade.

Choses hors de notre contrôle

  • Dans l’idéal, nous devons nous assurer qu’un fichier XML valide est alimenté dans la fonction PHP simplexml_load_file, mais il semble que nous n’ayons aucun contrôle sur la manière dont le fichier XML est créé. 
  • Il n'est également pas possible de forcer 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 &amp; Development for under developed nations">
      <invalid-data>Some other data containing &amp; 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. 

6
ksoni

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

6
Edwin Daniels

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 .

2
Guillaume

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

0

Cela résout mon problème:

$description = strip_tags($value['Description']);
$description=preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', $description);
$description= preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $description);
$description=str_replace(' & ', ' &amp; ', html_entity_decode((htmlspecialchars_decode($description))));
0
Malki Mohamed