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
<!-- MEMCACHE empty -->
<?xml version="1.0" ?>
<data>
<glop>TEST</glop>
<other>GLOP</other>
</data>
XML;
Vous pouvez utiliser ce :
$real_xml_string = str_replace("<!-- MEMCACHE empty -->\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("#<!-- MEMCACHE (\w+) -->\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.