2011-08-28 10 views
5

Ho una funzione rapida per caricare una stringa XML e convalidarla su uno schema. Quando ha dato un XML ben formato, si comporta perfettamente.La convalida XML di PHP genera eccezioni irreversibili quando viene superato il codice XML errato

Tuttavia, quando metto a punto la sintassi xml, php genera un errore fatale e uccide lo script. Sto verificando il valore restituito dalla funzione loadXML e voglio un semplice true/false. Se xml è sporco, loadXML() non riuscirà e posso semplicemente restituire un errore di validazione. Ho provato a impostare un gestore di errori vuoto, ma continua a uccidere lo script.

Qualche idea? Devo eseguire il downgrade degli errori o qualcosa del genere?

codice incluso per riferimento (PHP):

function __maskerrors(){}; 

function ValidateImageXML($xml_string) 
{ 
    /* Parse XML data string into DOM object */ 
    $xdoc = new DomDocument; 

    /* Calculate schema location */ 
    $schema = dirname(realpath(__FILE__)); 
    $schema.= "/image-xml-schema.xsd"; 

    /* Mask any errors */ 
    set_error_handler('__maskerrors'); 

    /* Parse xml string, check for success */ 
    if($xdoc->loadXML($xml_string)) 
    { 
     /* Validate xml against schema */ 
     if($xdoc->schemaValidate($schema)) 
     { 
      /* Valid XML structure & valid against schema, return true */ 
      return true; 
     } 
     else 
     { 
      /* Valid XML structure, but invalid against schema. Return false */ 
      return false; 
     } 
    } 
    else 
    { 
     /* Invalid XML structure, return false */ 
     return false; 
    } 

    /* Stop masking errors */ 
    restore_error_handler(); 
} 
+0

Qual è il messaggio dell'errore fatale? – hakre

risposta

4

Prova con

libxml_use_internal_errors(true); 
$xdoc->loadXml($yourXml); 
libxml_clear_errors(); 
return $xdoc->schemaValidate($schema) 

Ciò disabilitare gli errori libxml e consentire all'utente di recuperare le informazioni di errore, se necessario (o cancellare)

Vedere http://.php.net/manual/en/book.libxml.php

+0

Funziona perfettamente, grazie – Oliver