2010-12-29 14 views

Respuesta

62

Use libxml_use_internal_errors() para suprimir todos los errores XML, y libxml_get_errors () para iterar sobre ellos luego.

Simple XML loading string

libxml_use_internal_errors(true); 

$doc = simplexml_load_string($xmlstr); 
$xml = explode("\n", $xmlstr); 

if (!$doc) { 
    $errors = libxml_get_errors(); 

    foreach ($errors as $error) { 
     echo display_xml_error($error, $xml); 
    } 

    libxml_clear_errors(); 
} 
+4

Cerca de perfeccionar ... acaba de añadir que la función display_xml_error es simplemente una función personalizada para dar salida a los errores de una manera agradable , se puede encontrar aquí http://php.net/manual/en/function.libxml-get-errors.php. Al principio pensé que era una función interna que me estaba perdiendo. – Carlton

+3

Tenga cuidado con 'if (! $ Doc)'! PHP considera por ejemplo un documento de espacio de nombres como vacío y, por lo tanto, '! $ Doc === TRUE'. – David

+0

Me encontré con el problema como @David mencionó, tuve que comprobar explícitamente 'if ($ doc! == FALSE)' en lugar de simplemente 'if ($ doc)' que normalmente sería suficiente. – Samsquanch

13

Desde el documentation:

Tratar con errores XML cuando la carga de documentos es una tarea muy sencilla. Con la funcionalidad libxml es posible suprimir todos los errores XML al cargar el documento y luego iterar sobre los errores.

El objeto libXMLError, devuelto por libxml_get_errors(), contiene varias propiedades, incluyendo la (posición) message, line y column del error.

libxml_use_internal_errors(true); 
$sxe = simplexml_load_string("<?xml version='1.0'><broken><xml></broken>"); 
if (!$sxe) { 
    echo "Failed loading XML\n"; 
    foreach(libxml_get_errors() as $error) { 
     echo "\t", $error->message; 
    } 
} 

Referencia: libxml_use_internal_errors

6

prueba este

//check if xml is valid document 
public function _isValidXML($xml) { 
    $doc = @simplexml_load_string($xml); 
    if ($doc) { 
     return true; //this is valid 
    } else { 
     return false; //this is not valid 
    } 
} 
+8

La pregunta específicamente solicitó una solución que no suprime los errores (usando '@'). – GenericJon

1

Aquí una pequeña porción de la clase que escribí hace un tiempo:

/** 
* Class XmlParser 
* @author Francesco Casula <[email protected]> 
*/ 
class XmlParser 
{ 
    /** 
    * @param string $xmlFilename Path to the XML file 
    * @param string $version 1.0 
    * @param string $encoding utf-8 
    * @return bool 
    */ 
    public function isXMLFileValid($xmlFilename, $version = '1.0', $encoding = 'utf-8') 
    { 
     $xmlContent = file_get_contents($xmlFilename); 
     return $this->isXMLContentValid($xmlContent, $version, $encoding); 
    } 

    /** 
    * @param string $xmlContent A well-formed XML string 
    * @param string $version 1.0 
    * @param string $encoding utf-8 
    * @return bool 
    */ 
    public function isXMLContentValid($xmlContent, $version = '1.0', $encoding = 'utf-8') 
    { 
     if (trim($xmlContent) == '') { 
      return false; 
     } 

     libxml_use_internal_errors(true); 

     $doc = new DOMDocument($version, $encoding); 
     $doc->loadXML($xmlContent); 

     $errors = libxml_get_errors(); 
     libxml_clear_errors(); 

     return empty($errors); 
    } 
} 

Funciona bien con las corrientes y vfsStream mientras ll para fines de prueba.

+0

comprobación adicional para evitar el error 'DOMDocument :: loadXML(): cadena vacía proporcionada como entrada' –

4

Mi versión de esta manera:

//validate only XML. HTML will be ignored. 

function isValidXml($content) 
{ 
    $content = trim($content); 
    if (empty($content)) { 
     return false; 
    } 
    //html go to hell! 
    if (stripos($content, '<!DOCTYPE html>') !== false) { 
     return false; 
    } 

    libxml_use_internal_errors(true); 
    simplexml_load_string($content); 
    $errors = libxml_get_errors();   
    libxml_clear_errors(); 

    return empty($errors); 
} 

Pruebas:

//false 
var_dump(isValidXml('<!DOCTYPE html><html><body></body></html>')); 
//true 
var_dump(isValidXml('<?xml version="1.0" standalone="yes"?><root></root>')); 
//false 
var_dump(isValidXml(null)); 
//false 
var_dump(isValidXml(1)); 
//false 
var_dump(isValidXml(false)); 
//false 
var_dump(isValidXml('asdasds')); 
Cuestiones relacionadas