2010-12-29 11 views

risposta

62

Utilizzare libxml_use_internal_errors() per eliminare tutti gli errori XML e libxml_get_errors () per iterare su di loro in seguito.

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

Close to perfect ... sarebbe solo aggiungere che la funzione display_xml_error è semplicemente una funzione personalizzata per l'output degli errori in un modo carino , può essere trovato qui http://php.net/manual/en/function.libxml-get-errors.php. All'inizio ho pensato che fosse una funzione interna che mi mancava. – Carlton

+3

Fai attenzione con 'if (! $ Doc)'! PHP considera, per esempio, un documento con namespace come vuoto e quindi '! $ Doc === TRUE'. – David

+0

Mi sono imbattuto nel problema come menzionato da @David, ho dovuto verificare esplicitamente 'if ($ doc! == FALSE)' invece di solo 'if ($ doc)' che normalmente sarebbe sufficiente. – Samsquanch

13

Dal documentation:

Trattare con errori XML durante il caricamento di documenti è un compito molto semplice. Utilizzando la funzionalità libxml è possibile sopprimere tutti gli errori XML durante il caricamento del documento e quindi scorrere gli errori.

L'oggetto libXMLError, restituito da libxml_get_errors(), contiene diverse proprietà tra cui la (posizione) message, line e column dell'errore.

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; 
    } 
} 

Riferimento: libxml_use_internal_errors

6

provare questo

//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 domanda ha chiesto specificamente una soluzione che non sopprima gli errori (usando '@'). – GenericJon

1

Ecco un piccolo pezzo di classe che ho scritto qualche tempo fa:

/** 
* 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); 
    } 
} 

Funziona bene con i flussi e vfsStream come noi ll a scopo di test.

+0

controllo aggiunto per evitare l'errore 'DOMDocument :: loadXML(): stringa vuota fornita come input' –

4

La mia versione di simile:

//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); 
} 

Test:

//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')); 
Problemi correlati