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.
fonte
2015-05-05 16:39:40
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
Fai attenzione con 'if (! $ Doc)'! PHP considera, per esempio, un documento con namespace come vuoto e quindi '! $ Doc === TRUE'. – David
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