0 votes

échapper aux erreurs simpleXML

 <!-- MEMCACHE empty -->

Ce qui précède cause maintenant des problèmes pour un script car il est maintenant placé en haut des fichiers XML auxquels j'essaie d'accéder à distance. simpleXML n'aime pas le fait que le fichier XML ne soit plus bien formé. J'ai essayé d'échapper les erreurs, mais cela ne semble pas fonctionner. Quelqu'un peut-il m'indiquer la voie à suivre pour résoudre ce problème ?

1voto

Pascal MARTIN Points 195780

Tant que le fichier XML n'est pas bien formé, SimpleXML ne le chargera pas... Vous devrez donc effectuer des opérations sur les chaînes de caractères de ce fichier XML avant de l'envoyer à SimpleXML.

Quelque chose d'assez simple, basé sur str_replace pourrait faire l'affaire, si ce "MEMCACHE empty" est toujours le même ; sinon, un regex fera probablement l'affaire ;-)

Donc :

  • récupérer le fichier distant dans une chaîne de caractères
  • supprimer la chose au début
  • donnez cette chaîne à simplexml_load_string

Peut-être que ce n'est pas vraiment "propre"... Mais ça devrait marcher, c'est rapide, et simple...

Par exemple, si votre non-XML ressemble à ceci :

$xml_string = <<<XML
&lt;!-- MEMCACHE empty --&gt;
<?xml version="1.0" ?>
<data>
    <glop>TEST</glop>
    <other>GLOP</other>
</data>
XML;

Vous pouvez utiliser ce :

$real_xml_string = str_replace("&lt;!-- MEMCACHE empty --&gt;\n", '', $xml_string);

Notez le " \n " à la fin : il faut supprimer le saut de ligne ;-)

Ce qui vous donne une chaîne contenant :

<?xml version="1.0" ?>
<data>
    <glop>TEST</glop>
    <other>GLOP</other>
</data>

Ce qui est un XML bien formé ; vous pouvez donc maintenant le charger :

$xml = simplexml_load_string($real_xml_string);
var_dump($xml);

Et vous obtenez ce que vous vouliez :

object(SimpleXMLElement)[1]
  public 'glop' => string 'TEST' (length=4)
  public 'other' => string 'GLOP' (length=4)

Si le "statut" dans le MEMCACHE n'est pas toujours "vide", vous pouvez utiliser une expression rationnelle ; quelque chose comme ceci, je suppose, pourrait faire l'affaire, à la place de l'option str_replace appeler :

$real_xml_string = preg_replace("#&lt;!-- MEMCACHE (\w+) --&gt;\n#", '', $xml_string);

(Peut être à adapter un peu, selon vos besoins)

Bien sûr, dans votre cas, $xml_string ne serait pas stocké dans le code source, mais obtenu via quelque chose comme curl ou file_get_contents Je suppose.

0voto

null Points 3159

Si c'est tout en haut du fichier comme

&lt;!-- MEMCACHE empty --&gt;
<?xml version="1.0" ?>
<root> ... </root>

Alors je pense que la meilleure chose à faire serait de preg_replace("/^&lt;!-- MEMCACHE empty --&gt;$/", "", $xml_file) il à vide o null .

C'est parce que <?xml version="1.0" ?> doit être la première ligne du fichier pour que ce soit un XML valide dans tous les cas, DOM, SAX, SimpleXML ou autre.

Prograide.com

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.

Powered by:

X