2011-08-16 16 views
9

estoy ir a buscar los archivos XML de un servidor y, a veces estoy un archivos XML no válidos, debido a esto que estoy recibiendo una advertencia:Evitar advertencias XML DOMDocument en php

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

¿Cómo puede ¿Capté esta advertencia y eliminé el archivo?

+0

posible duplicado de [try y catch a warning] (http://stackoverflow.com/questions/1241728/try-and-catch-a-warning) (Para una respuesta más amplia) –

Respuesta

34

Tiene dos opciones. Utilice el operador de control de errores @ en su llamada load(), p. @$dom->load(), que es algo lento porque cambia globalmente el valor de display_errors a off, ejecuta la función y la vuelve a activar.

La otra opción, que yo personalmente prefiero (odio el operador @, no puedo soportar ver que en mi código) es salvar el antiguo valor de libxml_use_internal_errors, habilitarlo mediante libxml_use_internal_errors(TRUE), llamar a la función, clara los errores almacenan y restauran el valor anterior. He aquí un fragmento de mi código que hace que:

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

que no puedo comentar sobre respuestas, así que voy a escribir aquí:

  • solución Michael hace que sea menos estricta, pero es ll seguir emitiendo advertencias de algunos de los errores:
 
[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 
  • no hacen lo que sugiere Fran Verona - a nivel mundial deshabilitar repor de error ting es algo que nunca debes hacer. En producción, configure su propio controlador de errores y muestre un mensaje más bonito al usuario, y asegúrese de que el error esté registrado en algún lugar, pero nunca lo desactive por completo. Si se establece error_reporting en 0, PHP también deshabilitará el registro de errores.
  • La solución Xeon06 es problemática porque está aplicando todo el controlador de errores de script para una pieza específica de código. El uso de su propio controlador de errores que simplemente ignora el error causa los mismos problemas que la solución de Fran.
2

Desactivar estricta comprobación de errores:

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

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

¿Cómo puedo saber? si el xml es válido o no? Si recibo esta advertencia, quiero eliminar el archivo y volver a descargarlo ... –

+0

@iUngi Consulte la adición anterior 'DOMDocument :: validate()' –

3

Uso set_error_handler.

set_error_handler("yourHandler", E_WARNING); 
+2

y use restore_error_handler() después de la validación del archivo XML. –

+0

De hecho, y gracias por la edición, estoy acostumbrado a escribir funciones de JS :) –