7
votes

simpplexml_load_file ne fonctionne pas

J'ai ce morceau de code ci-dessous qui fonctionne correctement sur mon serveur hébergé distant, mais n'est pas une raison pour une raison quelconque de ma machine Linux locale. Ive essayé à l'aide de fichiers_get_contents aussi pour obtenir le service réel, mais il renvoie également false.

Est-ce que quelqu'un sait pourquoi cela se produit? P>

Merci :) P>

$xml_data = simplexml_load_file("****");

if ($xml == FALSE)
{
  echo "Failed loading XML\n";

  foreach (libxml_get_errors() as $error) 
  {
    echo "\t", $error->message;
  }   
} 


2 commentaires

Pouvez-vous faire quelque chose comme file_get_contents ("http://www.example.com"); pour vérifier que vous pouvez appeler n'importe quel fichier distant?


10 années! et personne n'a remarqué que si ($ xml_data == faux) et non comme ci-dessus ... :-)


6 Réponses :


6
votes

Assurez-vous de disposer de allaite_url_fopen activé dans votre php.ini

http://php.net/manual/filesystem.configuration.php < / p>


1 commentaires

@Mark bizarre. Je ne penserais pas qu'ils dépendraient directement les uns sur les autres.



11
votes

Vous obtenez cette erreur car l'accès à distance est désactivé sur votre serveur. Une alternative à ceci utilise CURL.

Utilisez mon code ci-dessous pour utiliser CURL: P>

function produce_XML_object_tree($raw_XML) {
    libxml_use_internal_errors(true);
    try {
        $xmlTree = new SimpleXMLElement($raw_XML);
    } catch (Exception $e) {
        // Something went wrong.
        $error_message = 'SimpleXMLElement threw an exception.';
        foreach(libxml_get_errors() as $error_line) {
            $error_message .= "\t" . $error_line->message;
        }
        trigger_error($error_message);
        return false;
    }
    return $xmlTree;
}

$xml_feed_url = '******';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $xml_feed_url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$xml = curl_exec($ch);
curl_close($ch);

$cont = produce_XML_object_tree($xml);


1 commentaires

Fonctionne comme un charme! Merci! :)



1
votes

Utilisez comme celui-ci

$xml = simplexml_load_file('http://localhost/test/123.xml');

foreach ($xml->children() as $child) {
    $remoteCount[$child->getName()] = $child;

}
var_dump($remoteCount);


0 commentaires

1
votes

Modifier: si ($ xml == false) à si ($ xml === false) ( source ).


0 commentaires

3
votes

Eh bien, j'ai eu le même problème et même si je voudrais poster cela pour aider quiconque peut n'avoir pas encore essayé cette solution.

J'ai eu un script PHP qui a fonctionné bien localement, mais lorsque vous l'utilisez sur un serveur client exécutant Plesk, il ne fonctionnerait pas et échoué lorsque vous essayez de saisir le fichier XML externe. P>

J'essayais de faire référence un fichier XML externe d'un script PHP. Le serveur que j'utilisais était en cours d'exécution. Avant d'envisager de changer d'hôte, tout ce que je faisais simplement a été mis à jour les paramètres de PHP sur le serveur pour exécuter en tant que module Apache au lieu de FastCGI. P>

message d'erreur que je recevais (exemple): P> Avertissement: simpplexml_load_file (URL) [Fonction.SIMPlexML-Load-File]: Échec de l'ouverture du flux: Autorisation refusée p>

Ceci résolue le problème dans mon cas. P>

J'ai utilisé suivi Rapports Paramètres dans le script PHP: P>

assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_BAIL, 1);
assert_options(ASSERT_QUIET_EVAL, 1);
error_reporting(E_ALL);
ini_set('display_errors', 1);


0 commentaires

0
votes

J'ai eu le même problème que c'est juste un point non déclaré stupide dans le format de fichier simppexml

doit avoir une étiquette de conteneur, vous devez donc simplement mettre une balise parent contenant tout votre données telles que ceci: xxx


0 commentaires