Je lis un xml en php en utilisant simplexml_load_file
. Cependant, lors de la tentative de chargement du xml, il affiche une liste d'avertissements
Avertissement : simplexml_load_file() [function.simplexml-load-file]:
Je lis un xml en php en utilisant simplexml_load_file
. Cependant, lors de la tentative de chargement du xml, il affiche une liste d'avertissements
Avertissement : simplexml_load_file() [function.simplexml-load-file]:
La meilleure pratique lors de la manipulation de XML est de s'assurer qu'il n'y a pas de caractères conflictuels et de les remplacer avant l'analyse.
Found this ici ...
Problème: Un analyseur XML renvoie l'erreur "xmlParseEntityRef: noname"
Causes: Il y a un caractère '&' (esperluette) qui traîne quelque part dans le texte XML, par exemple. un peu de texte & un peu plus de texte
Solution:
- Solution 1: Supprimez l'esperluette.
- Solution 2: Encodez l'esperluette (c'est-à-dire remplacez le
&
par&
). N'oubliez pas de décoder lorsque vous lisez le texte XML.- Solution 3: Utilisez des sections CDATA (le texte à l'intérieur d'une section CDATA sera ignoré par l'analyseur.) par exemple.
Note: '&' '<' '>' poseront tous des problèmes s'ils ne sont pas gérés correctement.
Est-ce que nous savons pourquoi cela se produit? De plus, une section CDATA sera-t-elle tout de même détectée par un navigateur qui rendrait une partie de ces données? J'ai des balises HTML à l'intérieur de mes balises XML et j'ai besoin qu'elles soient affichées à l'utilisateur final pour un outil d'édition.
Quelqu'un peut expliquer pourquoi cela a été downvoté? htmlspecialchars()
est la fonction précise pour convertir les caractères &, ", <, >
dans les données de l'élément.
Cette réponse est moins bien notée car elle ne fonctionne pas correctement dans ce cas. L'utilisation de cette fonction va totalement casser votre XML en convertissant "<" en "<". Je ne connais aucune façon d'utiliser htmlspecialchars()
sans casser le XML. J'ai essayé quelques indicateurs et mon XML s'est tout de même cassé.
PROBLÈME
simplexml_load_file
lance une erreur d'analyse erreur d'analyse : xmlParseEntityRef
lors de la tentative de chargement du fichier XML à partir d'une URL.CAUSE
&
au lieu de &
. Il est tout à fait possible qu'il y ait d'autres erreurs qui ne soient 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 façon dont le XML est créé.simplexml_load_file
à traiter un fichier XML invalide. Cela ne nous laisse pas beaucoup d'options, à part corriger le fichier XML lui-même.SOLUTION POSSIBLE
Convertir un XML invalide en XML valide. Cela peut être fait en utilisant l'extension PHP tidy
. De plus amples instructions peuvent être trouvées sur http://php.net/manual/fr/book.tidy.php
Une fois que vous êtes sûr que l'extension existe ou est installée, veuillez faire ce qui suit.
/**
* Comme demandé dans la question, l'URL est d'abord chargée dans une variable,
* que l'on peut supposer être $xml
*/
$xml = <<
Some other data containing & in it
XML;
/**
* Chaque fois que nous utilisons tidy, il est préférable de transmettre certaines options de configuration
* similaires à $tidyConfig. Dans ce cas particulier, nous nous assurons que
* tidy comprend que notre entrée et notre sortie sont du XML.
*/
$tidyConfig = array (
'indent' => true,
'input-xml' => true,
'output-xml' => true,
'wrap' => 200
);
/**
* Maintenant, nous pouvons utiliser tidy pour analyser la chaîne et la réparer.
*/
$tidy = new tidy;
$tidy->parseString($xml, $tidyConfig, 'utf8');
$tidy->cleanRepair();
/**
* Si nous essayons de produire la chaîne XML réparée en imprimant $tidy, elle devrait ressembler à ceci.
Some other data containing & in it
* Comme vous pouvez le voir, le & est maintenant corrigé dans l'attribut campaign_name
* et aussi à l'intérieur de l'élément invalid-data. Vous pouvez également voir que le
* qui n'avait pas de balise de fermeture, a également été corrigé.
*/
echo $tidy;
/**
* Maintenant, lorsque nous essayons d'utiliser simplexml_load_string pour charger le XML nettoyé. Lorsque nous
* essayons de l'imprimer en utilisant print_r, cela devrait ressembler à quelque chose comme ci-dessous.
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);
ATTENTION
Le développeur devrait essayer de comparer le XML invalide avec un XML valide (généré par tidy), pour s'assurer qu'il n'y a pas d'effets secondaires après l'utilisation de tidy. Tidy fait un excellent travail pour le faire correctement, mais il 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.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Le XML est invalide. Vous ne pourrez peut-être pas le charger du tout. Les erreurs peuvent être supprimées en ajoutant
@
devantsimplexml_load_file
ou en ajoutant un drapeau, consultez la page manuel desimplexml_load_file
pour plus d'informations et veuillez supprimer votre question, c'est un doublon.0 votes
Je vois que ma réponse attire beaucoup d'attention, si c'est effectivement la solution : pouvez-vous s'il vous plaît la signaler comme "réponse correcte" ? Merci.