2011-08-16 16 views
9

ja ściągam pliki xml z serwera, a czasem dostaję nieważnej pliki xml, ze względu na to dostaję ostrzeżenie:Unikaj domDocument ostrzeżeń XML w PHP

Warning: DOMDocument::load() [domdocument.load]: Start tag expected, '<' not found in 

Jak można Łapię to ostrzeżenie i usuwam plik?

+0

prawdopodobny duplikat [spróbuj i złap ostrzeżenie] (http://stackoverflow.com/questions/1241728/try-and-catch-a-warning) (Aby uzyskać szerszą odpowiedź) –

Odpowiedz

34

Masz dwie możliwości. Użyj operatora kontroli błędu @ w rozmowie load(), np. @$dom->load(), który jest nieco powolny, ponieważ globalnie zmienia wartość display_errors na off, wykonuje funkcję i ustawia ją z powrotem na.

Innym rozwiązaniem, które ja osobiście wolę (nienawidzę operatora @, nie mogę znieść, aby zobaczyć go w moim kodu) znajduje się uratować starą wartość libxml_use_internal_errors, włącz ją za pomocą libxml_use_internal_errors(TRUE) wywołać funkcję, jasny bufor błędów i przywrócić starą wartość. Oto fragment z mojego kodu, który robi:

<?php 
$previous_value = libxml_use_internal_errors(TRUE); 
$doc->loadHTML((string)$e->response->getBody()); 
libxml_clear_errors(); 
libxml_use_internal_errors($previous_value); 

nie mogę wypowiedzieć się na temat odpowiedzi, więc będę pisać tutaj:

  • rozwiązanie Michael sprawia, że ​​mniej surowe, ale to ll nadal wydawać ostrzeżenia dla niektórych błędów:
 
[email protected]:~$ php -r '$dom=new DOMDocument; $dom->strictErrorChecking = FALSE ; $dom->loadHTML("<xy></zx>");' 
PHP Warning: DOMDocument::loadHTML(): Tag xy invalid in Entity, line: 1 in Command line code on line 1 
  • Nie rób co Fran Verona zasugerował - globalnie wyłączyć błędzie repor Ting to coś, czego nigdy nie powinieneś robić. W trakcie produkcji ustaw własną procedurę obsługi błędów i wyświetl użytkownikowi ładniejszą wiadomość, a następnie upewnij się, że błąd jest gdzieś zalogowany - ale nigdy nie wyłączaj go całkowicie. Ustawienie parametru error_reporting na 0 spowoduje, że PHP będzie również wyłączać rejestrowanie błędów.
  • Rozwiązanie Xeon06 jest problematyczne, ponieważ cały proces obsługi błędów skryptu jest wykonywany dla określonego fragmentu kodu. Używanie własnego programu obsługi błędów, który po prostu ignoruje błąd, powoduje takie same problemy, jak rozwiązanie Fran.
2

Wyłącz ścisłą kontrolę błędzie:

$dom = new DOMDocument(); 
$dom->strictErrorChecking = FALSE ; 

$dom->load('/path/to/file.xml'); 
if (!$dom->validate()) { 
    // Invalid XML! 
} 
+0

Jak mogę się dowiedzieć pogoda xml jest ważna, czy nie? Jeśli otrzymuję to ostrzeżenie, chcę usunąć plik i pobrać ponownie ... –

+0

@iUngi Zobacz powyżej powyżej 'DOMDocument :: validate()' –

3

Korzystając set_error_handler.

set_error_handler("yourHandler", E_WARNING); 
+2

i użyj restore_error_handler() po sprawdzeniu poprawności pliku XML. –

+0

Rzeczywiście, i dzięki za edycję, jestem przyzwyczajony do pisania funkcji JS :) –

Powiązane problemy