Avertissements 'xmlParseEntityRef: no name' lors du chargement de xml dans un fichier php


89

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/projectset chargé dans une variable dans le test.php. Je n'ai pas d'écriture de privilèges dans index.php)


Le XML n'est pas valide. Vous ne pourrez peut-être pas du tout le charger. Les erreurs peuvent être supprimées en ajoutant @devant simplexml_load_fileou en ajoutant un drapeau, voir la page de manuel de simplexml_load_filepour plus d'informations et veuillez supprimer votre question, c'est un doublon.
hakre le

Je peux voir que ma réponse suscite beaucoup d'attention, si c'est réellement la solution: pouvez-vous la signaler comme "bonne réponse"? Merci.
ricricucit

Réponses:


143

Le XML est très probablement invalide.

Le problème pourrait être le "&"

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

se débarrassera du "&" et le remplacera par sa version de code HTML ... essayez-le.


2
Merci. Tu as sauvé ma journée!
Saim

2
La meilleure pratique lorsque vous travaillez avec XML est de vous assurer qu'il n'y a pas de caractères en conflit et vous devez les remplacer avant parsin
Mr Megamind

2
merci, le point principal de cette question est que xml est invalide
yussan

Juste un petit ajout, si vous voulez remplacer toutes les esperluettes, ajoutez «g» à votre regex. La solution mise à jour ressemblerait à ceci: $text=preg_replace('/&(?!#?[a-z0-9]+;)/g', '&amp;', $text);
flaming.codes

81

Trouvé ceci ici ...

Problème: un analyseur XML renvoie l'erreur «xmlParseEntityRef: noname»

Cause: Il y a un «&» (caractère esperluette) errant quelque part dans le texte XML, par exemple. du texte et encore du texte

Solution:

  • Solution 1: supprimez l'esperluette.
  • Solution 2: encodez l'esperluette (c'est-à-dire remplacez le &caractère par &amp;). N'oubliez pas de décoder lors de la lecture du texte XML.
  • Solution 3: Utilisez des sections CDATA (le texte à l'intérieur d'une section CDATA sera ignoré par l'analyseur.) Par exemple. <! [CDATA [du texte et encore du texte]]>

Remarque: '&' '<' '>' donnera tous des problèmes s'il n'est pas géré correctement.


9
Cela m'a sauvé aujourd'hui.
Bwire

Savons-nous pourquoi c'est? En outre, une section CDATA sera-t-elle toujours captée par un navigateur qui rendrait certaines de ces données? J'ai des balises HTML dans mes balises XML et j'ai besoin qu'elles soient rendues à l'utilisateur final pour un outil d'édition.
sulimmesh

11

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


Quelqu'un peut-il expliquer pourquoi ce vote est défavorable? htmlspecialchars()est la fonction précise pour convertir les &, ", <, >caractères dans les données d'élément.
JacobRossDev

7
Cette réponse est rejetée car elle ne fonctionne pas bien dans ce cas. L'utilisation de cette fonction cassera totalement votre XML en convertissant "<" en "& lt;". Je ne connais aucun moyen d'utiliser htmlspecialchars()et de ne pas casser XML. J'ai essayé quelques drapeaux et mon XML était toujours en panne.
Alex Finnarn

1
Vous devriez utiliser htmlspecialcharssur le contenu d'une balise xml, pas sur l'ensemble du XML
gbalduzzi

7

J'utilise une version combinée:

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

1
Celui-ci fonctionne parfaitement. Vous
manquez

7

PROBLÈME

  • La fonction PHP simplexml_load_filegénère une erreur d'analyse parser error : xmlParseEntityReflors 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 de la &valeur au lieu de &amp;. Il est tout à fait possible qu'il y ait d'autres erreurs qui ne sont pas évidentes à ce stade.

LES CHOSES HORS DE NOTRE CONTRÔLE

  • Idéalement, nous devrions nous assurer qu'un XML valide alimente la simplexml_load_filefonction PHP , mais il semble que nous n'avons aucun contrôle sur la façon dont le XML est créé.
  • Il n'est pas non plus possible de forcer simplexml_load_filele traitement d'un fichier XML non valide. Cela ne nous laisse pas beaucoup d'options, à part la correction du fichier XML lui-même.

SOLUTION POSSIBLE

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


6

Le XML n'est pas valide.

<![CDATA[ 
{INVALID XML}
]]> 

CDATA doit être enveloppé autour de tous les caractères XML spéciaux, conformément au W3C


3

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 .


1

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.