2011-06-30 9 views
5

Mam poniższy fragment kodu, który działa poprawnie na moim serwerze zdalnym, ale nie działa z mojego lokalnego komputera z Linuksem. Ive starał się za pomocą file_get_contents również uzyskać spokojny usługi, ale również zwraca wartość false.simplexml_load_file nie działa

Czy ktoś wie Dlaczego tak się dzieje?

dzięki :)

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

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

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

Czy możesz zrobić coś takiego jak 'file_get_contents (" http://www.example.com ");" w celu sprawdzenia, czy można wywołać dowolny zdalny plik? –

Odpowiedz

4

Upewnij się, że allow_url_fopen włączona w swojej php.ini

http://php.net/manual/filesystem.configuration.php

+0

cześć tam ... jego Na – Mark

+0

hmm ustawiłem allow_url_include = Włączono i zadziałało ... – Mark

+1

@Mark Weird. Nie sądzę, że będą od siebie bezpośrednio zależne. –

10

Otrzymujesz ten błąd, ponieważ zdalny dostęp do plików została wyłączona na serwerze. Alternatywą dla tego jest użycie CURL.

Użyj mojego kodu poniżej, aby korzystać Zwijanie:

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

Teraz użyj $cont jako przedmiot dostęp do różnych węzłów w xml.

+0

Działa jak urok! Dzięki! :) –

+0

Świetne !! Tak trzymaj. –

1

wykorzystanie takich jak ten

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

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

} 
var_dump($remoteCount); 
3

Cóż, miałem ten sam problem i chciałem napisać to, aby pomóc każdemu, kto może jeszcze nie wypróbował tego rozwiązania.

Miałem skrypt PHP, który działał dobrze lokalnie, ale podczas używania go na serwerze klienta działającym w trybie plesk nie działałby i nie działał, próbując pobrać zewnętrzny plik xml.

Próbowałem odwołać się do zewnętrznego pliku xml ze skryptu php. Serwer, z którego korzystałem, działał w trybie plesk. Przed rozważeniem zmiany hosta, po prostu zaktualizowałem ustawienia PHP na serwerze, aby działał jako moduł Apache zamiast FastCGI.

wiadomość

błąd którą otrzymywał (przykład):

Ostrzeżenie: simplexml_load_file (URL) [function.simplexml-load-file]: failed to open stream: Permission denied

Ten problem został rozwiązany w mój przypadek.

Użyłem następujących ustawień raportów w skrypcie PHP:

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

miałem ten sam problem, to tylko głupi punkt nierejestrowana w SimpleXML

format pliku xml powinien mieć znacznik kontenera , więc musisz umieścić znacznik nadrzędny zawierający wszystkie twoje dane:

<?xml version="1.0"> 
<data> 
    ...all your file content here... 
</data>