2010-11-09 12 views
6

Mam skrypt, który analizuje niektóre elementy XML (adf). Czasami otrzymujemy uszkodzone dane XML (np. Składnia, brak tagu końcowego itp.).PHP Łapanie błędu parowania SimpleXMLElement

SimpleXMLElement rzuca błąd i zabija mój skrypt, jak przypisać coś takiego jak $xml_body = new SimpleXMLElement ($adf_xml); i przechwycić wyjątek parsowania?


Uncaught wyjątek 'Wyjątek' z wiadomości 'String nie można przeanalizować jako XML' w /home//Work//script/email_leads.php:46
ślad stosu:
0/home //Work//script/email_leads.php(46): SimpleXMLElement -> __ construct ('<? Xml version = "...')
1 /home//Work//script/email_leads.php(97): generateFeed()
2 {główny}

+0

Czy jesteś pewien, że używanie SimpleXML jest tym czego szukasz? Jeśli spodziewasz się, że dane nie są dobrze profilowane, nie powinieneś z pewnością korzystać z draconowskiego xml, ale zamiast tego użyj parsera DOM. – NikiC

+0

to jest chron'd skrypt, który pobiera dane wejściowe z INBOX (imap) ... –

+0

możliwy duplikat [php: catch wyjątek i kontynuować wykonywanie, czy to możliwe?] (Http://stackoverflow.com/questions/2132759/php-catch-exception-and-continue-execution-is-it-possible) – hakre

Odpowiedz

4
libxml_use_internal_errors(true); 
+0

libxml_use_internal_errors wyczyści trochę logi błędów, mój skrypt dalej umrze, gdy zgłasza błąd Parse ... Dzięki za pomoc/napiwek tho :) –

+0

Raz zagłosowałem za najlepszą głosowaną odpowiedzią, jednak myślę, że lepiej jest stłumić błąd za pomocą funkcji wspomnianej tutaj. Używasz libxml_get_errors lub libxml_get_last_error, aby dowiedzieć się, co się dzieje. – cwhsu

11

Ok, więc najwyraźniej połowu błędy składni XML jest czymś w rodzaju Świętego Graala ... skończyło się tylko

try { $x = new SimpleXMLElement($y); } catch (Exception $e) { echo $e; } 
+4

try/catch nie działa z SimpleXMLElement. Lub przynajmniej nie do załadowania pliku non-xml dla mnie. – Jake

+3

Znalazłem, że to nie działa również dla mnie. Musiałem użyć: $ x = new \ SimpleXMLElement ($ xmlString, LIBXML_NOERROR); Wydaje mi się, że daje mi to chwytliwy Wyjątek. Więcej informacji można znaleźć w podręczniku PHP dla [LIBXML_NOERROR] (http://php.net/manual/en/libxml.constants.php) – PanPipes

0

xml_parse zwraca wartość logiczną wskazującą, czy XML został przetworzony pomyślnie. Dlatego powinno to zadziałać:

$fp = fopen($xml_file, "r"); 
$xml_data = fread($fp, 80000); 

if(!(xml_parse($xml_parser, $xml_data, feof($fp)))){ 
    # do something 
} 
Powiązane problemy